温馨提示×

debian iptables为何失效

小樊
87
2026-09-10 16:06:31
栏目: 智能运维

在 Debian 上 iptables“失效” 通常不是 iptables 本身坏了,而是被其他机制接管或规则没真正生效。下面按最常见原因逐一说明。


一、Debian 默认用 nftables 接管(最常见)

从 Debian 10(Buster)开始:

  • iptables 命令 默认是 nftables 的兼容层
  • 真正内核使用的是 nftables
  • 你写的 iptables 规则可能:
    • 没被加载
    • 被 nftables 规则覆盖
    • 或根本不在同一个表中

检查方式

iptables -V

如果看到:

iptables v1.8.x (nf_tables)

说明 iptables 是 nft 封装

解决

查看真实规则:

nft list ruleset

如果你要用“老式 iptables”:

update-alternatives --config iptables

选择:

iptables-legacy

然后重启或重新加载规则。


二、iptables 规则没保存(重启后失效)

Debian 不会自动保存 iptables 规则

临时规则(重启就没)

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

永久保存(传统方式)

apt install iptables-persistent
netfilter-persistent save

规则保存在:

/etc/iptables/rules.v4

三、Docker 直接改 iptables(非常常见)

如果你装了 Docker:

  • Docker 会 自动写 iptables 规则
  • 你自己写的规则可能被 Docker 覆盖
  • 特别是 FORWARD 链

现象

  • 本机防火墙“没用”
  • 容器端口还是能访问

检查

iptables -L -n -v

解决

  • 不要直接在 FORWARD 链乱改
  • 用 Docker 的:
    --iptables=false
    
    或在 daemon.json 中配置

四、规则顺序错误(被前面规则放行/拒绝)

iptables 自上而下匹配,命中即停

例如:

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

→ 22 端口永远不会被 DROP

正确方式

iptables -I INPUT 1 -p tcp --dport 22 -j DROP

五、策略(Policy)没设置对

如果你只加了规则,但:

iptables -P INPUT ACCEPT

那默认就是放行。

常见安全配置

iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

六、系统用了 firewalld / ufw

Debian 上常见冲突:

  • ufw
  • firewalld

检查

ufw status
systemctl status firewalld

建议

只用一种防火墙

systemctl stop ufw
systemctl disable ufw

七、你改的是 IPv6,但测试的是 IPv4

  • iptables → IPv4
  • ip6tables → IPv6

如果服务监听 ::,但只配了 iptables,也会“像失效”。


快速自查清单 ✅

iptables -V
nft list ruleset
iptables -L -n -v
systemctl status docker
ufw status

如果你愿意,可以贴出:

  • Debian 版本
  • iptables -L -n -v 输出
  • 你期望限制什么流量

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

0 踩