如何正确匹配“hash:ip,port”类型的 IP 集?

如何正确匹配“hash:ip,port”类型的 IP 集?

我当前的设置是有一个具有多个 IPv4 地址的服务器。我们暂时忽略 IPv6 部分,因为那里的症状是相同的。

在防火墙规则中,我想匹配 HTTP 流量一个特定的IP以及一些其他服务(允许它们通过-j ACCEPT我的表INPUT中的链filter)。

这是有效地链中倒数第二个规则INPUT

-A INPUT -m set --match-set public_services dst -j ACCEPT
-A INPUT -j NFLOG --nflog-prefix  "[IPv4:inp/flt] (drop)"
-A INPUT -j DROP
# filter/INPUT chain ends here

但由于一些日志记录发生在之前,-j DROP我可以看到流量最终被最后一条规则丢弃,而不是按照期望被接受。日志记录中使用的标记在我的 netfilter 规则中是唯一的。

我的 IP 设置如下:

# ipset save public_services
create public_services list:set size 8
add public_services public_services4
add public_services public_services6

而 IPv4 特定的 IP 集是(实际 IP 地址已编辑):

# ipset save public_services4
create public_services4 hash:ip,port family inet hashsize 1024 maxelem 65536 counters
add public_services4 192.168.0.1,tcp:80 packets 0 bytes 0
add public_services4 192.168.0.1,tcp:22 packets 0 bytes 0

我启用了计数器来查看INPUT链中的规则是否匹配。然而,他们似乎没有。我觉得这很奇怪,因为tcp当我从日志文件(编辑后的 ​​MAC 和 IP 地址)中比较IP、协议 ( ) 和端口时,它们是匹配的:

[IPv4:inp/flt] (drop) IN=eth0 OUT= MAC=00:00:00:00:00:00:00:00:00:00:00:00:00:00 SRC=1.2.3.4 DST=192.168.0.1 LEN=40 TOS=00 PREC=0x00 TTL=242 ID=54321 PROTO=TCP SPT=51433 DPT=80 SEQ=2936666534 ACK=0 WINDOW=65535 SYN URGP=0 MARK=0

我还尝试分别将我的规则添加为 IPv4 和 IPv6 特定规则,以便引用特定于 IP 版本的 IP 集。这也不起作用,它会落入首先添加的显式规则。

在这种情况下,当我尝试匹配目标 IP、协议和端口时,我做错了什么?


更多信息:

上面所说的规则是第 26 条,所以我决定在它之前插入一条明确的规则:

-I INPUT 26 -p tcp -d 192.168.0.1 --dport 80 -j ACCEPT

这有效。然而,我想将尽可能多的可变部分从我的 netfilter 规则中抽象出来并放入 IP 集中。

所以我添加了(只是为了证明这一点它不适用于集合)另一条规则:

-I INPUT 26 -m set --match-set public_services4 dst -j ACCEPT

这是行不通的。根据netfilter和IP设置的计数器,这条规则不匹配。

涉及包的版本:

  • IP 集:6.20.1-1
  • iptables:1.4.21-1ubuntu1

答案1

您的 ipset 由 IP 和端口组成,因此您需要告诉 iptables 匹配 IP 和端口。如果要与目标端口匹配,请使用 dst,否则使用 src。

-A INPUT -m set --match-set public_services dst,dst -j ACCEPT

相关内容