Linux 网络防火墙 iptables 实战

1次阅读

-a 将规则追加到链末尾,适用于兜底策略;-i 插入到链开头(默认第1位)或指定位置,适合紧急放行。规则按序匹配,首条匹配即执行动作,后续不再检查。

Linux 网络防火墙 iptables 实战

iptables -A 和 -I 的区别到底怎么选

加规则时用 -A 还是 -I,直接决定流量是否被拦死。默认链(inputFORWARDOUTPUT)是按顺序匹配的,一旦某条规则匹配成功,就执行对应动作(ACCEPTDROP),后续规则不再检查。

  • -A 是追加到链末尾 —— 新规则排在所有已有规则之后,常用于“兜底”策略,比如最后 -j DROP
  • -I 是插入到链开头(等价于 -I 1)—— 新规则插在最前面,适合紧急放行,比如调试时加一条 -s 192.168.1.100 -j ACCEPT,否则可能被前面的 DROP 拦住
  • 如果想插到第 3 条位置,用 -I INPUT 3;但注意:行号会随规则增删动态变化,脚本里硬写数字容易出错
  • 查当前规则带编号:iptables -nL --line-numbers,别靠肉眼数

为什么 -j REJECT 和 -j DROP 表现不一样

表面上都是“拒绝连接”,但对客户端行为影响完全不同。这关系到排查时看到的是超时还是立刻失败。

  • -j DROP:静默丢包,不回任何响应。客户端 TCP 握手会卡在 SYN_SENT,最终超时(通常 30 秒以上),容易误判为网络不通
  • -j REJECT:主动发 RST(TCP)或 ICMP port-unreachable(udp),客户端立刻收到“连接被拒”,报错快、定位准
  • 生产环境对外服务端口慎用 REJECT,可能暴露端口开放状态;内网调试建议优先 REJECT,省去等超时的麻烦
  • 想自定义拒绝响应类型,可用 --reject-with icmp-host-prohibited 等参数,但并非所有类型在所有内核版本都支持

保存 iptables 规则后重启失效?

iptables 命令改的是运行时规则,系统重启后清空。不同发行版保存机制不同,不统一处理就会白忙活。

  • debian/ubuntu:用 iptables-save > /etc/iptables/rules.v4,再确保 netfilter-persistent 服务启用(systemctl enable netfilter-persistent
  • RHEL/centos 7+:用 service iptables save(需安装 iptables-services 包),本质是调用 iptables-save 写入 /etc/sysconfig/iptables
  • CentOS 8+/RHEL 8+ 默认用 nftablesiptables 命令只是兼容层,保存规则实际走 nft,别混用
  • 手动写配置文件后,务必用 iptables-restore 测试能否加载成功,语法错会导致整条链清空

匹配多端口时 -m multiport 必须和 –dports 同时出现

想一次放行 80、443、22 端口,不能只写 --dport 80,443,22,会报错或只匹配第一个。

  • 正确写法:-m multiport --dports 80,443,22--dportsmultiport 模块的专用参数,没加载模块就不认识这个选项
  • --sports 用于源端口,--dports 用于目标端口,别写反;单端口场景用 --dport(无 s)更简洁
  • multiport 最多支持 15 个端口,超了得拆成多条规则,或者改用 ipset
  • 注意逗号前后不能有空格,80, 443 会被当成两个独立参数导致失败

规则顺序、拒绝方式、持久化路径、扩展模块依赖——这些点不踩坑,iptables 才算真正可控。尤其是 -I-A 混用后又没加 --line-numbers 查,删错规则是分分钟的事。

text=ZqhQzanResources