我在 Debian Jessie 上使用 ipset 6.23-2。我创建了一个 hash:net 集和一个 iptables 规则,以丢弃该集中地址的所有流量。
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP all -- anywhere anywhere match-set Example-Set src
我曾经使用“nomatch”选项将我的内部服务器的网络添加到其中。我认为它会像排除一样工作,所以它基本上是万无一失的,我不会意外地将自己(或我的同事)锁定在服务器之外。
Name: Example-Set
Type: hash:net
Revision: 6
Header: family inet hashsize 1024 maxelem 65536 comment
Size in memory: 3424
References: 1
Members:
10.50.7.0/24 nomatch comment "# 2017-09-14"
但是,当我将特定 IP(例如子网内部的 10.50.7.30)添加到集合中并删除来自该 IP 的所有流量时,它仍然匹配。
Name: Example-Set
Type: hash:net
Revision: 7
Header: family inet hashsize 1024 maxelem 65536 comment
Size in memory: 3424
References: 1
Members:
10.50.7.0/24 nomatch comment "# 2017-09-14"
10.50.7.21 comment "# 2017-09-14"
我认为我对“nomatch”的工作方式的理解是错误的?
它只能用于从较大的子网中排除较小的子网吗?
有没有办法在不创建附加集的情况下解决这个问题?
答案1
ipset 文档说明如下(1):
从设置 netfilter 匹配的角度来看,匹配的搜索总是从添加到集合中的最小网络块(最具体的前缀)开始,到最大的网络块(最不具体的前缀)。
因此,它开始寻找单个主机并进行匹配,因为主机的网络块比子网小。