Appearance
Sets与Maps
1. Sets
1.1 匿名Sets
匿名集是那些符合以下条件的集:
- 绑定到规则时,如果删除了规则,则该集也会被释放。
- 它们没有特定的名称,内核在内部分配一个标识符。
- 它们无法更新。因此,一旦它绑定到规则,你就不能在其中添加和删除元素。
以下示例演示如何创建简单匿名集
shell
[root@localhost ~]# nft insert rule inet test chain1 tcp dport { 822,80 } accept
[root@localhost ~]# nft -a -n list table inet test
table inet test { # handle 21
chain chain2 { # handle 2
comment "常规链"
}
chain chain1 { # handle 58
comment "基本链"
type filter hook input priority 0; policy accept;
tcp dport { 80, 822 } accept # handle 82
ip saddr 192.168.1.20 tcp dport 822 ct state 0x8 reject with icmp 3 # handle 80
tcp dport 22 accept # handle 66
tcp dport 12 accept # handle 70
tcp dport 443 accept # handle 67
tcp dport 114 accept # handle 71
tcp dport 1443 accept # handle 68
ip saddr 192.168.1.21 counter packets 0 bytes 0 # handle 75
}
chain chain4 { # handle 60
type filter hook input priority 110; policy accept;
tcp dport 22 accept # handle 65
}
}
[root@localhost ~]#
注意
注意,创建匿名集时,中括号内部必须有空格:{ 822,80 }
,如果没有空格则会报错,例如:{822,80}
1.2 命名Sets
nft add set ip filter blackhole { type ipv4_addr\; comment \"drop all packets from these hosts\" \; }
创建一个名为 Blackhole 的集合。设置名称不得超过 16 个字符。可选的 set comment
属性至少需要 nftables 0.9.7
和内核 5.10
。type 关键字指示要存储在集合中的元素的数据类型。在这种情况下,blackhole 存储 IPv4 地址,您可以使用 nft add 元素添加这些地址:
- ipv4_addr: IPv4地址
- ipv6_addr: IPv6地址。
- ether_addr: 以太网地址。
- inet_proto: Inet协议类型。
- inet_service: 互联网服务(例如读取tcp端口)
- mark: 标记类型。
- ifname: 网络接口名称(eth0, eth1..)
typeof
关键字从 0.9.4
开始可用,允许您使用高级表达式,然后让 nftables 为您解析基本类型:
shell
[root@localhost ~]# nft add set inet test test_port '{type inet_service ; comment "一个端口集合"; timeout 10s; }'
[root@localhost ~]# nft -a -n list table inet test
table inet test { # handle 21
set test_port { # handle 87
type inet_service
timeout 10s
comment "一个端口集合"
}
chain chain1 { # handle 58
comment "基本链"
type filter hook input priority 0; policy accept;
tcp dport { 80, 822 } accept # handle 84
tcp dport { 80, 822 } accept # handle 82
ip saddr 192.168.1.20 tcp dport 822 ct state 0x8 reject with icmp 3 # handle 80
tcp dport 22 accept # handle 66
tcp dport 12 accept # handle 70
tcp dport 443 accept # handle 67
tcp dport 114 accept # handle 71
tcp dport 1443 accept # handle 68
ip saddr 192.168.1.21 counter packets 0 bytes 0 # handle 75
}
}
[root@localhost ~]#
添加元素
shell
[root@localhost ~]# nft add element inet test test_port { 80 timeout 50s, 822 }
[root@localhost ~]# nft -a -n list table inet test
table inet test { # handle 21
set test_port { # handle 87
type inet_service
timeout 10s
comment "一个端口集合"
elements = { 80 timeout 50s expires 48s119ms, 822 expires 8s119ms }
}
chain chain1 { # handle 58
comment "常规链"
type filter hook input priority 0; policy accept;
tcp dport { 80, 822 } accept # handle 84
tcp dport { 80, 822 } accept # handle 82
ip saddr 192.168.1.20 tcp dport 822 ct state 0x8 reject with icmp 3 # handle 80
tcp dport 22 accept # handle 66
tcp dport 12 accept # handle 70
tcp dport 443 accept # handle 67
tcp dport 114 accept # handle 71
tcp dport 1443 accept # handle 68
ip saddr 192.168.1.21 counter packets 0 bytes 0 # handle 75
}
}
[root@localhost ~]#