使用 iptables 记录除两个地址之外的连接

使用 iptables 记录除两个地址之外的连接

我们想使用 iptables 记录所有网络连接除了如果连接地址是A.B.C.D或连接地址是E.F.G.H。这两个地址不能合并为单个 CIDR 范围,但不包括我们想要包含的地址范围。我通过添加以下 iptables 规则部分解决了这个问题:

-I INPUT ! -s A.B.D.E -p tcp -m tcp --dport 3306 -m state --state NEW  -j LOG --log-level 1 --log-prefix "New Connection "

但是,这仍然会记录来自 的连接E.F.G.H。有没有办法获取所有内容而不进行记录?

(这两个地址生成了许多连接,我们不需要记录它们。)

答案1

在您引用的特别允许 ABCD 或 EFGH 的行上方添加一两条规则,然后在其下方进行日志记录。iptables按照规则的顺序工作,因此更早地允许某些操作通过就是处理的结束。

这也是为什么大多数防火墙规则集末尾都会添加通用的“全部拒绝”的原因。如果某些内容未包含在上述规则中,则拒绝它,因为它是意外的,并且可能是不受欢迎的。

示例(根据需要进行调整,不要直接复制粘贴):

-A INPUT -s A.B.C.D -p tcp -m tcp --dport 3306 -m state --state NEW -j ACCEPT
-A INPUT -s E.F.G.H -p tcp -m tcp --dport 3306 -m state --state NEW -j ACCEPT
-A INPUT -p tcp -m tcp --dport 3306 -m state --state NEW  -j LOG --log-level 1 --log-prefix "New Connection "
-A INPUT -j DROP

答案2

您可以创建一个自定义链,可以将其命名为LOG_UNLESS,然后您可以执行以下操作:

-A INPUT -p tcp -m tcp --dport 3306 -m state --state NEW -j LOG_UNLESS
-A LOG_UNLESS -s 192.0.2.1 -j RETURN
-A LOG_UNLESS -s 203.0.113.2 -j RETURN
-A LOG_UNLESS -j LOG --log-level 1 --log-prefix "New Connection "

答案3

另一个选择是使用ipset

首先,创建正确的 IP 集:

ipset create DO_NOT_LOG hash:ip

然后,添加您想要排除的地址:

ipset add DO_NOT_LOG A.B.C.D
ipset add DO_NOT_LOG E.F.G.H

最后,在 iptables 日志规则上添加否定匹配:

-I INPUT -m set ! --match-set DO_NOT_LOG src -p tcp -m tcp --dport 3306 -m state --state NEW  -j LOG --log-level 1 --log-prefix "New Connection "

意思! --match-set DO_NOT_LOG src是:“匹配源(src)地址不在DO_NOT_LOG集合中的数据包”

相关内容