在 Debian 上遇到 iptables 规则“失效”,通常不是 iptables 本身坏了,而是系统机制或配置方式发生了变化。下面按最常见原因逐一说明,并给出解决办法。
从 Debian 10(Buster)开始:
iptables 实际是 iptables-nft(指向 nftables 的兼容层)iptables -A ...iptables -L 看得到规则iptables -V
如果看到:
iptables v1.x (nf_tables)
说明你在用 nftables 后端。
✅ 方案 1:统一用 nftables(推荐)
nft list ruleset
直接写 nftables 规则。
✅ 方案 2:强制使用 legacy iptables
update-alternatives --config iptables
选择:
iptables-legacy
然后:
systemctl disable nftables
systemctl stop nftables
filter 表加了 NAT 规则INPUT 链期望影响转发流量-j ACCEPT / DROP# 允许 SSH
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 做 NAT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Debian 不会自动保存 iptables 规则。
apt install iptables-persistent
netfilter-persistent save
或:
iptables-save > /etc/iptables/rules.v4
如果你装了 Docker:
iptables -L DOCKER
--iptables=false(不推荐)systemctl status ufw
systemctl status firewalld
systemctl stop ufw
systemctl disable ufw
极少见,但可能:
lsmod | grep iptable
缺失可加载:
modprobe iptable_filter
iptables 自上而下匹配,命中即停止
❌ 错误示例:
iptables -A INPUT -j DROP
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
✅ 正确:
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -j DROP
iptables -V
nft list ruleset
iptables -L -n -v
systemctl status nftables ufw
如果你愿意,可以把:
iptables -L -n -v发出来,我可以直接帮你定位是哪一条原因。