还在守着老掉牙的 iptables 苦苦挣扎吗?说实话,那套规则写起来又长又臭,还得分别管 IPv4 和 IPv6,折腾久了真让人头大。现在的 Linux 世界,nftables 才是正统接班人。它不仅性能更强,最香的是一套规则就能通杀各种协议。
不过,折腾防火墙这种底层东西,我建议大家千万别直接在自己的办公电脑或者重要的生产服务器上瞎搞。万一一行命令敲错,把自己反锁在外面(SSH断连)是常有的事。
我个人习惯在搞这类网络实验时,先撸一台便宜的云服务器跑通流程。我最近一直在用 雨云的机器,确实挺适合咱们开发者:
- 不怕失联:自带网页版 VNC 远程控制台,就算防火墙规则写错了导致 SSH 进不去,也能从网页端连上去救场。
- 网络极其丝滑:香港、洛杉矶和日本的线路延迟都很低,拉取各种依赖包和工具秒完,不卡进度。
- 成本极低:玩腻了随时重装,或者直接删机也不心疼。
- 省事儿:后台可以一键预装 1Panel、Docker 之类的环境,想顺便搭个服务测防火墙非常快。
准备好环境,咱们直接开干,看看怎么调教这只"新一代防火墙"。
一、 为什么我们要抛弃 iptables?
简单对比下,你就知道 nftables 赢在哪里了:
| 特性 | iptables |
nftables (YYDS) |
|---|---|---|
| 协议支持 | IPv4/IPv6 要分开用不同工具管理 | 统一 inet 族,一套规则全搞定 |
| 规则语法 | 迷宫式的命令参数,很难读 | 类似编程语言的结构化语法 |
| 性能表现 | 规则多的时候性能掉得厉害 | 经过优化,在大规模规则下依旧高效 |
| 动态更新 | 改一下规则可能要重载整个规则集 | 支持原子化更新,不会导致连接中断 |
二、 安装 nftables
各大主流发行版的源里基本都有它,按需自取:
Ubuntu / Debian 用户:
console
$ sudo apt update
$ sudo apt install nftables -y
Rocky Linux / AlmaLinux 用户:
console
$ sudo dnf update
$ sudo dnf install -y nftables
Arch Linux 用户:
console
$ sudo pacman -S nftables
装完之后,老规矩,先把服务跑起来并设为开机自启:
console
$ sudo systemctl enable nftables
$ sudo systemctl start nftables
$ sudo systemctl status nftables
三、 核心概念:表、链与钩子
在 nftables 里,你要记住这个层级:表 (Table) > 链 (Chain) > 规则 (Rule)。
- 表 :规则的容器。一般用
inet族,这样 IPv4 和 IPv6 就都能管了。 - 链 :决定什么时候处理流量。常用的钩子(Hook)有
input(进来的)、forward(路过的)、output(出去的)。 - 策略 (Policy):如果没匹配到任何规则,默认是放行(accept)还是丢弃(drop)。
特别提醒 :如果你是远程操作,默认策略千万别急着改成 drop,除非你已经写好了允许 SSH(22端口)进入的规则,否则敲完回车你就会体验到什么叫"失联的痛苦"。
如果是用我提到的 雨云服务器,遇到这种情况也不用方,直接去控制台点"VNC"进去改回来就行。
四、 实战配置:手把手带你配一套安全规则
咱们来整一个最常用的基础防火墙方案。
1. 创建表和基础链
console
# 创建一个叫 my_firewall 的 inet 表
$ sudo nft add table inet my_firewall
# 添加输入链,默认先放行(方便配置)
$ sudo nft add chain inet my_firewall input { type filter hook input priority 0 \; }
2. 放行必要的流量
首先,必须保证已建立的连接和 SSH 不被卡死:
console
# 允许已经建立的连接(比如你正在操作的 SSH 会话)
$ sudo nft add rule inet my_firewall input ct state established,related accept
# 稳准狠地放行 22 端口(SSH)
$ sudo nft add rule inet my_firewall input tcp dport 22 accept
接下来放行 Web 服务的常用端口:
console
# 允许 HTTP 和 HTTPS
$ sudo nft add rule inet my_firewall input tcp dport 80 accept
$ sudo nft add rule inet my_firewall input tcp dport 443 accept
3. 拦截讨厌的 IP
发现某个 IP 一直在扫你?直接拉黑:
console
$ sudo nft add rule inet my_firewall input ip saddr 192.0.2.10 drop
4. 查看和管理
想看看自己写了啥?
console
# 列出带句柄编号的规则(删除时有用)
$ sudo nft list chain inet my_firewall input -a
如果你想删掉刚才拦截 IP 的那条规则,看清楚它后面的 handle 编号(假设是 5):
console
$ sudo nft delete rule inet my_firewall input handle 5
五、 进阶:NAT 转发与永久保存
如果你想把这台机器当成网关或者是做端口转发,得先开启内核转发:
编辑 /etc/sysctl.conf,把 net.ipv4.ip_forward=1 前面的注释去掉,然后执行 sudo sysctl -p。
然后配置 NAT 伪装:
console
$ sudo nft add table nat
$ sudo nft add chain nat postrouting { type nat hook postrouting priority 100 \; }
$ sudo nft add rule nat postrouting oif enp1s0 masquerade
最重要的步骤:保存规则!
nft 命令敲完是立即生效的,但重启就没了。咱们得把它持久化:
console
$ sudo nft list ruleset | sudo tee /etc/nftables.conf
$ sudo systemctl restart nftables
六、 总结
nftables 看着高大上,其实只要理解了表和链的逻辑,比 iptables 好用太多了。特别是它的语法非常清晰,甚至能支持 limit rate 这种高级限速功能,防止别人暴力破解 SSH:
console
$ sudo nft add rule inet my_firewall input tcp dport 22 limit rate 3/minute accept


还是那句话,技术这东西光看是不行的,得练。大家可以去搞台 雨 云 的测试机 按照上面的命令敲一遍。反正有一元试用,哪怕把系统搞崩了,后台点一下重装也就几秒钟的事。把防火墙这块硬骨头啃下来,你的服务器安全水平绝对能上一个台阶。