Daimon's Blog
主页 归档 关于 RSS 探针 常用工具
主页
归档
关于
RSS
探针
常用工具

Linux 防火墙三国杀:ufw / firewalld / iptables / nftables 怎么选

daimon daimon 2026-05-02 #Linux#防火墙#iptables#nftables#ufw#firewalld

很多人在 Linux 上配防火墙时是懵的:装了 ufw,又听说要用 iptables,新系统又说要换 nftables,红帽系上还有个 firewalld,到底是什么关系?

这篇先把它们的层级关系画清楚,然后再讲怎么选。

一、四层结构:从内核到用户#

graph TD U1[ufw] --> M1 U2[firewalld] --> M1 U3[手写规则] --> M1 M1[iptables 命令] --> N M2[nftables 命令] --> N N[Netfilter
Linux 内核模块] --> P[网络包流过内核时
按规则放行 / 丢弃]
层级角色是什么
内核NetfilterLinux 内核自带的包过滤框架,所有发行版都有
管理iptables / nftables 命令用户态命令行工具,把你的规则翻译成内核能懂的语言
前端ufw / firewalld更友好的封装,帮你写 iptables/nftables 规则

核心结论:

  • Netfilter 是内核功能,不可选,永远在。
  • iptables vs nftables:iptables 是老工具,nftables 是 2014 年出现的替代品(语法更统一、性能更好)。新发行版默认都是 nftables(Ubuntu 20.04+、Debian 10+、CentOS 8+)。
  • ufw vs firewalld:两者都是”前端”,只是不同发行版预装的不同:
发行版默认预装
Ubuntu / Debian 系ufw
CentOS / RHEL / Fedora 系firewalld
Arch都不装,用户自己选

💡 注意:ufw 和 firewalld 不绑定发行版,Ubuntu 上也能装 firewalld,Fedora 上也能装 ufw。

二、“假 iptables”:兼容层是怎么回事#

新发行版上敲 iptables,它其实是 iptables-nft——把 iptables 语法翻译成 nftables 规则执行,底层根本不是真的 iptables。

Terminal window
1
iptables --version
2
# iptables v1.8.7 (nf_tables) ← 兼容层(背后是 nftables)
3
# iptables v1.8.7 (legacy) ← 真正的 iptables

🪤 这就是为什么有时候用老教程的 iptables 命令在新系统上行为不一致——你以为是 iptables,其实是 nftables 翻译过来的。

三、“为什么 ufw 显示没规则,但还是有规则在拦截?”#

这是新手最高频的疑问,答案是:

✅ ufw 只管 ufw 自己写入的规则。Docker、fail2ban 等程序会直接往 iptables/nftables 里写规则,ufw 看不到。

Terminal window
1
# ufw 看到的(只是 ufw 自己的)
2
sudo ufw status
3
4
# iptables 看到的(所有规则,包括 docker、fail2ban 写的)
5
sudo iptables -L -n -v
6
sudo iptables -t nat -L -n -v
7
8
# nftables 看到的(新发行版)
9
sudo nft list ruleset

实战中最常踩的两个例子:

现象原因
ufw deny 80 了,docker 容器还能从公网访问Docker 自己在 nat 表里写了 DNAT 规则,绕开了 ufw 的 INPUT 链
fail2ban 封了 IP,但 ufw status 看不到fail2ban 走的是自己创建的链

四、规则的持久化#

工具持久化方式
ufw自带(重启自动恢复)
firewalld自带(runtime + permanent 双套规则)
裸 iptables默认重启清空,需装 iptables-persistent
裸 nftables默认重启清空,需写入 /etc/nftables.conf

iptables-persistent 的配置文件:

1
/etc/iptables/rules.v4 # IPv4 规则
2
/etc/iptables/rules.v6 # IPv6 规则
  • apt purge iptables-persistent 会删除上面的配置文件。
  • apt remove iptables-persistent 会保留配置文件,下次重装能复用。

五、ufw 速查(最推荐新手用)#

