温馨提示×

ubuntu iptables为何失效

小樊
49
2026-09-09 22:17:09
栏目: 智能运维

在 Ubuntu 上 iptables“看起来失效” 是很常见的问题,通常不是 iptables 本身坏了,而是被其他机制接管或规则没真正生效。下面按最常见原因逐一说明,并给出排查方法。


一、最常见原因:被 nftables / ufw 接管

1. Ubuntu 默认用 ufw

Ubuntu 桌面/服务器默认启用 ufw(基于 iptables 的封装)。

sudo ufw status

如果显示 active,你直接写的 iptables 规则可能被 ufw 覆盖。

✅ 解决:

  • 用 uFW 管理:
    sudo ufw allow 22
    
  • 或彻底关闭 ufw:
    sudo ufw disable
    

2. 新版本 Ubuntu 使用 nftables 后端

Ubuntu 20.04+ 很多版本:

  • iptables 实际是 iptables-nft
  • 真正规则由 nftables 管理

检查:

iptables -V

如果显示:

iptables v1.8.x (nf_tables)

说明是 nft 后端。

✅ 排查:

sudo nft list ruleset

如果你用 iptables 写规则,但 nftables 有冲突规则,就会“失效”。


二、规则写错链(非常常见)

错误示例

iptables -A INPUT -p tcp --dport 80 -j DROP

但:

  • 流量走的是 FORWARD(路由器/容器)
  • 或已经 ACCEPT 在前面

✅ 正确思路:

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

检查顺序:

iptables -L INPUT -n --line-numbers

三、Docker 导致 iptables 失效(非常典型)

Docker 会自动管理 iptables,并插入自己的规则。

现象:

  • 你 DROP 了端口
  • Docker 容器仍然能访问

原因:

  • Docker 使用 DOCKER-USER
  • 必须在 DOCKER-USER 里写规则

✅ 正确做法:

iptables -I DOCKER-USER -p tcp --dport 3306 -j DROP

查看:

iptables -L DOCKER-USER -n

四、规则未保存(重启失效)

iptables 默认不持久化

Ubuntu 传统方式

sudo apt install iptables-persistent
sudo netfilter-persistent save

否则:

  • 重启后规则全没

五、网络命名空间问题

如果你在:

  • Docker
  • LXC
  • Kubernetes
  • 容器里

你看到的 iptables 不是宿主机的

✅ 检查:

ip netns

六、被 conntrack / 已建立连接绕过

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

如果你后面才加 DROP,已建立的连接不会断。


七、快速自检清单 ✅

# 1. 是否启用 ufw
sudo ufw status

# 2. iptables 后端
iptables -V

# 3. 查看规则
sudo iptables -S
sudo iptables -L -n -v

# 4. 是否有 nftables
sudo nft list ruleset

# 5. 是否 Docker
docker ps
iptables -L DOCKER-USER

八、推荐做法(2024+)

  • 服务器防火墙:用 ufw
  • 复杂规则:用 nftables
  • Docker:只改 DOCKER-USER
  • 别混用 iptables + nftables

如果你愿意,可以告诉我:

  • Ubuntu 版本
  • 是否用 Docker
  • 具体“失效”的现象(端口仍能访问?还是完全没反应?)

我可以直接帮你写正确可用的规则

0