nft常用命令及其参数解释

nftnf_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、示例

  1. 放行 HTTP(80/tcp)和 HTTPS(443/tcp)

    nft add rule inet filter input tcp dport { 80, 443 } accept
    
  2. 放行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
    
  3. 源地址转换(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
    
  4. 目的地址转换(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
    
posted @ 2025-08-19 15:02  wanghongwei-dev  阅读(192)  评论(0)    收藏  举报