据我所知,没有办法区分iptables
主接口(即使用 vconfig 或 ip link add link 添加虚拟 VLAN 接口的接口;我不知道这是否是正确的术语,我鼓励您纠正我)上的 VLAN 流量。
一般来说这没有问题,因为您可以使用虚拟 VLAN 接口而不是主接口进行匹配,例如
iptables -A INPUT -i eth0.1 -p tcp -m tcp --dport 22 -j ACCEPT
这将允许 TCP 端口 22 (SSH) 数据包到达eth0.1
,这些数据包到达时eth0
带有 VLAN-ID 1 标记。
当你想在主接口上仅匹配未标记的流量时,就会出现问题,例如
iptables -A INPUT -i eth0 -p tcp -m tcp --dport 53 -j ACCEPT
我们的目的是匹配到达 eth0 的没有 VLAN 标签的 TCP 端口 53(DNS)数据包,我们确实这样做了,但我们也会匹配到达的任何其他 VLAN 标签的数据包eth0
。
因此,一个可能的解决方法是将主接口的 IP 地址/子网包含在规则中。假设我们在eth0
上使用 10.0.0.0/24 和 10.0.1.0/24 eth0.1
:
iptables -A INPUT -i eth0 -d 10.0.0.0/24 -p tcp -m tcp --dport 53 -j ACCEPT
不幸的是,这有两个缺点:
- 我们还将数据包与虚假 IP 地址进行匹配,没有什么可以阻止恶意或配置错误的客户端发送带有 10.0.0.0/24 和 VLAN-ID 1 的数据包。一般来说,这应该不是问题,因为对该数据包的回答将通过另一条路由返回,而不会到达原始
- 它不适用于广播流量,例如DHCP例如,不使用接口的 IP 地址。
尤其是后一个问题让我很困扰。例如,下面这个会产生不良的副作用:
iptables -A INPUT -i eth0 -p udp -m udp --dport 67 -j ACCEPT
此规则将匹配 eth0 上的任何传入 DHCP 流量,无论数据包带有哪个 VLAN 标签。如果我们想排除带有 VLAN-ID 1 的 DHCP 流量,我们就无计可施了。
有什么建议么?
答案1
我认为您的问题不是 iptables。我有几个盒子充当 VLAN 之间的路由器,我匹配未标记的流量,正如您所解释的那样,您正在尝试这样做,没有任何问题。
我刚刚测试过,我可以丢弃未标记接口上的所有流量,而不会影响标记接口的流量:
# 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
(192.168.100.129 存在于 VLAN 10/eth0.10 中)
我认为您的配置有错误,或者某个地方有缺陷。
答案2
iptables
在网络堆栈中太高的层上工作以正确查看 VLAN,我实际上很惊讶它能-i eth0.1
工作:)
看一下ebtables
,它适用于以太网帧,可以自行进行过滤或设置供 iptables 使用的标记。
类似这个未经测试的代码片段应该可以帮助您入门:
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
答案3
我认为您应该只将物理接口用作物理层。您不会为该接口分配任何 IP 地址,而是创建与之绑定的虚拟接口来eth0
处理 IP 传输。