Linux 网关配置错误的快速修复方式

2次阅读

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

Linux 网关配置错误的快速修复方式

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。

实操建议:

  • 家用/拨号环境一律用 masqueradesudo 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 只在 PREROUTINGPOSTROUTING 生效,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 类型、接口限定这三处,改错一个就可能让整个网关“半瘫”。尤其是 masqueradeSNAT 的选择,很多人凭印象写,但实际取决于你出口是不是固定 IP。

text=ZqhQzanResources