带有 ! 字符的 Iptables 规则

带有 ! 字符的 Iptables 规则

我已经输入了 iptables 规则来记录我们服务器上的特定连接,但它似乎没有按我想要的方式工作。以下是规则:

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 应该只记录不在指定网络中的 IP 连接,但它会继续记录来自所有 IP 地址的所有连接。

答案1

问题是您不能在单个 iptables 规则中引用多个 IP 范围,但使用多个规则会间接导致分离(逻辑或):如果连接与您的第一条或第二条规则匹配,则会记录连接。

你想要的是一种连接行为(逻辑与):来自 的新连接10.51.0.0/16,以及来自 的新连接也192.168.0.0/16需要被记录。

这就是为什么你找不到你想要的那个简单的解决方案。没有。

但你可以通过稍微复杂一点的方法来解决这个问题。你可以创建一个新的链:

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. 他们创建了一个名为 的新表logger
  2. 我们为每个连接设置了 iptables 来尝试他的表。
  3. 此记录器表检查您的数据包是否来自您的受信任网络(192.168.0.0/1610.51.0.0/16)。如果是,则一切正常(RETURN目标将控制权交还给原始表)。
  4. 如果没有,则记录该连接(并且,由于我们位于表的末尾,因此控制权也会返回到原点)。

副作用是,您以后还可以将这个新表用于其他任务 - 例如,拒绝数据包或任何其他目的。在我看来,最好将 iptables 视为一种简单的编程语言。

答案2

传入的连接总是会匹配其中一条规则,不是吗?

例如,来自的连接10.51.0.1不会被第一条规则记录,但会符合第二条规则。

您不需要等同于!10.51.0.0/16 && !192.168.0.0/16(可能不是有效的语法但逻辑上正确)。

答案3

根据版本和发行版,有时您必须激活 iprange 扩展:

iptables -A INPUT -s ! 10.51.0.0/16 -m iprange -j LOG

相关内容