Debian系统重启后SSH反向隧道结合DNAT的外部流量转发失效求助
Debian系统重启后SSH反向隧道结合DNAT的外部流量转发失效求助
看起来你遇到了重启后反向隧道+DNAT组合失效的头疼问题,内部测试正常但外部走 jumphost 就不行,隧道还通着但流量没被正确NAT,咱们一步步排查可能的原因:
1. 先确认ip_forward是否持久化生效
你启动脚本里是临时把ip_forward设为1,但/proc下的配置重启就会重置,这大概率是第一个踩坑点!
- 先检查当前状态:执行
cat /proc/sys/net/ipv4/ip_forward,如果输出是0,说明重启后这个配置丢了 - 解决办法:编辑
/etc/sysctl.conf,添加或修改一行:net.ipv4.ip_forward=1,然后执行sysctl -p让它立即生效,这样下次重启就不会重置了
2. 检查iptables规则的持久化与生效状态
你手动在启动脚本里加的iptables规则,有可能重启后没加上,或者规则范围有问题:
- 重启后先验证规则是否存在:执行
iptables -t nat -L -n -v,看看PREROUTING里的DNAT规则、POSTROUTING里的MASQUERADE规则是不是都在,而且计数(pkts列)有没有流量进来的增长 - 为了避免每次重启手动加规则,建议安装
iptables-persistent来持久化规则:
这样重启后系统会自动加载这些规则apt install iptables-persistent iptables-save > /etc/iptables/rules.v4 - 另外注意:你的MASQUERADE规则是针对
ens18接口的,那反向隧道进来的流量回包时,走的是不是这个接口?如果回包走的是隧道接口(比如lo或者tun类接口),那这个MASQUERADE规则就不会生效,导致回包源地址还是10.10.10.5,外部流量的源是jumphost那边的地址,可能触发路由问题。可以尝试把MASQUERADE规则改成不限制接口,或者指定源地址范围:iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -j MASQUERADE
3. 验证反向隧道的转发链路是否完整
虽然你说隧道是通的,但得确认jumphost上的端口真的转发到了Debian机器:
- 在jumphost上执行
ss -tulpn | grep 443,看看是不是有sshd进程在监听443端口(反向隧道是由jumphost的sshd负责转发的) - 在jumphost上直接测试访问:
curl -v http://localhost:443,看看能不能通到Debian机器的443端口,再在Debian上用tcpdump -i any port 443抓包,确认流量确实到了Debian,然后看有没有被DNAT到10.10.10.5 - 另外检查autossh的进程状态:在Debian上执行
ps aux | grep autossh,看看两个autossh进程是不是都在正常运行
4. 回包路由的问题排查
如果前面的都没问题,那可能是回包没经过NAT导致的:
- 在
10.10.10.5上用tcpdump -i any port 443抓包,看是否收到了Debian转发过来的流量,然后看回包的目标地址是哪里 - 如果回包的目标地址是jumphost那边的外部地址,而
10.10.10.5的默认网关不是Debian机器,那回包会直接走自己的网关出去,导致流量不对称,外部就收不到回包。这种情况要确保10.10.10.5的默认网关指向Debian,或者在Debian上添加静态路由让10.10.10.5的回包走Debian转发
备注:内容来源于stack exchange,提问作者rrn
相关产品推荐
相关产品推荐