ufw(Uncomplicated Firewall)是 Debian/Ubuntu 上最简单的防火墙前端,但它在所有 Linux 上都能装。

5.1 基础操作#

Terminal window
1
# 启用 / 关闭
2
sudo ufw enable
3
sudo ufw disable
4
5
# 看状态
6
sudo ufw status
7
sudo ufw status numbered # 带规则编号(删除时用)
8
9
# 重新加载
10
sudo ufw reload
11
12
# 重置(清空所有规则)
13
sudo ufw --force reset

5.2 默认策略#

Terminal window
1
# 默认拒绝所有入站(强烈推荐)
2
sudo ufw default deny incoming
3
4
# 默认允许所有出站
5
sudo ufw default allow outgoing

5.3 添加规则#

Terminal window
1
# 按端口
2
sudo ufw allow 22
3
sudo ufw allow 80/tcp
4
sudo ufw allow 443
5
6
# 按服务名(看 /etc/services)
7
sudo ufw allow ssh
8
9
# 按 IP 限制
10
sudo ufw allow from 192.168.1.100
11
sudo ufw allow from 192.168.1.100 to any port 22
12
13
# 拒绝
14
sudo ufw deny 22

5.4 删除规则#

Terminal window
1
# 按编号删(先用 numbered 查编号)
2
sudo ufw status numbered
3
sudo ufw delete 3
4
5
# 按内容删
6
sudo ufw delete allow 80
7
sudo ufw delete deny 22

5.5 典型 VPS 配置#

Terminal window
1
sudo ufw default deny incoming
2
sudo ufw default allow outgoing
3
sudo ufw allow 22000/tcp # 改了的 SSH 端口
4
sudo ufw allow 80/tcp
5
sudo ufw allow 443/tcp
6
sudo ufw allow from <办公室 IP> to any port 9090 # 面板限制 IP
7
sudo ufw enable

六、firewalld 速查#

红帽系上常见,特点是”区域(zone)“概念:

Terminal window
1
# 状态
2
sudo firewall-cmd --state
3
sudo systemctl status firewalld
4
5
# 看当前 zone
6
sudo firewall-cmd --get-default-zone
7
sudo firewall-cmd --get-active-zones
8
9
# 看 zone 里的规则
10
sudo firewall-cmd --list-all
11
12
# 加端口(runtime + 永久)
13
sudo firewall-cmd --add-port=8080/tcp
14
sudo firewall-cmd --add-port=8080/tcp --permanent
15
16
# 加服务
17
sudo firewall-cmd --add-service=http --permanent
18
19
# 重新加载
20
sudo firewall-cmd --reload
21
22
# 删除规则
23
sudo firewall-cmd --remove-port=8080/tcp --permanent

⚠️ firewalld 区分 runtime 和 permanent,不加 --permanent 重启就丢,改完都要 firewall-cmd --reload。

七、原生 nftables 速查#

新系统的”正经”方式:

Terminal window
1
# 看所有规则
2
sudo nft list ruleset
3
4
# 看某个表
5
sudo nft list table inet filter
6
7
# 加一个 inet 类型的 filter 表
8
sudo nft add table inet filter
9
10
# 加 input 链(默认 drop)
11
sudo nft add chain inet filter input { type filter hook input priority 0\; policy drop\; }
12
13
# 允许已建立的连接
14
sudo nft add rule inet filter input ct state established,related accept
15
16
# 允许 SSH
17
sudo nft add rule inet filter input tcp dport 22 accept
18
19
# 保存到 /etc/nftables.conf(持久化)
20
sudo nft list ruleset > /etc/nftables.conf
21
sudo systemctl enable --now nftables

/etc/nftables.conf 完整模板:

1
#!/usr/sbin/nft -f
2
3
flush ruleset
4
5
table inet filter {
6
chain input {
7
type filter hook input priority 0; policy drop;
8
ct state established,related accept
9
iifname lo accept
10
tcp dport 22 accept
11
tcp dport { 80, 443 } accept
12
}
13
chain forward {
14
type filter hook forward priority 0; policy drop;
15
}
16
chain output {
17
type filter hook output priority 0; policy accept;
18
}
19
}

