温馨提示×

iptables在Debian为何失效

小樊
39
2026-07-01 22:43:15
栏目: 智能运维

在 Debian(以及多数现代 Linux 发行版)中,iptables 看似失效通常不是因为它坏了,而是因为被其他机制覆盖或接管。下面按常见原因 → 排查方法 → 解决办法系统讲一遍。


一、最常见的 6 个原因(90% 都在这里)

1️⃣ iptables 规则没保存,重启后消失

Debian 不会自动保存 iptables 规则

iptables -L
# 能看到规则
reboot
iptables -L
# 规则没了

✅ 解决:

apt install iptables-persistent
netfilter-persistent save

规则会保存在:

/etc/iptables/rules.v4
/etc/iptables/rules.v6

2️⃣ nftables 接管了 netfilter(最常见)

Debian 10+ 默认 使用 nftables 替代 iptables

你用的 iptables 实际可能是:

iptables -> xtables-nft-multi

这导致:

  • iptables -L 显示不到全部规则
  • 或规则被 nftables 覆盖

✅ 检查:

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; }'

3️⃣ Docker / Kubernetes 自动修改规则

Docker 会动态修改 iptables

你手动加的规则:

  • 被 Docker 链覆盖
  • 插入位置不对

✅ 检查:

iptables -t nat -L -n
iptables -L DOCKER-USER -n

✅ Docker 正确做法:

iptables -I DOCKER-USER -p tcp -m tcp --dport 22 -j ACCEPT

⚠️ 不要直接改 FORWARD 链的最前


4️⃣ 规则顺序错误(匹配不到)

iptables 从上到下匹配,第一条命中即停止

例如:

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

❌ 第二条永远不会生效

✅ 正确做法:

iptables -I INPUT -p tcp --dport 22 -j ACCEPT

5️⃣ 规则加错表或链

常见错误:

  • filter 表规则没生效 → 实际需要 nat / mangle
  • 出站规则写在 INPUT

✅ 检查:

iptables -t nat -L
iptables -t mangle -L

✅ 常用链对照:

用途
INPUT 本机接收
OUTPUT 本机发出
FORWARD 转发
PREROUTING 路由前
POSTROUTING 路由后

6️⃣ 系统启用了 ufw / firewalld

Debian 常见:

  • ufw 后台管理 iptables
  • 你手动写的规则被 ufw 覆盖

✅ 检查:

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

三、Debian 推荐做法(重点)

✅ 新系统

  • Debian 10+
  • 直接学 nftables
  • 不要再长期维护 iptables

✅ 老系统 / 运维习惯

  • 使用 iptables-legacy
  • 配合 iptables-persistent
  • 避免和 Docker + nftables 混用

四、常见“看起来失效”的真实原因总结

现象 真正原因
重启失效 没保存
规则存在但不生效 被 nftables 覆盖
Docker 后规则乱 Docker 改 iptables
端口仍不通 规则顺序错误
ufw 关了还不通 ufw 没清规则

如果你愿意,可以直接把下面信息发我:

  • Debian 版本:cat /etc/debian_version
  • iptables -L -n
  • 是否使用 Docker / ufw
  • 具体失效的规则

我可以 直接帮你指出哪一条导致失效

0