通过 veth 链接从 netns 进行路由

通过 veth 链接从 netns 进行路由

我创建了一个网络命名空间(带有ip netns add)和一对veth链接,virt-a以及virt-b。根命名空间中的物理链接名为eth0virt-a位于根命名空间中并且virt-b位于新创建的命名空间中。

IP地址:

eth0:   192.168.1.100/24
virt-a: 192.168.1.101/24
virt-b: 192.168.1.102/24

根命名空间中的路由表:

default via 192.168.1.1 dev eth0 
192.168.1.102 dev virt-a proto kernel scope link src 192.168.1.101
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.100

新命名空间中的路由表:

default dev virt-b scope link src 192.168.1.102

我可以从根命名空间 ping 192.168.1.102,也可以从新命名空间 ping 192.168.1.100 和 192.168.1.101。但是,我无法 ping 通 LAN 上的其他物理机(例如 192.168.1.1)。

我将传入的数据包记录到根命名空间(使用iptables -t raw -A PREROUTING -i virt-a -j LOG --log-prefix "[raw-PRE] " --log-level 7),但没有任何数据包进入根命名空间。

我对 veth 或命名空间有什么误解?

编辑:

我想我误解了 veth 的工作原理。在根命名空间中创建一个桥并使其成为两者的主控eth0virt-a这样我就可以从新命名空间 ping 外部设备。

为什么是这样?如果我有两个物理网卡并从其中一个接收传入流量,则无需桥接即可将其转发到另一个。 veth 不应该以同样的方式工作吗?

关于在哪里可以阅读有关 iproute 中不同链接类型的更多信息,有什么建议吗?我很难找到文档。

答案1

误解是关于路由,而不是网络命名空间:你应该在之间路由 IPv4不同的IPv4 网络。

在这里,您尝试路由属于同一网络的 IP: from 192.168.1.0/24to 192.168.1.0/24:这根本不会被路由,除非进行特殊设置(如代理 arp 等),这对您的测试用例没有多大意义。

使用不同的 IP LAN,例如192.168.2.0/24veth-* 网络。此外,网络命名空间中的路由必须使用 veth-a 的 IP 作为默认网关,而不仅仅是“设备”。您可能还需要使用 iptables 添加 NAT 规则,以便外部系统在不知道其他专用网络的情况下正确交互,并启用 ip 转发。

相关内容