多跳SSH隧道配置求助:通过S1、S2中转本地网络流量(仅可修改S1、S2配置)
我来帮你梳理一套可行的配置方案,完全不需要修改本地客户端的设置,只需要在S1和S2上做一些配置就能实现你的需求:
先明确你的网络链路:
本地 → S1 → S2 → 互联网,我们要把流量一步步中转过去,核心是让S1作为跳板,把本地的SSH隧道流量转发到S2,再由S2完成上网的NAT转发。
第一步:配置S2,让它能转发流量到互联网
S2是最终的上网节点,必须开启IP转发和NAT规则:
启用IP转发:
临时生效(重启后失效):echo 1 > /proc/sys/net/ipv4/ip_forward永久生效:
编辑/etc/sysctl.conf,找到net.ipv4.ip_forward这一行,去掉注释并设置为:net.ipv4.ip_forward=1然后执行
sysctl -p让配置立即生效。设置NAT规则:
先找到S2的外网网卡(比如eth0、ens33,可以用ip addr命令查看),然后执行:iptables -t nat -A POSTROUTING -o 你的外网网卡名 -j MASQUERADE如果想永久保存这个规则,不同系统方式不同:
- Debian/Ubuntu:
iptables-save > /etc/iptables/rules.v4 - CentOS/RHEL:
iptables-save > /etc/sysconfig/iptables
- Debian/Ubuntu:
第二步:在S1上建立持久化的SSH隧道到S2
我们需要让S1一直保持一个到S2的SOCKS代理隧道,这样本地流量到S1后能直接中转到S2:
配置S1免密登录S2:
在S1上生成SSH密钥对(一路回车默认即可):ssh-keygen -t ed25519然后把公钥复制到S2,这样S1连S2不需要输密码:
ssh-copy-id -p 1202 S2的用户名@S2的IP地址创建系统服务维持隧道:
手动启动隧道容易断开,我们用systemd做一个自动重启的服务:
创建文件/etc/systemd/system/s1-to-s2-socks.service,内容如下(替换里面的S2用户名和S2IP为实际值):[Unit] Description=持久化S1到S2的SSH SOCKS隧道 After=network.target [Service] User=root ExecStart=/usr/bin/ssh -fN -D 0.0.0.0:1080 -p 1202 -o ServerAliveInterval=60 -o ServerAliveCountMax=3 S2用户名@S2IP Restart=always RestartSec=10 [Install] WantedBy=multi-user.target解释一下参数:
-D 0.0.0.0:1080:让S1在所有网卡上监听1080端口,作为SOCKS5代理入口ServerAliveInterval=60:每60秒发一个心跳包,避免隧道超时断开Restart=always:隧道断开后自动重启
启动并启用服务:
systemctl daemon-reload systemctl start s1-to-s2-socks.service systemctl enable s1-to-s2-socks.service用
systemctl status s1-to-s2-socks.service检查服务是否正常运行。
第三步:配置S1的SSH服务,允许端口转发
编辑S1的/etc/ssh/sshd_config,确保以下配置项存在且未被注释:
AllowTcpForwarding yes GatewayPorts yes PermitOpen any
然后重启S1的SSH服务:
systemctl restart sshd
第四步:用NetMod连接S1即可
打开你的NetMod客户端,新建一个SSH连接:
- 主机:S1的IP地址
- 端口:22
- 用户名:S1的登录用户名
- 选择动态端口转发(SOCKS5),本地端口随便设一个(比如1080)
- 保存后连接
这样你的本地流量就会通过NetMod到S1,S1再通过我们建立的隧道把流量转到S2,最后由S2转发到互联网,完美实现多跳中转!
另外补充一点:如果你的S1或S2有防火墙,要确保S1能访问S2的1202端口,S2的外网端口能正常访问互联网。
备注:内容来源于stack exchange,提问作者mzage

