我们想使用 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
集合中的数据包”