You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在两个处于NAT后的主机间协商建立直接SSH连接(借助第三方主机)

如何在两个处于NAT后的主机间协商建立直接SSH连接(借助第三方主机)

嘿,我懂你的痛点——现在每次从A(笔记本)连到C(桌面)都要绕个弯经过B,额外的延迟确实烦人。既然你已经能通过B自由传递A和C之间的信息,那完全不用依赖pwnat这类专门做NAT打洞的工具,用SSH本身或者一些简单的网络技巧就能搞定直连,下面给你几个实用的方案:

方案1:SSH反向隧道+NAT端口探测直连

这是最直接的方法,核心是先通过B拿到C的NAT映射信息,再发起直连:

  • 第一步,在C上维持和B的反向隧道(先别停,这步用来拿映射信息):ssh -N -T -R 0:localhost:22 B
    这里的0会让B随机分配一个端口给C的反向映射,你可以在B上用netstat -tulpn | grep ssh找到这个端口(比如假设是12345),同时在C上用curl ifconfig.me拿到自己的公网IP。
  • 第二步,把C的公网IP和B分配的这个端口,通过B传递给A(比如在B上存个临时文本文件,或者A直接登录B后查看)。
  • 第三步,在A上尝试直接连接:ssh -p 12345 your_username@C_public_IP
    大部分家庭NAT(锥形NAT)都会允许这个连接,因为C已经主动和B建立了连接,NAT上的端口映射已经存在。如果是对称NAT(少数企业/运营商会用),那可能需要让A和C同时发起连接来触发打洞——你可以在B上写个简单的脚本,同步告诉A和C在同一时间发起对对方公网IP+指定端口的连接,比如C监听2222端口,A同时连C的2222端口,这样就能绕过对称NAT的限制。

方案2:利用SOCKS代理触发直连

如果上面的直连失败,你可以先用B做临时跳板触发NAT打洞,后续流量自动走直连:

  • 在A上启动SOCKS代理,把B作为中转:ssh -D 1080 B
  • 在A上设置临时代理环境变量:export ALL_PROXY=socks5://localhost:1080
  • 同时让C把自己的公网IP和NAT端口(可以通过之前的反向隧道拿到)传给A,然后A直接连接:ssh -p C_nat_port your_username@C_public_IP
    第一次连接会通过B中转,但一旦NAT打洞成功,后续的SSH流量就会自动切换成A->C的直连,延迟就降下来了。

方案3:自动化探测+ fallback 机制

如果想让整个过程更省心,可以写个简单的脚本自动化:

  • 在B上部署一个小脚本,当C的反向隧道建立时,自动抓取C的公网IP和源端口,存到一个可读取的文件里。
  • 在A上定期读取这个文件,尝试发起直连;如果直连失败,自动 fallback 到原来的A->B->C中转方式。

注意事项

  • 不是所有NAT都支持直连:严格的对称NAT可能很难成功,但绝大多数家庭和普通办公环境的NAT都是友好的。
  • 可以固定反向隧道端口:比如把第一步的0改成固定端口(比如2222),这样不用每次找随机端口,更方便自动化。

备注:内容来源于stack exchange,提问作者Davis Yoshida

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 10:43:18