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

iptables -A 和 -I 的区别到底怎么选
加规则时用 -A 还是 -I,直接决定流量是否被拦死。默认链(INPUT、FORWARD、OUTPUT)是按顺序匹配的,一旦某条规则匹配成功,就执行对应动作(ACCEPT 或 DROP),后续规则不再检查。
-
-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+ 默认用
nftables,iptables命令只是兼容层,保存规则实际走 nft,别混用 - 手动写配置文件后,务必用
iptables-restore 测试能否加载成功,语法错会导致整条链清空
匹配多端口时 -m multiport 必须和 --dports 同时出现
想一次放行 80、443、22 端口,不能只写 --dport 80,443,22,会报错或只匹配第一个。
- 正确写法:
-m multiport --dports 80,443,22;--dports是multiport模块的专用参数,没加载模块就不认识这个选项 -
--sports用于源端口,--dports用于目标端口,别写反;单端口场景用--dport(无 s)更简洁 - multiport 最多支持 15 个端口,超了得拆成多条规则,或者改用
ipset - 注意逗号前后不能有空格,
80, 443会被当成两个独立参数导致失败
-I 和 -A 混用后又没加 --line-numbers 查,删错规则是分分钟的事。










