我已经inputiptables规则来logging我们的服务器上的特定连接,但它似乎并没有按照我想要的那样工作。 这是规则:
1 LOG tcp -- !10.51.0.0/16 0.0.0.0/0 state NEW tcp dpt:8040 LOG flags 0 level 4 prefix `New Connection_8040TCP: ' 2 LOG tcp -- !192.168.0.0/16 0.0.0.0/0 state NEW tcp dpt:8040 LOG flags 0 level 4 prefix `New Connection_8040TCP: '
iptables应该只logging不在指定networking中的IP连接,但是它会logging来自所有IP地址的所有连接。
问题是你不能在一个iptables规则中引用多个IP范围,但是使用多个规则间接导致一个分离(逻辑或):如果连接符合你的第一个规则或者你的第二个规则,那么连接将被logging。
你想要的是一种连接行为(逻辑与):来自10.51.0.0/16
新连接,以及192.168.0.0/16
之外的新连接都需要被logging。
这就是为什么你不能find你想要的简单解决scheme。 没有。
但是你可以用更复杂一点的方式来解决这个问题。 你可以创build一个新的链:
iptables -N logger iptables -A INPUT -j logger iptables -A logger -s 192.168.0.0/16 -j RETURN iptables -A logger -s 10.51.0.0/16 -j RETURN iptables -A logger -j LOG
这些命令做什么:
logger
的新表。 192.168.0.0/16
和10.51.0.0/16
)。 如果是的话,一切正常( RETURN
目标将控制权归还给原始表)。 作为一个副作用,你可以稍后将这个新表用于其他任务 – 例如,拒绝数据包或任何其他目的。 在我看来,如果我们看到iptables就好像它是一种简单的编程语言一样。
传入的连接总是会匹配其中的一个规则,不是吗?
例如10.51.0.1
的连接将不会被第一条规则logging,而是会被第二条规则logging。
你不需要相当于!10.51.0.0/16 && !192.168.0.0/16
(可能是无效的语法,但逻辑上是正确的)。
根据版本和分布,有时您必须激活iprange扩展:
iptables -A INPUT -s ! 10.51.0.0/16 -m iprange -j LOG