初始化配置

iptables -F -t filter
iptables -F -t nat
iptables -F -t mangle
iptables -F -t raw
iptables -F -t security
iptables -X

添加默认表、簇、链

nft add table inet filter
nft add chain inet filter input { type filter hook input priority 100 \; }
nft add chain inet filter forward { type filter hook forward priority 100 \; }
nft add chain inet filter output { type filter hook output priority 100 \; }

nft add table ip nat
nft add chain ip nat prerouting { type nat hook prerouting priority -100 \; }
nft add chain ip nat postrouting { type nat hook postrouting priority 100 \; }

操作簇的方法

ip ip6 inet arp bridge
inet同时代表V4和V6
注意: inet 不能用于 nat 类型的链,只能用于 filter 类型的链。

nft 方法 表操作 簇 表名

nft list tables [<family>]
nft list table [<family>] <name> [-n] [-a]
nft (add | delete | flush) table [<family>] <name>

例如添加一个hy的表,使用IPV4
nft list tables
nft add table ip hy
nft delete table ip hy
清空一个表中的所有规则
nft flush table ip hy
nft 方法 chain 簇 表 链名
增删查,hy表中的p链

nft add chain ip hy p
nft delete chain ip hy p
nft list chain ip hy p


动作钩子

prerouting:刚到达并未被 nftables 的其他部分所路由或处理的数据包。
redirect: NAT钩子
masquerade: 源地址转换伪装
input:已经被接收并且已经经过 prerouting 钩子的传入数据包。
forward:如果数据报将被发送到另一个设备,它将会通过 forward 钩子。
output:从本地传出的数据包。
postrouting:仅仅在离开系统之前,可以对数据包进行进一步处理。


nft 方法 规则 表 链 动作(需要先创建钩子)
如下创建一个nat动作,将50000-6000的UDP端口数据包重定向到50000
nft 'add chain nat prerouting { type nat hook prerouting priority -100; }'
nft add rule nat prerouting redirect
nft add rule nat prerouting udp dport {50000-60000} redirect to 50000

替换规则

列出规则句柄

nft -a list ruleset

规则替换为句柄 2

nft replace rule hy p handle 2 counter


一些示例

计数动作

counter

接收数据包并计数 filter 表 output 链

nft add rule filter output counter accept

丢弃所有进入数据

nft add rule filter output drop

拒绝流量 filter 表 input 链 ct指示排除来源自身流量 所有新连接拒绝

nft add rule filter input ct state new reject

拒绝ICMP 并指定原因 filter 表 input 链

nft add rule filter input reject with icmp type host-unreachable

接口指定端口流量到目标地址 nat 表 prerouting 链

nft 'add chain nat prerouting { type nat hook prerouting priority -100; }'
nft  add rule nat prerouting iif eth0 tcp dport { 80, 443 } dnat to 192.168.1.120

源地址伪装为输出接口地址 nat 表 postrouting 链

nft add rule nat postrouting masquerade

多IP环境下指定出接口IP nat 表postrouting 链

nft add rule inet nat postrouting counter tcp dport {0-65535} snat to 192.168.1.120

进入端口流量重定向 nat 表 prerouting 链 tcp 22到2222端口

nft 'add chain nat prerouting { type nat hook prerouting priority -100; }'
nft add rule nat prerouting tcp dport 22 redirect to 2222

输出端口流量重定向 nat 表 output 链

nft add rule nat output tcp dport 853 redirect to 10053

链跳转与转到处理,filter 表 tcp-chain 链

nft add chain ip filter input
nft add chain ip filter tcp-chain
nft add chain ip filter other-chain

input链内添加tcp跳转到tcp-chain链处理---处理完返回执行其他规则

nft add rule ip filter input ip protocol tcp jump tcp-chain
nft add rule ip filter tcp-chain counter

input链内添加匹配规则 转到other-chain链处理---处理完不返回

nft add rule ip filter input ip saddr 1.1.1.1 ip daddr 2.2.2.2 tcp sport 111 tcp dport 222 goto other-chain

镜像流量 mangle 表 prerouting 链 dup镜像方法 从设备eth1流向目标地址

nft add rule mangle prerouting dup to 172.20.0.2 device eth1

镜像流量 mangle 表 prerouting 链 dup镜像方法 从原地址192.168.0.1 发送到不同地址

nft add rule mangle prerouting dup to ip saddr map { 192.168.0.1 : 172.20.0.2, 192.168.0.1 : 172.20.0.3 }


查看设置规则
nft list ruleset
备份规则
nft list ruleset > /root/nftables.conf
恢复规则
nft -f /root/nftables.conf

NFTables文档
https://wiki.nftables.org/wiki-nftables/index.php/Performing_Network_Address_Translation_(NAT)