如何通过两台代理主机实现SSH动态端口转发?
实现多级SSH跳转的动态SOCKS代理
方法一:直接使用SSH命令行跳转
SSH 7.3及以上版本支持-J(ProxyJump)参数,可直接串联跳转主机,同时在本地建立动态端口转发:
ssh -D 8080 -J root@123.123.123.1,root@123.123.123.2 user@123.123.123.3
参数说明:
-D 8080:在本地机器的8080端口创建SOCKS5代理,所有发往该端口的请求会通过SSH隧道转发至Host3,再由Host3访问互联网。-J:按顺序指定中间跳转主机,逗号分隔,链路为本地→Host1→Host2→Host3。
执行命令后保持终端窗口打开,在Firefox中配置代理:
- 打开Firefox设置→网络设置
- 选择“手动配置代理”
- SOCKS主机填
localhost,端口填8080 - 勾选“SOCKS v5”和“远程DNS”(确保DNS请求也通过代理转发)
若SSH版本低于7.3,不支持-J参数,可使用ProxyCommand嵌套写法:
ssh -D 8080 -o ProxyCommand="ssh -W %h:%p root@123.123.123.1 -o ProxyCommand='ssh -W %h:%p root@123.123.123.2'" user@123.123.123.3
方法二:配置~/.ssh/config简化操作
编辑本地机器的~/.ssh/config文件,添加以下内容:
Host host1 HostName 123.123.123.1 User root Host host2 HostName 123.123.123.2 User root ProxyJump host1 Host host3 HostName 123.123.123.3 User user ProxyJump host2
保存后,直接执行以下命令即可建立本地SOCKS代理:
ssh -D 8080 host3
后续Firefox代理配置与方法一一致。
原命令失败原因
你之前执行的命令:
ssh -D 8081 root@123.123.123.1 ssh -D 8082 root@123.123.123.2 ssh -D 8083 root@123.123.123.3
问题在于:
-D 8081是在本地绑定端口,但登录Host1后执行的ssh -D 8082是在Host1上绑定端口,ssh -D 8083是在Host2上绑定端口,这些端口均不在本地机器上,Firefox无法通过它们访问Host3的代理。- 该写法未建立本地到Host3的完整隧道,只是在每台中间机单独开启转发,无法让本地流量通过完整链路抵达Host3。
内容的提问来源于stack exchange,提问作者robertinho
相关产品推荐
相关产品推荐

