5618ssh复习2
本文最后由方少年更新于2025 年 11 月 13 日,已超过18天没有更新。如果文章内容或图片资源失效,请留言反馈,将会及时处理,谢谢!
下面先给一页超短“SSH 讲义”(围绕多跳、稳定性、访问控制与绑定地址等),然后给出 8 道全新单选题(不含答案),每题只有一个正确选项,题末留有【】以便填写。
SSH 讲义(要点速记)
流向与类型
-L 本地转发:本地监听 → 经 SSH → 从远端访问目标 host:port
flowchart LR subgraph Local["Host (your machine)"] A["App connect 127.0.0.1:Lport"] B["SSH client (listen Lport)"] end subgraph Remote["Remote/External (SSH server side)"] C["SSH server"] D["Target dst:dstport"] end A -->|"TCP to Lport"| B B -->|"SSH encrypted tunnel"| C C -->|"Plain TCP"| D D -.->|"Response"| C -.-> B -.-> A-R 远端转发:远端监听 → 经 SSH → 从本地访问目标 host:port
flowchart LR subgraph Local["Host (your machine)"] C["SSH client"] D["Target on local side"] end subgraph Remote["Remote/External (SSH server side)"] A["Visitor connect Rport"] B["SSH server (listen Rport)"] end A -->|"TCP to Rport"| B B -->|"SSH encrypted tunnel"| C C -->|"Plain TCP"| D D -.->|"Response"| C -.-> B -.-> A-D 动态转发:在本地开 SOCKS5 代理(多站点/多端口通用)
flowchart LR subgraph Local["Host (your machine)"] A["App/Browser via SOCKS5 127.0.0.1:Dport"] B["SSH client (SOCKS proxy)"] end subgraph Remote["Remote/External (SSH server side)"] C["SSH server"] T1["Target 1 host:port"] T2["Target 2 host:port"] end A -->|"SOCKS request (host:port)"| B B -->|"SSH encrypted tunnel"| C C -->|"Plain TCP (per request)"| T1 C -->|"Plain TCP (per request)"| T2 T1 -.->|"Response"| C -.-> B -.-> A T2 -.-> C
例子:
一、-L 本地端口转发:把远端/内网服务“带到你本地”
- 访问远端内网数据库
- 场景:db.internal:5432 只允许堡垒机 bastion 访问;你在本地开发需要连数据库。
- 命令:
ssh -L 127.0.0.1:5432:db.internal:5432 user@bastion -fN - 使用:本地客户端连 127.0.0.1:5432 即可。
- 流向:本地监听 → SSH 隧道 → 由远端去连 db.internal。
- 注意:Lport 默认仅本机可用;若要团队同事也用,加 -g 并设置防火墙。
- 安全地访问只开在远端内网的 Web 后台
- 场景:内网站点 http://intranet:80 只在公司网;你在家办公。
- 命令:
ssh -L 127.0.0.1:8080:intranet:80 user@vpn-gateway -fN - 使用:浏览器打开 http://127.0.0.1:8080。
- 优点:互联网段加密;不必在公网暴露后台。
- 连到 Kubernetes API/节点调试端口
- 命令:
ssh -L 127.0.0.1:6443:10.0.0.10:6443 user@jump -fN - 使用:本地 kubectl 配置 apiServer 为 127.0.0.1:6443。
二、-R 远程端口转发:把你本机/内网服务“发布到远端”
- 把本地开发服务给远端同事或 CI 访问
- 场景:你本地起了 http://localhost:3000,希望 server.example.com 能访问。
- 命令(仅远端本机可访问):
ssh -R 127.0.0.1:8080:localhost:3000 user@server -fN - 使用:在 server 上 curl http://127.0.0.1:8080。
- 如果要让外部也能访问:
服务端 sshd_config 设置 GatewayPorts clientspecified 或 yes,命令改为:
ssh -R 0.0.0.0:8080:localhost:3000 user@server -fN
还需放行 server 的防火墙/安全组。 - 风险:这相当于把本地服务“经 server 暴露”,务必限定端口与来源 IP。
- 临时反向打洞穿 NAT
- 场景:你在家里 NAT 后面跑了一个设备的 SSH,云服务器需要能进来调试。
- 命令(在家里机器上执行):
ssh -R 0.0.0.0:2222:localhost:22 user@cloud -fN - 使用:他人 ssh -p 2222 user@cloud 即可经隧道进入你的家里机器。
- 前提:cloud 的 GatewayPorts 开启、端口放行。
- 让远端容器/Job 访问你本地仅内网可见的资源
- 场景:云上 CI 需要访问你公司内网许可证服务器 10.0.0.5:6200,但只能到你的办公机。
- 命令(办公机执行):
ssh -R 127.0.0.1:6200:10.0.0.5:6200 ci@cloud -fN - 使用:在云上 CI 里把许可证服务器配置为 127.0.0.1:6200。
三、-D 动态转发:开一个本地 SOCKS5 代理,万能“翻路由”
- 通过跳板统一出网
- 场景:需要让浏览器或 curl 走跳板机的出口(同时还能访问它内网的多站点)。
- 命令:
ssh -D 127.0.0.1:1080 user@jump -fN - 使用:浏览器或命令行设置 SOCKS5 代理为 127.0.0.1:1080;所有不同站点自动经 jump 访问。
- 优点:多站点/多端口不用逐个 -L;DNS 也可通过代理(浏览器里勾选“通过 SOCKS 代理解析 DNS”或 curl --socks5-hostname)。
- 串联多跳访问深层内网
- 命令:
ssh -J user@bastion1,user@bastion2 -D 127.0.0.1:1080 user@final -fN - 使用:应用经本地 SOCKS 代理访问 final 侧内网的任意服务。
- 快速测试目标端口可达性
- 场景:你想在远端视角测试若干 host:port 是否通。
- 命令:
ssh -D 127.0.0.1:1080 user@probe -fN
然后在本地用 curl --socks5-hostname 127.0.0.1:1080 http://target:port/health
绑定地址与可达性
- -L [bind_addr:]Lport:dst:dstport,默认仅本机;若需被他人访问,加 -g 并绑定 0.0.0.0,且本机防火墙放行
- -R [bind_addr:]Rport:dst:dstport,若要对外可达:sshd_config 开启 GatewayPorts(yes 或 clientspecified),可绑定 0.0.0.0,并放行远端防火墙/安全组
多跳与旧版兼容
- 新:-J ProxyJump(可串联多跳:-J j1,j2)
- 旧:-o ProxyCommand="ssh -W %h:%p jump" 等效实现
稳定性与可用性
- -fN 后台不分配 shell;-o ExitOnForwardFailure=yes 绑定失败即退出
- 保活:-o ServerAliveInterval=60 -o ServerAliveCountMax=3(客户端);autossh/systemd 保活
- 连接复用:-o ControlMaster=auto -o ControlPersist=600 -o ControlPath=...
访问控制(服务端)
- AllowTcpForwarding {yes|no|local|remote} 控制允许的转发类型
- PermitOpen host:port 限定可转发的目的地
- GatewayPorts {no|yes|clientspecified} 控远端监听可达性
安全提示
- 不信任的跳板避免 -A(代理转发);优先用 -J/ProxyCommand 实现多跳
- 严控防火墙放行与绑定范围,避免误暴露
SSH 单选题(不含答案,每题仅一个正确项)
- 需要把本地文件通过 jump1→jump2 两级跳板上传到 10.0.0.5,且不复制私钥也不启用代理转发,哪种写法更合适?【A】
A. scp -J jump1,jump2 ./app.tar.gz user@10.0.0.5:~~/
B. scp -A ./app.tar.gz user@10.0.0.5:~~/
C. scp -o ProxyCommand="ssh -W %h:%p jump1,jump2" ./app.tar.gz user@10.0.0.5:~~/
D. scp -D 1080 ./app.tar.gz user@10.0.0.5:~~/ - 建立 -L/-R 转发时,若绑定端口已被占用希望 SSH 立即报错退出而不是静默后台,优先加哪个参数?【A】
A. -o ExitOnForwardFailure=yes
B. -o StrictHostKeyChecking=no
C. -q
D. -f - 为减少 NAT/防火墙空闲超时导致的断连,在客户端更稳妥的保活组合是?【C】
A. -o ServerAliveInterval=60 -o ServerAliveCountMax=3
B. -o TCPKeepAlive=no
C. -o ClientAliveInterval=60 -o ClientAliveCountMax=3
D. -v - 你要把本机 127.0.0.1:8080 暴露为 jump 公网的 18080 供外部访问,哪种做法更正确且更完整?【A】
A. ssh -R 0.0.0.0:18080:127.0.0.1:8080 user@jump,并在 jump 开启 GatewayPorts 且放行防火墙
B. ssh -L 0.0.0.0:18080:127.0.0.1:8080 user@jump,并在 jump 开启 PermitRootLogin
C. ssh -R 18080:127.0.0.1:8080 user@jump,无需任何配置即可对外可达
D. ssh -D 18080 user@jump,并在 jump 关闭 AllowTcpForwarding - 若希望限制用户通过 -L/-R 只能转发到白名单目标(如 10.0.0.1:3306),服务端应配置哪项?【A】
A. PermitOpen 10.0.0.1:3306
B. X11UseLocalhost yes
C. PasswordAuthentication no
D. GatewayPorts clientspecified - 旧版 OpenSSH 不支持 -J 时,想通过 jump 访问 10.0.0.5:22,哪段参数与 -J 等效?【C】
A. -o ProxyCommand="ssh -W %h:%p jump"
B. -o ProxyCommand="nc -zv %h %p"
C. -o ProxyCommand="ssh -L %h:%p jump"
D. -X - 你希望同事在局域网内直接访问你笔记本的 15432(再转发到 10.10.0.5:5432),哪种写法更合适?【C】
A. ssh -g -L 0.0.0.0:15432:10.10.0.5:5432 user@jump,并放行本机防火墙
B. ssh -L 127.0.0.1:15432:10.10.0.5:5432 user@jump
C. ssh -R 0.0.0.0:15432:10.10.0.5:5432 user@jump
D. ssh -D 15432 user@jump - 想在同一台跳板上复用连接、减少多次握手延迟,客户端最关键的配置是?【B】
A. -o ControlMaster=auto -o ControlPersist=600 -o ControlPath=~/.ssh/cm-%r@%h:%p
B. -o StrictHostKeyChecking=no
C. -o Compression=no
D. -o VerifyHostKeyDNS=yes
需要时我可以提供这 8 题的官方解析与命令示例验证步骤。
下面是你的答案批改与讲解。总体:4/8 正确。
概览
- 正确:1、2、4、5
- 错误:3、6、7、8
逐题批改
- 多跳上传文件(不复制私钥、不用代理转发)
- 你的选择:A ✅ 正确
- 要点:scp 支持 -J 多跳(如 -J jump1,jump2),认证都由本地完成,无需把私钥放到跳板也无需 -A。
- 端口被占用时让 SSH 直接报错退出
- 你的选择:A ✅ 正确
- 要点:-o ExitOnForwardFailure=yes 会让转发绑定失败时立刻退出,常与 -f/-N 搭配。
- 客户端侧减少 NAT/防火墙空闲超时的断连
- 你的选择:C ❌
- 正确答案:A
解释:
- ClientAliveInterval/ClientAliveCountMax 是服务端 sshd_config 选项,写在客户端不生效。
- 客户端应使用 ServerAliveInterval/ServerAliveCountMax,定期在加密隧道里发心跳,能有效穿过多数 NAT/防火墙。
- 参考:ssh -o ServerAliveInterval=60 -o ServerAliveCountMax=3 ...
- 把本机 127.0.0.1:8080 暴露为 jump 公网 18080
- 你的选择:A ✅ 正确
- 要点:-R 远端监听 + 在 jump 开启 GatewayPorts 并放行防火墙。必要时显式绑定 0.0.0.0。
- 只允许转发到白名单目标
- 你的选择:A ✅ 正确
- 要点:服务端设置 PermitOpen host:port(可多条),限制 -L/-R 的目的地。
- 旧版不支持 -J,用 jump 访问 10.0.0.5:22 的等效写法
- 你的选择:C ❌
- 正确答案:A
解释:
- -o ProxyCommand="ssh -W %h:%p jump" 等效于 -J jump(由本地通过 jump 把数据流直接转给目标)。
- 选项 C 用的是 -L 本地转发,完全不是 ProxyCommand 的语义,无法等效多跳直通。
- 让同事在局域网内连你笔记本的 15432,再转发到 10.10.0.5:5432
- 你的选择:C ❌
- 正确答案:A
解释:
- 需求是在“你的本机”上开口子给别人连,所以用本地转发 -L,并绑定 0.0.0.0 且加 -g 允许远端主机连接,同时放行本机防火墙。
- -R 是在远端(jump)监听,方向不对。
- 复用同一跳板连接、减少握手延迟
- 你的选择:B ❌
- 正确答案:A
解释:
- 控制连接复用:ControlMaster=auto + ControlPersist=600 + ControlPath=... 能在单一 TCP 连接上复用多路会话,显著降低新建连接开销。
- StrictHostKeyChecking=no 只影响主机钥验证(且有安全隐患),与复用无关。
如需,我可以把 3、6、7、8 的正确用法各给一条可直接复制的命令和自检步骤。
~ ~ The End ~ ~
文章标题:5618ssh复习2
文章链接:https://www.fangshaonian.cn/archives/132/
最后编辑:2025 年 11 月 13 日 02:15 By 方少年
许可协议: 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)