多个VLAN – Linux / Debian如何处理数据包

我无法find有关linux如何处理来自不同VLAN的传入数据包的回答,这些数据包不属于分配给VLAN的子网。

想象一下这种情况。 在具有以下configuration的Linux机器上:

  • eth0.100 – 从192.168.100.0/24子网(例如192.168.100.2)分配的地址
  • eth0.150 – 从192.168.150.0/24子网(例如192.168.150.2)分配的地址
  • eth0.200 – 从192.168.200.0/24子网分配的地址(例如192.168.200.2)

默认网关的地址是192.168.100.1,指向接口eth0.100

在端口eth0.150上发送一个源地址为10.0.0.100/24的数据包,发给侦听192.168.150.2的服务。 数据包由服务(ISO / OSI模型的高层)处理,并向主机10.0.0.100生成新的数据包(响应)。 在这一点上问题是如何处理数据包。

Linux首先检查ARP表,如果它有一个与10.0.0.100主机(MAC地址)相关的条目,则由eth0.150发回数据包, 或者首先扫描路由表,如果没有发现任何匹配,将通过接口发回数据包eth0.100(与哪个关联的默认网关)?

你能帮忙find正确的答案吗?

设置VLAN和IP后,路由表中有4条路由:

192.168.100.2/24 directly connected dev eth0.100 192.168.150.2/24 directly connected dev eth0.150 192.168.200.2/24 directly connected dev eth0.200 default via 192.168.100.1 dev eth0.100 

无论数据包来自哪里,在路上,它都会被匹配到路由表中。 由于10.0.0.100不是路由表中任何networking的一部分,它将通过默认网关(“所有其他networking”)发送出去。

ARP只用在本地以太网networking中,所以10.0.0.100的数据包实际上会有一个来自路由器(在vlan150的某个地方)的MAC,将它转发给你的主机。

当你发送一个IP数据包的时候,你把它打包(封装)在一个以太网数据包中。 所以当你想到达serverfault.com(可能是你的局域网之外)的时候,你首先要把它封装起来,然后发送一个包含你的MAC地址作为源地址,路由器LAN端MAC作为目的地址的包。 路由器收到它,看看IP数据包,检查将数据包路由到哪里,然后将IP数据包封装在不同的以太网数据包中,并将自己的WAN端MAC作为源地址,并将上游路由器MAC作为目的地址。 然后在路上的每一个以太网路由器上重复。

由于来自10.0.0.100的数据包来自另一个networking(不是直接连接的networking),因此必须通过路由器进行路由,而且您无法看到10.0.0.100s的MAC地址。

当然,您可以设置路由(使用多个路由表),以便从eth0.150进入的数据包通过eth0.150上的网关路由出去。

编辑 :如注释中所述,如果您在这些接口上启用了反向path过滤,内核将丢弃数据包,因为返回接口与传入接口不同。