为什么在这种情况下 ipset 的 'nomatch' 选项不起作用?

为什么在这种情况下 ipset 的 'nomatch' 选项不起作用?

我在 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 匹配的角度来看,匹配的搜索总是从添加到集合中的最小网络块(最具体的前缀)开始,到最大的网络块(最不具体的前缀)。

因此,它开始寻找单个主机并进行匹配,因为主机的网络块比子网小。

1 -http://ipset.netfilter.org/ipset.man.html

相关内容