iptables规则顺序错误、snat配置不当及input链未限定接口是linux网关转发失效的三大主因,需按序排查规则顺序、开启ip转发、配置nat与接口限制。

iptables 规则顺序错导致转发失效
Linux 网关最常出问题的地方不是没开转发,而是 iptables 链里规则顺序不对——比如把 DROP 放在 ACCEPT 前面,或者 FORWARD 链默认策略是 DROP 却忘了加允许规则。
实操建议:
- 先确认转发是否开启:
sysctl net.ipv4.ip_forward输出必须是1;如果不是,临时开:sudo sysctl -w net.ipv4.ip_forward=1,永久开要改/etc/sysctl.conf - 检查
FORWARD链:用sudo iptables -L FORWARD -n --line-numbers查看规则序号和匹配情况 - 典型修复:在最前面插入允许已建立连接的流量:
sudo iptables -I FORWARD 1 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT - 再插入允许内网到外网的规则(假设内网是
192.168.10.0/24,出口网卡是eth0):sudo iptables -A FORWARD -s 192.168.10.0/24 -o eth0 -j ACCEPT - 别漏掉回程路由:外网接口要允许进来的响应包,加一条:
sudo iptables -A FORWARD -i eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
netfilter 规则未持久化重启就丢
很多调试时只跑 iptables 命令,一重启网关变砖——因为规则只存在内存里,没保存。
实操建议:
- debian/ubuntu 系统用
iptables-persistent:装完后执行sudo netfilter-persistent save,它会把当前规则写进/etc/iptables/rules.v4 - RHEL/centos 7+ 用
iptables-services:启用服务sudo systemctl enable iptables,然后sudo service iptables save - 别直接编辑规则文件:手动改
/etc/iptables/rules.v4容易格式错,优先用save命令生成 - 验证是否生效:重启前先
sudo reboot --dry-run(不真重启),或开个新终端测试sudo systemctl restart netfilter-persistent后规则还在不在
SNAT 配置漏掉 masquerade 或地址写死
内网机器能 ping 通网关,但上不了外网,大概率是 SNAT 没配对——要么没用 masquerade(动态 IP 场景),要么用了 snat 却填了错误的出口 IP。
实操建议:
- 家用/拨号环境一律用
masquerade:sudo iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth0 -j MASQUERADE - 企业固定公网 IP 才考虑
SNAT,且必须确认eth0当前 IP 是你要用的那个:ip -br a | grep eth0,再写规则:sudo iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth0 -j SNAT --to-source 203.0.113.42 - 别在
nat表里混用FORWARD链规则:NAT 只在PREROUTING和POSTROUTING生效,FORWARD链里加-t nat没效果 - 查 NAT 是否命中:用
sudo iptables -t nat -L POSTROUTING -v -n,看pkts列有没有增长
多网卡环境下 INPUT 链误阻断管理连接
修完转发,结果自己 ssh 连不上了——往往是因为加规则时没限定接口,INPUT 链的 DROP 把管理口(比如 eth1)也拦了。
实操建议:
- 所有 INPUT 规则尽量绑定接口:
sudo iptables -A INPUT -i eth1 -p tcp --dport 22 -j ACCEPT,而不是放通所有接口 - 如果必须允许某 IP 段管理,优先用源地址限制:
sudo iptables -A INPUT -s 192.168.5.0/24 -p tcp --dport 22 -j ACCEPT - 默认
INPUT策略设成ACCEPT更安全,等规则调稳再改成DROP;改之前先加一条保底:sudo iptables -I INPUT 1 -i lo -j ACCEPT - 测试时别用
ssh本机连本机:那走的是lo接口,不能代表外网管理口真实通不通
规则顺序、NAT 类型、接口限定这三处,改错一个就可能让整个网关“半瘫”。尤其是 masquerade 和 SNAT 的选择,很多人凭印象写,但实际取决于你出口是不是固定 IP。