我当前的设置是有一个具有多个 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