Skip to content

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 ~]#