在 Debian(以及多数现代 Linux 发行版)中,iptables 看似失效通常不是因为它坏了,而是因为被其他机制覆盖或接管。下面按常见原因 → 排查方法 → 解决办法系统讲一遍。
Debian 不会自动保存 iptables 规则。
iptables -L
# 能看到规则
reboot
iptables -L
# 规则没了
✅ 解决:
apt install iptables-persistent
netfilter-persistent save
规则会保存在:
/etc/iptables/rules.v4
/etc/iptables/rules.v6
Debian 10+ 默认 使用 nftables 替代 iptables。
你用的 iptables 实际可能是:
iptables -> xtables-nft-multi
这导致:
iptables -L 显示不到全部规则✅ 检查:
ls -l $(which iptables)
nft list ruleset
✅ 解决(二选一):
方案 A:禁用 nftables,回到 iptables-legacy
update-alternatives --config iptables
update-alternatives --config ip6tables
选 iptables-legacy
方案 B:统一用 nftables(推荐)
nft add table inet filter
nft add chain inet filter input '{ type filter hook input priority 0; }'
Docker 会动态修改 iptables。
你手动加的规则:
✅ 检查:
iptables -t nat -L -n
iptables -L DOCKER-USER -n
✅ Docker 正确做法:
iptables -I DOCKER-USER -p tcp -m tcp --dport 22 -j ACCEPT
⚠️ 不要直接改 FORWARD 链的最前
iptables 从上到下匹配,第一条命中即停止。
例如:
iptables -A INPUT -j DROP
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
❌ 第二条永远不会生效
✅ 正确做法:
iptables -I INPUT -p tcp --dport 22 -j ACCEPT
常见错误:
✅ 检查:
iptables -t nat -L
iptables -t mangle -L
✅ 常用链对照:
| 链 | 用途 |
|---|---|
| INPUT | 本机接收 |
| OUTPUT | 本机发出 |
| FORWARD | 转发 |
| PREROUTING | 路由前 |
| POSTROUTING | 路由后 |
Debian 常见:
✅ 检查:
ufw status
systemctl status firewalld
✅ 解决:
ufw disable
# 或统一用 ufw
ufw allow 22/tcp
# 1. 看规则
iptables -t filter -L -n -v
iptables -t nat -L -n
# 2. 看是否被 nftables 接管
nft list ruleset
# 3. 看 iptables 后端
update-alternatives --display iptables
# 4. 是否启用 ufw
ufw status
# 5. 是否 Docker
docker ps
iptables -L DOCKER-USER
iptables-legacyiptables-persistent| 现象 | 真正原因 |
|---|---|
| 重启失效 | 没保存 |
| 规则存在但不生效 | 被 nftables 覆盖 |
| Docker 后规则乱 | Docker 改 iptables |
| 端口仍不通 | 规则顺序错误 |
| ufw 关了还不通 | ufw 没清规则 |
如果你愿意,可以直接把下面信息发我:
cat /etc/debian_versioniptables -L -n我可以 直接帮你指出哪一条导致失效 ✅