5618ssh复习2

下面先给一页超短“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 本地端口转发:把远端/内网服务“带到你本地”

    1. 访问远端内网数据库
    • 场景: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 并设置防火墙。
    1. 安全地访问只开在远端内网的 Web 后台
    • 场景:内网站点 http://intranet:80 只在公司网;你在家办公。
    • 命令:
      ssh -L 127.0.0.1:8080:intranet:80 user@vpn-gateway -fN
    • 使用:浏览器打开 http://127.0.0.1:8080
    • 优点:互联网段加密;不必在公网暴露后台。
    1. 连到 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 远程端口转发:把你本机/内网服务“发布到远端”

    1. 把本地开发服务给远端同事或 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。
    1. 临时反向打洞穿 NAT
    • 场景:你在家里 NAT 后面跑了一个设备的 SSH,云服务器需要能进来调试。
    • 命令(在家里机器上执行):
      ssh -R 0.0.0.0:2222:localhost:22 user@cloud -fN
    • 使用:他人 ssh -p 2222 user@cloud 即可经隧道进入你的家里机器。
    • 前提:cloud 的 GatewayPorts 开启、端口放行。
    1. 让远端容器/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 代理,万能“翻路由”

    1. 通过跳板统一出网
    • 场景:需要让浏览器或 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)。
    1. 串联多跳访问深层内网
    • 命令:
      ssh -J user@bastion1,user@bastion2 -D 127.0.0.1:1080 user@final -fN
    • 使用:应用经本地 SOCKS 代理访问 final 侧内网的任意服务。
    1. 快速测试目标端口可达性
    • 场景:你想在远端视角测试若干 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 单选题(不含答案,每题仅一个正确项)

  1. 需要把本地文件通过 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:~~/
  2. 建立 -L/-R 转发时,若绑定端口已被占用希望 SSH 立即报错退出而不是静默后台,优先加哪个参数?【A】
    A. -o ExitOnForwardFailure=yes
    B. -o StrictHostKeyChecking=no
    C. -q
    D. -f
  3. 为减少 NAT/防火墙空闲超时导致的断连,在客户端更稳妥的保活组合是?【C】
    A. -o ServerAliveInterval=60 -o ServerAliveCountMax=3
    B. -o TCPKeepAlive=no
    C. -o ClientAliveInterval=60 -o ClientAliveCountMax=3
    D. -v
  4. 你要把本机 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
  5. 若希望限制用户通过 -L/-R 只能转发到白名单目标(如 10.0.0.1:3306),服务端应配置哪项?【A】
    A. PermitOpen 10.0.0.1:3306
    B. X11UseLocalhost yes
    C. PasswordAuthentication no
    D. GatewayPorts clientspecified
  6. 旧版 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
  7. 你希望同事在局域网内直接访问你笔记本的 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
  8. 想在同一台跳板上复用连接、减少多次握手延迟,客户端最关键的配置是?【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

逐题批改

  1. 多跳上传文件(不复制私钥、不用代理转发)
  • 你的选择:A ✅ 正确
  • 要点:scp 支持 -J 多跳(如 -J jump1,jump2),认证都由本地完成,无需把私钥放到跳板也无需 -A。
  1. 端口被占用时让 SSH 直接报错退出
  • 你的选择:A ✅ 正确
  • 要点:-o ExitOnForwardFailure=yes 会让转发绑定失败时立刻退出,常与 -f/-N 搭配。
  1. 客户端侧减少 NAT/防火墙空闲超时的断连
  • 你的选择:C ❌
  • 正确答案:A
  • 解释:

    • ClientAliveInterval/ClientAliveCountMax 是服务端 sshd_config 选项,写在客户端不生效。
    • 客户端应使用 ServerAliveInterval/ServerAliveCountMax,定期在加密隧道里发心跳,能有效穿过多数 NAT/防火墙。
    • 参考:ssh -o ServerAliveInterval=60 -o ServerAliveCountMax=3 ...
  1. 把本机 127.0.0.1:8080 暴露为 jump 公网 18080
  • 你的选择:A ✅ 正确
  • 要点:-R 远端监听 + 在 jump 开启 GatewayPorts 并放行防火墙。必要时显式绑定 0.0.0.0。
  1. 只允许转发到白名单目标
  • 你的选择:A ✅ 正确
  • 要点:服务端设置 PermitOpen host:port(可多条),限制 -L/-R 的目的地。
  1. 旧版不支持 -J,用 jump 访问 10.0.0.5:22 的等效写法
  • 你的选择:C ❌
  • 正确答案:A
  • 解释:

    • -o ProxyCommand="ssh -W %h:%p jump" 等效于 -J jump(由本地通过 jump 把数据流直接转给目标)。
    • 选项 C 用的是 -L 本地转发,完全不是 ProxyCommand 的语义,无法等效多跳直通。
  1. 让同事在局域网内连你笔记本的 15432,再转发到 10.10.0.5:5432
  • 你的选择:C ❌
  • 正确答案:A
  • 解释:

    • 需求是在“你的本机”上开口子给别人连,所以用本地转发 -L,并绑定 0.0.0.0 且加 -g 允许远端主机连接,同时放行本机防火墙。
    • -R 是在远端(jump)监听,方向不对。
  1. 复用同一跳板连接、减少握手延迟
  • 你的选择:B ❌
  • 正确答案:A
  • 解释:

    • 控制连接复用:ControlMaster=auto + ControlPersist=600 + ControlPath=... 能在单一 TCP 连接上复用多路会话,显著降低新建连接开销。
    • StrictHostKeyChecking=no 只影响主机钥验证(且有安全隐患),与复用无关。

如需,我可以把 3、6、7、8 的正确用法各给一条可直接复制的命令和自检步骤。

~  ~  The   End  ~  ~


 赏 
感谢您的支持,我会继续努力哒!
支付宝收款码
tips
文章二维码 分类标签:博客TypechoAutoUpload
文章标题:5618ssh复习2
文章链接:https://www.fangshaonian.cn/archives/132/
最后编辑:2025 年 11 月 13 日 02:15 By 方少年
许可协议: 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)
(*) 7 + 8 =
快来做第一个评论的人吧~