通过Linux网络名称空间路由?

时间:2014-10-23 15:31:22

标签: linux networking

在我的Linux VM(Ubuntu 12.04.3 LTS)上,我希望将数据包路由到两个 网络名称空间。我创建了两个网络名称空间并使用veth对连接它们。

我的网络拓扑看起来像这样 -

dpn1_1 --veth-- dpn1_gw1 [NAME SPACE1] dpn1_gw1_if --veth-- dpn2_gw1_if [NAME SPACE2] dpn2_gw1 --veth-- dpn2_1

对veth对进行以下IP分配 -

dpn1_1 - dpn1_gw1(192.168.0.1 - 192.168.0.2), 其中dpn1_gw1在NAME SPACE1中(名为name_dpn1_gw1)

dpn1_gw1_if - dpn2_gw1_if(192.168.1.1 - 192.168.1.2) 其中,NAME SPACE1中的dpn1_gw1_if和dpn2_gw1_if位于NAME SPACE2中(名为name_dpn2_gw1)

dpn2_gw1 - dpn2_1(192.168.3.1 - 192.168.3.2) 其中dpn2_gw1在NAME SPACE2中

dpn1_1和dpn2_1位于默认名称空间

目标:

我想从dpn1_1(192.168.0.1)ping dpn2_1(192.168.3.2) 默认名称空间中的dpn1_1接口。

这就是我所做的:

在默认名称空间,NAME SPACE1和NAME SPACE2

中启用IP转发
/home/ganesh/testnets# sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
/home/ganesh/testnets# ip netns exec name_dpn1_gw1 sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
/home/ganesh/testnets# ip netns exec name_dpn2_gw1 sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1

在默认名称空间,NAME SPACE1和NAME SPACE2中添加了主机路由 通过dpn1_1和dpn1_1通过dpn2_1

到达dpn2_1

默认名称空间中的路由表

/home/ganesh/testnets# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.0.2.2        0.0.0.0         UG    0      0        0 eth10
10.0.2.0        0.0.0.0         255.255.255.0   U     1      0        0 eth10
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 eth11
169.254.30.0    0.0.0.0         255.255.255.0   U     1      0        0 eth12
169.254.30.0    0.0.0.0         255.255.255.0   U     1      0        0 eth11
192.168.0.1     192.168.3.2     255.255.255.255 UGH   0      0        0 dpn2_1
192.168.3.2     192.168.0.1     255.255.255.255 UGH   0      0        0 dpn1_1

NAME SPACE1中的路由表

/home/ganesh/testnets# ip netns exec name_dpn1_gw1 route -n 
1
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.0.0     0.0.0.0         255.255.255.0   U     0      0        0 dpn1_gw1
192.168.0.1     192.168.0.2     255.255.255.255 UGH   0      0        0 dpn1_gw1
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 dpn1_gw1_if
192.168.3.2     192.168.1.1     255.255.255.255 UGH   0      0        0 dpn1_gw1_if

NAME SPACE2中的路由表

/home/ganesh/testnets# ip netns exec name_dpn2_gw1 route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.0.1     192.168.1.2     255.255.255.255 UGH   0      0        0 dpn2_gw1_if
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 dpn2_gw1_if
192.168.3.0     0.0.0.0         255.255.255.0   U     0      0        0 dpn2_gw1
192.168.3.2     192.168.3.1     255.255.255.255 UGH   0      0        0 dpn2_gw1

这不起作用。当我

ping -I dpn1_1 192.168.3.2

ARP在dpn1_1上出现了192.168.3.2(使用wireshark看到),即使我配置了静态主机路由。 这是为什么?

我尝试通过在两个名称空间上启用代理ARP来解决此问题。 这导致ICMP数据包到达NAME SPACE1,但ARP广播再次发送 dpn1_gw1_if上的192.168.3.2,从NAME SPACE1到NAME SPACE2,NAME SPACE2没有回复,所以ping失败了。

有什么建议吗?

0 个答案:

没有答案