nft常用命令及其参数解释
nft 是 nf_tables 防火墙框架的管理工具,用于配置和查看内核中的网络规则。可以灵活配置 nf_tables 的表、链、规则和集合,实现流量过滤、NAT 转换、端口转发等功能。
1、表(Table)管理
表是 nf_tables 的顶层结构,按协议族(如 IPv4、IPv6)分类,用于容纳链和规则。
- 协议族:ip(IPv4)、ip6(IPv6)、inet(IPv4+IPv6)、arp(ARP 协议)、bridge
- 表名自定义(如 filter、nat、mangle)
# 创建表。nft add table <协议族> <表名>
# 创建一个同时处理 IPv4/IPv6 的 filter 表
nft add table inet filter
# 列出所有表(仅显示协议族和表名)。示例输出:table ip filter、table inet firewalld
nft list tables
# 查看指定表的详细信息(包含表中的链和规则)。nft list table <协议族> <表名>
nft list table ip nat
# 删除指定表(需先删除表中的所有链和规则)。nft delete table <协议族> <表名>
nft delete table ip filter
2、链(Chain)管理
链依附于表,包含具体规则,按 “钩子点”(流量经过的位置)和优先级划分。属性包括:
- type <类型>(链的功能类型:filter 过滤、nat 地址转换、route 路由等)
- hook <钩子点>(流量触发链的位置:input 入站、output 出站、forward 转发、prerouting 路由前、postrouting 路由后)
- priority <优先级>(链的执行顺序,数值越小优先级越高,如 -100、0、100)
- policy <动作>(不匹配任何规则时的动作:accept 允许、drop 丢弃、reject 拒绝)
# 创建链。nft add chain <协议族> <表名> <链名> '{ <属性> }'
# 在 inet filter 表中创建 input 链,入站钩子,默认丢弃
nft add chain inet filter input '{ type filter hook input priority 0; policy drop; }'
# 列出所有链(显示所属协议族、表名、链名及基本属性)
nft list chains
# 查看指定链的详细信息(包含链中的规则)。nft list chain <协议族> <表名> <链名>
nft list chain inet filter input
# 删除指定链(需先删除链中的所有规则)。nft delete chain <协议族> <表名> <链名>
nft delete chain ip filter input
3、规则(Rule)管理
规则定义匹配条件和动作,用于处理流经链的流量。
- 匹配条件:如 ip saddr 192.168.1.0/24(源 IP)、tcp dport 80(TCP 目的端口)、iif eth0(入站网卡)、ct state established(连接状态为已建立)等
- 动作:accept(允许)、drop(丢弃)、reject with icmpx admin-prohibited(拒绝并返回提示)、jump/goto <链名>(跳转至其他链)、snat to 203.0.113.5(源地址转换)等
jump和goto的区别:
- jump:在执行jump时,会保存当前链的状态,包括当前规则的位置等信息,以便在目标链执行完毕后能够返回到原来的链继续执行后续规则
- goto:goto在跳转时不会保存当前链的状态,一旦跳转到目标链,就不会再回到原来的链继续执行
# 添加或插入规则(add/insert)。nft add/insert rule <协议族> <表名> <链名> <匹配条件> <动作>
nft add rule inet filter input tcp dport 22 accept
nft add rule ip filter input ip saddr 10.0.0.5 drop
# 查看所有规则(包含所有表、链和规则,最全面的查看方式)
# -a, --handle 显示规则句柄(handle),用于修改/删除
# -n, --numeric 以数字显示 IP/端口(不解析名称)
nft list ruleset
# 删除指定规则。nft delete rule <协议族> <表名> <链名> handle <句柄>
# 获取规则的 handle 编号,然后删除 input 链中句柄为 5 的规则
nft -a list chain inet filter input
nft delete rule inet filter input handle 5
# 清空指定链中的所有规则(保留链本身)。nft flush chain <协议族> <表名> <链名>
nft flush chain ip filter input
4、集合(Set)管理
集合用于批量存储 IP、端口等匹配项,简化规则配置(类似 “地址组”“端口组”)。
- type:集合元素类型(ipv4_addr、ipv6_addr、inet_proto、tcp_port 等)
- flags:集合属性(constant 不可修改、dynamic 可动态添加元素、timeout 元素超时自动删除)
# 创建集合。nft add set <协议族> <表名> <集合名> '{ type <类型>; flags <标志>; }'
# 创建存储 IPv4 地址的动态集合
nft add set ip filter trusted_ips '{ type ipv4_addr; flags dynamic; }'
# 向集合添加元素。nft add element <协议族> <表名> <集合名> { <元素> }
nft add element ip filter trusted_ips { 192.168.1.100, 192.168.1.101 }
# 查看集合中的元素。nft list set <协议族> <表名> <集合名>
nft list set ip filter trusted_ips
# 从集合中删除元素。nft delete element <协议族> <表名> <集合名> { <元素> }
nft delete element ip filter trusted_ips { 192.168.1.100 }
# 删除集合。nft delete set <协议族> <表名> <集合名>
nft delete set ip filter trusted_ips
5、规则集持久化
nft 规则默认在系统重启后失效,需手动持久化:
# 导出当前规则集到配置文件
nft list ruleset > /etc/nftables.conf
# 从配置文件导入规则集(重启后加载)
nft -f /etc/nftables.conf
# 配置系统启动时自动加载 /etc/nftables.conf(多数 Linux 发行版支持)
systemctl enable --now nftables
6、示例
-
放行 HTTP(80/tcp)和 HTTPS(443/tcp):
nft add rule inet filter input tcp dport { 80, 443 } accept -
放行ping:
nft add rule ip filter input icmp type echo-request accept nft add rule inet filter input meta l4proto { icmp, icmpv6 } icmp type echo-request accept -
源地址转换(SNAT):将内网
192.168.1.0/24的出站流量源 IP 改为公网203.0.113.5:nft add table ip nat nft add chain ip nat postrouting '{ type nat hook postrouting priority 100; policy accept; }' nft add rule ip nat postrouting ip saddr 192.168.1.0/24 oif eth0 snat to 203.0.113.5 -
目的地址转换(DNAT):将公网
203.0.113.5:80的流量转发到内网192.168.1.100:8080:nft add rule ip nat prerouting ip daddr 203.0.113.5 tcp dport 80 dnat to 192.168.1.100:8080
作者:wanghongwei
版权声明:本作品遵循<CC BY-NC-ND 4.0>版权协议,商业转载请联系作者获得授权,非商业转载请附上原文出处链接及本声明。

浙公网安备 33010602011771号