如何通过反向SSH将Server A的全部流量转发至Server B?
嗨,我来帮你理清这个问题!你已经成功用反向SSH把Server A的22端口映射到了Server B的4000端口,但这只是单端口的SSH转发,要实现全部流量的转发,还需要调整隧道配置、开启Server B的转发能力,以及设置Server A的路由规则。下面分步骤给你讲两种可行的方法:
前提准备:先让Server B具备流量转发能力
首先,Server B需要能把来自Server A的流量转发到公网,所以得先开启IP转发和地址伪装:
- 在Server B上执行以下命令(临时生效,重启后会重置):
👉 注意:把sudo echo 1 > /proc/sys/net/ipv4/ip_forward sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADEeth0换成Server B的公网网卡名(可以用ip addr查看,比如ens33、ens5之类的)。 - 要是想永久生效:
- 编辑
/etc/sysctl.conf,找到net.ipv4.ip_forward一行,改成net.ipv4.ip_forward=1,然后执行sudo sysctl -p。 - 保存iptables规则:Debian/Ubuntu可以用
sudo iptables-save > /etc/iptables/rules.v4,CentOS/RHEL可以用firewall-cmd配置或者保存到对应路径。
- 编辑
方法一:用反向SSH建立TUN虚拟隧道(推荐,全流量转发最直接)
这种方法会在Server A和Server B之间建立一个虚拟的点对点网络,让Server A的所有流量都通过这个隧道走Server B转发。
在Server A上修改反向SSH命令,建立TUN隧道:
ssh -fNT -o Tunnel=point-to-point -o TunnelDevice=0:1 -o ServerAliveInterval=60 ubuntu@62.45.xx.xx -i <private-key>👉 加
ServerAliveInterval=60是为了防止隧道长时间无数据被断开。给虚拟网卡配置IP地址:
- 在Server A上执行:
sudo ip addr add 10.0.0.1/30 dev tun0 sudo ip link set tun0 up - 在Server B上(可以直接在Server B的终端操作,或者通过反向隧道用
ssh -p 4000 ubuntu@localhost连回Server A后操作):sudo ip addr add 10.0.0.2/30 dev tun1 sudo ip link set tun1 up
- 在Server A上执行:
设置Server A的默认网关,让所有流量走虚拟隧道:
sudo ip route add default via 10.0.0.2 dev tun0这样配置后,Server A的所有流量都会通过Server B转发到公网了。
方法二:用反向SSH+SOCKS代理+iptables重定向
如果你不想修改默认网关,可以用这种方法,把Server A的流量重定向到SOCKS代理端口,再通过反向SSH转发到Server B。
在Server A上启动本地SOCKS5代理,并通过反向SSH映射到Server B:
先在Server A上开一个SOCKS5代理(用SSH自带的功能):ssh -fNT -D 1080 localhost然后修改反向SSH命令,把Server B的1080端口映射到Server A的1080端口:
ssh -fNT -R 1080:localhost:1080 -o ServerAliveInterval=60 ubuntu@62.45.xx.xx -i <private-key>用iptables把Server A的所有流量重定向到SOCKS5代理:
sudo iptables -t nat -A PREROUTING -p tcp --dport 1:65535 -j REDIRECT --to-ports 1080 sudo iptables -t nat -A PREROUTING -p udp --dport 1:65535 -j REDIRECT --to-ports 1080👉 注意:这种方法需要确保你的系统支持UDP转发到SOCKS5,部分环境可能需要额外工具(比如
redsocks)来处理UDP流量。
一些注意事项
- 确保Server B的防火墙允许反向SSH的22端口,以及TUN隧道/ SOCKS代理的端口(比如1080)通过。
- 如果反向SSH经常断开,可以把
ServerAliveInterval和ServerAliveCountMax参数加到~/.ssh/config里,比如:
之后用Host serverB HostName 62.45.xx.xx User ubuntu IdentityFile <private-key> ServerAliveInterval 60 ServerAliveCountMax 3ssh -fNT -R ... serverB连接会更稳定。
备注:内容来源于stack exchange,提问作者Arash Sadeghizadeh

