iptables的规则! 字符

我已经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 

这些命令做什么:

  1. 他们创build一个名为logger的新表。
  2. 我们为每个连接设置iptables来尝试他的表。
  3. 这个logging表检查你的数据包是否来自你的信任networking( 192.168.0.0/1610.51.0.0/16 )。 如果是的话,一切正常( RETURN目标将控制权归还给原始表)。
  4. 如果没有,则logging连接(并且,由于我们在表的末尾,控制也返回到原点)。

作为一个副作用,你可以稍后将这个新表用于其他任务 – 例如,拒绝数据包或任何其他目的。 在我看来,如果我们看到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