八、原生 iptables 速查#

老系统 / 兼容层都能用:

Terminal window
1
# 看规则
2
sudo iptables -L -n -v --line-numbers
3
4
# 清空规则
5
sudo iptables -F
6
sudo ip6tables -F
7
8
# 设置默认策略
9
sudo iptables -P INPUT DROP
10
sudo iptables -P FORWARD DROP
11
sudo iptables -P OUTPUT ACCEPT
12
13
# 允许 loopback
14
sudo iptables -A INPUT -i lo -j ACCEPT
15
16
# 允许已建立连接
17
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
18
19
# 允许 SSH / HTTP / HTTPS
20
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
21
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
22
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
23
24
# 保存(需要 iptables-persistent)
25
sudo netfilter-persistent save

九、如何选#

场景推荐
新手 / 简单 VPSufw
红帽系生产环境firewalld
容器 / 复杂规则 / 写脚本直接 nftables
维护老系统iptables
想要可视化 / 配合面板装 ufw 让 1Panel/宝塔托管

💡 不要同时启用 ufw 和 firewalld。两者会互相冲突,规则乱掉之后排查是噩梦。

十、清掉所有”奇怪规则”的标准动作#

VPS 拿到手发现防火墙规则乱七八糟想从头开始时:

Terminal window
1
# 1. 停掉 / 卸载所有防火墙前端
2
sudo systemctl stop ufw
3
sudo systemctl disable ufw
4
sudo apt purge -y iptables-persistent ufw
5
6
# 2. 清空内存中的规则
7
sudo iptables -F
8
sudo iptables -X
9
sudo iptables -t nat -F
10
sudo iptables -t nat -X
11
sudo ip6tables -F
12
sudo ip6tables -X
13
14
# 3. 重置默认策略为 ACCEPT(避免清空后断 SSH)
15
sudo iptables -P INPUT ACCEPT
16
sudo iptables -P FORWARD ACCEPT
17
sudo iptables -P OUTPUT ACCEPT
18
19
# 4. 重启确认
20
sudo reboot
21
22
# 5. 重启后再装回想用的工具
23
sudo apt install -y ufw

⚠️ 清空策略前先把 INPUT 默认改成 ACCEPT,否则一清空就断 SSH,下场是去厂商面板用 VNC 救机器。

十一、几条实用经验#

  • VPS 上配防火墙顺序:先 allow SSH 再 enable,反着来就是自己锁外面了。
  • 改 SSH 端口务必同步加防火墙规则,否则改完 ssh -p 新端口连不上。
  • Docker 容器端口对外可达是 Docker 自己写的 iptables 规则,不归 ufw 管——要限制 Docker 容器对外暴露,得改 docker-compose 的 ports 写法(绑 127.0.0.1)。
  • fail2ban 的封禁也是直接写 iptables,看封禁状态用 fail2ban-client status sshd,不是 ufw status。
  • 新系统直接学 nftables 就行,iptables 是历史包袱。

理解到这个层级,再去看任何”防火墙规则没生效”的问题,都能直接定位到底是哪一层在拦。

SSH 安全登录终极配置:从密钥生成到 fail2ban
systemd 服务管理与日志查看实战
本博客所有文章除特别声明外,均遵循 CC BY-NC-SA 4.0 协议,转载请注明出处。
博客框架 Astro & Fuwari
冀ICP备20260167号
1
一、四层结构:从内核到用户
2
二、“假 iptables”:兼容层是怎么回事
3
三、“为什么 ufw 显示没规则,但还是有规则在拦截?”
4
四、规则的持久化
5
五、ufw 速查(最推荐新手用)
5.1 基础操作
5.2 默认策略
5.3 添加规则
5.4 删除规则
5.5 典型 VPS 配置
6
六、firewalld 速查
7
七、原生 nftables 速查
8
八、原生 iptables 速查
9
九、如何选
10
十、清掉所有”奇怪规则”的标准动作
11
十一、几条实用经验