![通过 veth 链接从 netns 进行路由](https://linux22.com/image/145297/%E9%80%9A%E8%BF%87%20veth%20%E9%93%BE%E6%8E%A5%E4%BB%8E%20netns%20%E8%BF%9B%E8%A1%8C%E8%B7%AF%E7%94%B1.png)
我创建了一个网络命名空间(带有ip netns add
)和一对veth
链接,virt-a
以及virt-b
。根命名空间中的物理链接名为eth0
。virt-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 的工作原理。在根命名空间中创建一个桥并使其成为两者的主控eth0
,virt-a
这样我就可以从新命名空间 ping 外部设备。
为什么是这样?如果我有两个物理网卡并从其中一个接收传入流量,则无需桥接即可将其转发到另一个。 veth 不应该以同样的方式工作吗?
关于在哪里可以阅读有关 iproute 中不同链接类型的更多信息,有什么建议吗?我很难找到文档。
答案1
误解是关于路由,而不是网络命名空间:你应该在之间路由 IPv4不同的IPv4 网络。
在这里,您尝试路由属于同一网络的 IP: from 192.168.1.0/24
to 192.168.1.0/24
:这根本不会被路由,除非进行特殊设置(如代理 arp 等),这对您的测试用例没有多大意义。
使用不同的 IP LAN,例如192.168.2.0/24
veth-* 网络。此外,网络命名空间中的路由必须使用 veth-a 的 IP 作为默认网关,而不仅仅是“设备”。您可能还需要使用 iptables 添加 NAT 规则,以便外部系统在不知道其他专用网络的情况下正确交互,并启用 ip 转发。