我找不到关于 Linux 如何处理来自不同 VLAN(不属于分配给 VLAN 的子网)的传入数据包的答案。
想象一下这种情况。在具有以下配置的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(与其关联的默认网关)发回数据包?
你能帮忙找出正确答案吗?
答案1
设置 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
不属于路由表中任何网络,因此它将通过默认网关(“所有其他网络”)发出。
ARP 仅在本地以太网网络内部使用,因此来自 10.0.0.100 的数据包实际上会具有来自路由器(vlan150 中的某处)的 MAC,然后该路由器会将其转发到您的主机。
当您发送 IP 数据包时,您会将其打包(封装)在以太网数据包内。因此,当您想要访问 serverfault.com(可能在您的 LAN 之外)时,您首先封装它,然后发送一个数据包,其中您的 MAC 作为源地址,路由器 LAN 端 MAC 作为目标地址。路由器接收它,只查看 IP 数据包,检查将其路由到何处,然后将(仅 IP 数据包)封装在不同的以太网数据包中,以其自己的 wan 端 MAC 作为源地址,上游路由器 MAC 作为目标地址。然后在途中的每个以太网路由器上重复此操作。
由于来自 10.0.0.100 的数据包来自另一个网络(而不是直接连接的网络),因此必须通过路由器进行路由,并且您无法看到 10.0.0.100s 的 MAC 地址。
当然,您可以设置路由(具有多个路由表),以便从 eth0.150 进入的数据包通过 eth0.150 上的网关路由出去。
编辑:正如评论中所述,如果您在这些接口上启用了反向路径过滤,则内核将丢弃数据包,因为返回接口与传入接口不同。