1.簇(family)
nftables统一了之前的xtables,提出了簇的概念
ip | ipv4 |
ip6 | ipv6 |
inet | internet(IPv4/IPv6) |
arp | arp ,处理arp数据包 |
bridge | 网桥,处理通过网桥设备的数据包 |
netdev | netdev,处理来自入口的数据包 |
2.表(tables)
容器,存放chain链的
默认是不存在表的,需要人为的自定义表
1.列出表: nft list tables
2.列出表中的链和规则:nft list table family table
3.创建新表:nft add table family table
4.删除表
只能删除不包含链的表 (能删除包含链的)
删除表: nft delete table family table
5.清空表
清空一个表中的所有规则:nft flush table family table
3.链(chain)
1.基本链
1). 类型(type)
分为 filter / route / nat
- filter:过滤数据包
- route:对数据包进行重路由
- nat:对 数据流 进行 网络地址转换(数据流仅第一个包会因为钩子进入本链,之后的会绕过)
类型 | 簇 | hook | 描述 |
filter | all | all | 标准链类型 |
nat | ipv4,ipv6,inet |
prerouting,input, output,postrouting |
根据conntrack条目执行本地地址转。 只有连接的第一个数据包实际遍历此链 - 它的规则通常定义创建的 conntrack 条目的详细信息 |
route | ipv4,ipv6 | output | 如果数据包已经通过该类型的链并将被接受,且 IP 标头的相关部分已更改,则会执行新的路由查找。 |
2)钩子(hook)
hook 有六种主要钩子,通过钩子进而抓取指定区域的流量分别为 INGRESS / PREROUTING / INPUT / FORWARD / OUTPUT / POSTROUTING(INGRESS/EGRESS 从 Kernel 4.2 后加入 NetDev 地址簇,Kernel 5.10 后加入 inet 地址簇)
IP / IP6 / INET / Bridge 表 family 地址簇 使用 PREROUTING / INPUT / FORWARD / OUTPUT / POSTROUTING
ARP 地址簇表 可以使用 Input 和 Output
NetDev 地址簇表 可以使用 INGRESS 钩子类型
3)优先级(priority)
Nftables 基础链 优先级 priority 通过 顺序排列 进而 按顺序执行不同hook
4)策略(policy)
决定经过所有规则后的数据包流向,分别为 Accept(默认) 和 Drop
选择 Accept 则通过匹配并继续执行 Nftables 所配置的 其他链
选择 Drop 则放弃并终止继续执行
2.常规链
和规则跳转有关
3.列出所有链
显示所有表中包含的chains:nft list chains
4.列出某条链中的所有规则
列出一个链中的所有规则:
# nft list chain family table chain
5.创建链
# 常规链 nft add chain family table chain
# 基本链 nft add chain family table chain { type type hook hook priority priority \; }
6. 编辑链
要编辑一个链,只需按名称调用并定义要更改的规则。
nft chain family table chain { [ type type hook hook device device priority priority \; policy <policy> \; ] }
例如,将默认表中的input链策略从accept更改为drop:
nft chain inet my_table my_filter_chain {policy drop \;} # 高危操作,连接会中断
7.删除链
nft delete chain family table chain (删除 my_filter_chain (不带规则))
8.清空链中的规则
nft flush chain family table chain
清空GLOBAL_INGRESS_ALLOWED 链 :nft flush chain bridge sddc-microseg GLOBAL_INGRESS_ALLOWED
4.规则(rule)
只针对 chain 链 捕获的流量处理
重点是声明 statements的使用
1.介绍
1).expression 表达式
meta:(元属性,例如接口)
oif <output interface INDEX>
iif <input interface INDEX>
oifname <output interface NAME>
iifname <input interface NAME>
(oif 和 iif 接受字符串参数并转换为接口索引)
(oifname 和 iifname 更具动态性,但因字符串匹配速度更慢)
icmp:(ICMP协议)
type <icmp type>
icmpv6:(ICMPv6协议)
type <icmpv6 type>
ip:(IP协议)
protocol <protocol>
daddr <destination address>
saddr <source address>
ip6:(IPv6协议)
daddr <destination address>
saddr <source address>
tcp:(TCP协议)
dport <destination port>
sport <source port>
udp:(UDP协议)
dport <destination port>
sport <source port>
sctp:(SCTP协议)
dport <destination port>
sport <source port>
ct:(链接跟踪)
state <new | established | related | invalid>
2).action:(与iptables有点类似) -- 用于判断
accept:接受数据包并停止其余规则。
drop:丢弃数据包并停止其余规则。
queue:将数据包排队到用户空间并停止其余规则。
continue:使用下一个规则并继续规则集判断。
return:从当前链返回并继续上一个链的下一条规则。在基链中它相当于接受jump <chain> :跳转到新链,开始执行新链的第一条规则。发出 return 语句后,它将继续执行原链下一个规则goto <chain>:类似于跳转,但执行完毕新链之后,将直接进行新链最终判定而不是包含 goto 语句的链上继续
Nftables 规则的配置需要参考可选项 [handle] 代表指定规则位置,参考 list 时的 handle 值决定可选项 [comment] 未知使用场景,
add 将 规则 插在 原规则列表 后面,insert 将 规则 插在 原规则列表 前面
2.列出规则
1)列出所有规则:nft list ruleset
2)列出表中所有规则:nft list table family table
3)列出一个链中的所有规则:nft list chain family table chain
3.创建规则
add 是后加;规则添加到handle处。默认是规则添加到链的末尾。
nft add rule family table chain handle handle statement
insert是指定或者往前加;默认是规则插入到链的开头。
nft insert rule family table chain handle handle statement
添加一条规则允许 SSH 登录
nft add rule inet my_table my_filter_chain tcp dport ssh accept
nft insert rule inet my_table my_filter_chain tcp dport http accept
4.插入规则到指定位置
1)index
add 表示新规则添加在索引位置的规则后面,
inser 表示新规则添加在索引位置的规则前面。index 的值从 0 开始增加。ps:
index 类似于 iptables 的
-I 选项,但有两点需要注意:
- index 的值是从 0 开始的;
- index 必须指向一个存在的规则,比如
nft insert rule … index 0 就是非法的。
[root@11 microseg]# nft insert rule inet my_table my_filter_chain index 1 tcp dport nfs accept
[root@11 microseg]# nft list chain inet my_table my_filter_chain table inet my_table {
chain my_filter_chain {
type filter hook input priority filter; policy accept;
tcp dport 80 accept
tcp dport 2049 accept
tcp dport 22 accept
}
}
[root@11 microseg]# nft add rule inet my_table my_filter_chain index 0 tcp dport 1234 accept
[root@11 microseg]# nft list chain inet my_table my_filter_chain table inet my_table {
chain my_filter_chain {
type filter hook input priority filter; policy accept;
tcp dport 80 accept
tcp dport 1234 accept
tcp dport 2049 accept
tcp dport 22 accept
}
}
2)handle
add 表示新规则添加在索引位置的规则后面,
inser 表示新规则添加在索引位置的规则前面。
handle 的值可以通过参数
--handle 获取在 nftables 中,句柄值是固定不变的,除非规则被删除,这就为规则提供了稳定的索引。而
index 的值是可变的,只要有新规则插入,就有可能发生变化。一般建议使用
handle 来插入新规则。也可以在创建规则时就获取到规则的句柄值,只需要在创建规则时同时加上参数
--echo 和 --handle
[root@11 microseg]# nft --handle list chain inet my_table my_filter_chain
table inet my_table {
chain my_filter_chain { # handle 3
type filter hook input priority filter; policy accept;
tcp dport 80 accept # handle 5
tcp dport 1234 accept # handle 7
tcp dport 2049 accept # handle 6
tcp dport 22 accept # handle 4
}
}
[root@11 microseg]# nft add rule inet my_table my_filter_chain handle 7 tcp dport 1234 accept
[root@11 microseg]# nft --handle list chain inet my_table my_filter_chain
table inet my_table {
chain my_filter_chain { # handle 3
type filter hook input priority filter; policy accept;
tcp dport 80 accept # handle 5
tcp dport 1234 accept # handle 7
tcp dport 1234 accept # handle 8 # 新增
tcp dport 2049 accept # handle 6
tcp dport 22 accept # handle 4
}
}
# echo 和 handle
[root@11 microseg]# nft --echo --handle add rule inet my_table my_filter_chain udp dport 3333 accept
add rule inet my_table my_filter_chain udp dport 3333 accept # handle 9 # 表示为第9个
# new generation 187 by process 1637000 (nft)
[root@11 microseg]# nft --handle list chain inet my_table my_filter_chain
table inet my_table {
chain my_filter_chain { # handle 3
type filter hook input priority filter; policy accept;
tcp dport 80 accept # handle 5
tcp dport 1234 accept # handle 7
tcp dport 1234 accept # handle 8
tcp dport 2049 accept # handle 6
tcp dport 22 accept # handle 4
udp dport 3333 accept # handle 9
}
}
5. 删除规则
单个规则只能通过其句柄删除,首先需要找到删除的规则句柄:
1. 确定句柄
[root@11 microseg]# nft --handle list chain inet my_table my_filter_chain
table inet my_table {
chain my_filter_chain { # handle 3
type filter hook input priority filter; policy accept;
tcp dport 80 accept # handle 5
tcp dport 1234 accept # handle 7
tcp dport 1234 accept # handle 8
tcp dport 2049 accept # handle 6
tcp dport 22 accept # handle 4
udp dport 3333 accept # handle 9
}
}
然后使用句柄值来删除该规则:
[root@11 microseg]# nft delete rule inet my_table my_filter_chain handle 8
[root@11 microseg]# nft --handle list chain inet my_table my_filter_chain
table inet my_table {
chain my_filter_chain { # handle 3
type filter hook input priority filter; policy accept;
tcp dport 80 accept # handle 5
tcp dport 1234 accept # handle 7
tcp dport 2049 accept # handle 6
tcp dport 22 accept # handle 4
udp dport 3333 accept # handle 9
}
}