iptables:只匹配带有VLAN的接口上的未标记的stream量

据我所知,在主接口iptables上没有办法区分VLANstream量(也就是虚拟VLAN接口添加了vconfig或ip link添加链接的接口;我不知道这是否正确,我鼓励你纠正我)。

一般来说这没有问题,因为您可以使用虚拟VLAN接口而不是主接口进行匹配,例如

 iptables -A INPUT -i eth0.1 -p tcp -m tcp --dport 22 -j ACCEPT 

这将允许TCP端口22(SSH)数据包到达eth0.1 ,这是到达eth0数据包,使用VLAN-ID 1标记。

如果只想匹配主接口上未标记的stream量,则会出现问题

 iptables -A INPUT -i eth0 -p tcp -m tcp --dport 53 -j ACCEPT 

我们的意图是匹配到达eth0的TCP端口53(DNS)数据包,而不使用VLAN标记,但我们也将数据包与到达eth0任何其他VLAN-Tag进行匹配。

所以可能的解决方法是在规则中包含主接口的IP地址/子网。 假设我们在eth0上使用10.0.0.0/24,在eth0.1上使用eth0.1

 iptables -A INPUT -i eth0 -d 10.0.0.0/24 -p tcp -m tcp --dport 53 -j ACCEPT 

不幸的是,这有两个缺点:

  1. 我们也使用伪造的IP地址来匹配数据包,没有什么能阻止恶意或错误configuration的客户端发送10.0.0.0/24和VLAN-ID 1的数据包。一般来说,这不应该是一个问题,因为对这个数据包的回答会把另一个路由返回并不会达到原来的
  2. 它不适用于广播stream量,例如DHCP ,它不使用接口的IP地址。

特别是后面的问题困扰我。 例如,以下有不必要的副作用:

 iptables -A INPUT -i eth0 -p udp -m udp --dport 67 -j ACCEPT 

此规则将匹配eth0上的任何传入DHCPstream量,而不pipe分组具有哪个VLAN标记。 如果我们想排除VLAN-ID为1的DHCPstream量,我们就会丢失。

有什么build议么?

我不认为你的问题是iptables。 我有几个盒子充当VLAN之间的路由器,我匹配未标记的stream量,因为你已经解释你正在尝试没有任何问题。

我刚刚testing过,我可以删除未标记的接口上的所有stream量,而不会影响标记的接口stream量:

 # iptables -A FORWARD -i eth0 -j DROP # ping -nc3 192.168.100.129 PING 192.168.100.129 (192.168.100.129) 56(84) bytes of data. 64 bytes from 192.168.100.129: icmp_seq=1 ttl=64 time=0.180 ms 64 bytes from 192.168.100.129: icmp_seq=2 ttl=64 time=0.176 ms 64 bytes from 192.168.100.129: icmp_seq=3 ttl=64 time=0.153 ms --- 192.168.100.129 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 1998ms rtt min/avg/max/mdev = 0.153/0.169/0.180/0.019 ms 

(VLAN10 / eth0.10中存在192.168.100.129)

我认为你的configuration有一个错误,或者是某个地方的错误。

iptables工作在networking堆栈太高的层来正确看-i eth0.1 ,我真的很惊讶, -i eth0.1工作:)

看看ebtables ,它可以在以太网帧上工作,可以自己完成过滤,也可以设置iptables使用的标记。

像这样的未经testing的片段应该让你开始:

 ebtables -A INPUT --vlan-id ! 1 --jump mark --mark-set 0xff iptables -A INPUT -i eth0 -p udp -m udp --dport 67 -m mark ! --mark 0xff -j ACCEPT 

我认为你应该只使用物理接口作为物理层。 您不会为该接口分配任何IP地址,而是创build绑定到eth0虚拟接口,这将负责IP传输。