IPTables 规则不适用于两个接口

IPTables 规则不适用于两个接口

我正在使用 IPtables,但我有一个疑问,但找不到答案。我想在 nat 表的 PREROUTING 部分应用规则。该规则应该执行一条链,但我希望它对除其中两个接口之外的每个接口执行。我不能使用通配符,因为我需要所有其他接口,无论它们的名称如何(假设我不能拥有它)。

我应用了这个规则:

iptables -t nat -A PREROUTING -j my_chain ! -i eth0

结果是这样的:

Chain PREROUTING (policy ACCEPT 19 packets, 3008 bytes)
pkts bytes target     prot opt in     out     source       destination
10   1538  my_chain   all  -- !eth0   *       0.0.0.0/0    0.0.0.0/0

但我需要这样的东西:

Chain PREROUTING (policy ACCEPT 19 packets, 3008 bytes)
pkts bytes target     prot opt in               out     source      destination
10   1538  my_chain   all  -- !(eth0 or tun0)   *       0.0.0.0/0   0.0.0.0/0

问题是它不能处于两个不同的规则中,因为这两个接口之一将进入另一个接口的规则。我也尝试过类似的事情:

iptables -t nat -A PREROUTING -j my_chain ! -i eth0 ! -i tun0

但它返回:multiple -i flags not allowed

or基本上,我需要一种在接口条件或!eth0 and !tun0(逻辑等效)中实现它的方法。

我正在使用 debian 和 iptables v1.4.21。

感谢您的帮助!

答案1

为了解决你的问题,你必须记住这一点iptables规则按顺序应用(一旦发现适用,则将数据包从链中删除,并跳过同一链中的以下规则),你可以发明新的链条;所以让我们定义两个新的链,

 iptables -N chain1
 iptables -N chain2

现在我们发送数据包屯0以太网0链1,以及其他一切链2

 iptables -t nat -A PREROUTING -i tun0 -j chain1
 iptables -t nat -A PREROUTING -i eth0 -j chain1
 iptables -t nat -A PREROUTING -j chain2 

现在您可以将规则分别分配给两个链:例如,删除上的所有内容链2但不上链1,

iptables -A chain1 -j ACCEPT
iptables -A chain2 -j DROP

这个技巧允许您构建一个相当于布尔 OR 的规则:如果数据包通过以太网0 或者通过屯0,然后做...因为布尔 AND 很容易实现(例如,如果有东西通过以太网0 注定是8.8.8.8,那么..相当于

 iptables -t nat -A PREROUTING -i eth0 -d 8.8.8.8 ....

),你两者都有或者连接词,它允许您在布尔逻辑中构建任何真值表。

相关内容