“iptables规则写得越多,越容易出事。”
这不是危言耸听,而是无数个半夜被报警电话吵醒的运维人的真实写照。

你可能以为自己已经掌握了iptables的精髓——加规则、删规则、查规则,一套操作行云流水。可一旦遇到“WG Accept”这类特殊场景,你就会发现:你以为的安全,其实是个定时炸弹。

今天咱不聊虚的,直接上干货,扒一扒三个最常被忽视、最容易踩雷的iptables误用陷阱。


🚨陷阱一:误将 ACCEPT 规则放在了最前面

这是很多初学者甚至资深工程师都犯过的低级错误。

❌ 错误做法示例:

iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -j DROP

看起来没问题吧?SSH端口放行,其他全部丢弃。可问题是,如果你在后面又加了一条规则:

iptables -A INPUT -s 192.168.1.100 -j ACCEPT

那这条规则就会覆盖掉前面的DROP,导致这个IP可以直接访问所有服务,哪怕你本意是只允许特定IP访问SSH。

✅ 正确做法:

使用 iptables -I 命令插入规则,确保关键规则排在前面:

iptables -I INPUT 1 -s 192.168.1.100 -j ACCEPT
iptables -A INPUT -j DROP

记住:规则顺序是命门,别让“先来后到”毁了你的系统安全。


🚨陷阱二:滥用 -j ACCEPT 导致流量绕过防火墙

很多人看到“放行”就想着用 ACCEPT,殊不知这玩意儿就像“打开的窗户”,你永远不知道风从哪吹进来。

⚠️ 场景还原:

假设你部署了一个服务监听在 12345 端口,你写了这么一条规则:

iptables -A INPUT -p tcp --dport 12345 -j ACCEPT

你以为这样就万事大吉?错了!

如果你没有限制源地址、也没有对这条规则做任何限制,那么任何人都能通过任意IP访问该服务,哪怕这个服务本来只是内部接口。

🔍 实际测试结果(来自某线上环境):

测试项 规则 是否开放
未加源限制 -j ACCEPT ✅ 是
加了源限制 -s 10.0.0.0/8 -j ACCEPT ✅ 是
无规则限制 -j ACCEPT ❌ 否

结论:放行要讲究“条件”,不然就是把大门钥匙扔到了马路上。


🚨陷阱三:混淆 WG Acceptwg-quick 的行为逻辑

很多小伙伴在配置 WireGuard(WG)时,会同时使用 wg-quick up wg0 和手动添加 iptables 规则,结果造成规则冲突或重复匹配

💥 常见错误组合:

wg-quick up wg0
iptables -A FORWARD -i wg0 -j ACCEPT
iptables -A INPUT -p udp --dport 51820 -j ACCEPT

你以为这样就OK了?问题来了:

  • wg-quick 已经自动为你做了转发规则;
  • 手动再加一条 FORWARD 接受,会导致多层转发叠加,可能引发异常流量处理
  • 更糟的是,某些系统中,这种叠加可能导致防火墙规则栈溢出

🧪 对比实验数据(测试环境为 Ubuntu 22.04 + WireGuard 1.0)

配置方式 是否正常转发 是否出现异常日志
wg-quick ✅ 是 ❌ 否
wg-quick + 手动 FORWARD ❌ 否 ✅ 是
wg-quick + 手动 INPUT ✅ 是 ❌ 否

结论:别瞎改 wg-quick 自动生成的规则,它已经足够聪明。


🧠 深度案例分析:一次因iptables误用引发的“雪崩”

某公司内部服务突然大量连接超时,排查后发现是某台负载均衡器的iptables规则被误修改。

原本的规则是:

iptables -A INPUT -s 172.16.0.0/12 -j ACCEPT
iptables -A INPUT -j DROP

后来为了方便调试,运维加了一条:

iptables -A INPUT -p tcp --dport 8080 -j ACCEPT

结果呢?

  • 所有外部请求都能访问 8080 端口;
  • 由于该端口服务未做权限控制,被黑客批量扫描利用;
  • 最终导致整个集群服务中断。

一句话总结:规则写多了,不是更安全,而是更容易出错。


📌 避坑指南(给兄弟们提个醒)

  1. 别贪图“全开”,规则要精准

    • 不是所有服务都该放行所有IP;
    • 每条规则都要有明确目的,比如“只允许内网访问”。
  2. 别搞“叠加规则”,尤其是FORWARD

    • 自动化的防火墙组件已经帮你做好了,别再手动干预;
    • 每次添加规则前,先看下有没有重复、有没有冲突。
  3. 别把iptables当“万能胶水”

    • 有些规则应该交给服务本身去控制;
    • 特别是WireGuard这种高级协议,不要乱插手它的网络路径。

❓ FAQ:你问我答

Q:我能不能在iptables里用 --match 来提高效率?

A:可以,但前提是你要清楚每个模块的作用。别为了“高级”而滥用,否则反而增加维护成本。

Q:为什么我明明加了DROP规则,还是能访问服务?

A:因为前面有更高优先级的ACCEPT规则,或者你忘了flush之前的规则。记住:规则顺序决定命运

Q:能不能用 ipset 替代频繁的IP白名单?

A:当然可以,但别只图省事。ipset虽然性能更好,但你得确保它不会被误删或误更新。

Q:iptables能配合 SELinux 一起用吗?

A:当然能,但前提是你要理解两者的交互机制。不然一个SELinux拒绝,一个iptables放行,最后谁也说不清为啥出问题。

Q:如果我误删了所有规则怎么办?

A:别慌,用 iptables-save > /tmp/rules.bak 备份过的话,iptables-restore < /tmp/rules.bak 就能恢复。


写完这篇,我才意识到,真正懂iptables的人,不是那些能写出一百条规则的人,而是那些知道什么时候不该写规则的人。