![带有 ! 字符的 Iptables 规则](https://linux22.com/image/656394/%E5%B8%A6%E6%9C%89%20!%20%E5%AD%97%E7%AC%A6%E7%9A%84%20Iptables%20%E8%A7%84%E5%88%99.png)
我已经输入了 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
这些命令的作用:
- 他们创建了一个名为 的新表
logger
。 - 我们为每个连接设置了 iptables 来尝试他的表。
- 此记录器表检查您的数据包是否来自您的受信任网络(
192.168.0.0/16
和10.51.0.0/16
)。如果是,则一切正常(RETURN
目标将控制权交还给原始表)。 - 如果没有,则记录该连接(并且,由于我们位于表的末尾,因此控制权也会返回到原点)。
副作用是,您以后还可以将这个新表用于其他任务 - 例如,拒绝数据包或任何其他目的。在我看来,最好将 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