在单独的网络命名空间中创建额外的 IP 地址

在单独的网络命名空间中创建额外的 IP 地址

我运行的是 Ubuntu 18.04,Linux 内核 5.4.0。我的笔记本电脑的本地 IP 地址为 192.168.0.130:

$ sudo ip addr show dev wlp2s0
3: wlp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 7c:2a:31:09:3e:e0 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.130/24 brd 192.168.0.255 scope global dynamic noprefixroute wlp2s0
       valid_lft 2782sec preferred_lft 2782sec
    inet6 fe80::b375:a43d:9705:556a/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

路由表如下所示:

$ sudo ip route
default via 192.168.0.1 dev wlp2s0 proto dhcp metric 600 
169.254.0.0/16 dev wlp2s0 scope link metric 1000 
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown 
192.168.0.0/24 dev wlp2s0 proto kernel scope link src 192.168.0.130 metric 600 

我想使用本地网络上其他主机可见的附加 IP 地址(例如 192.168.0.12)。它的工作原理如下:

$ sudo ip addr add 192.168.0.95/24 dev wlp2s0
$ ssh 192.168.0.12 ping 192.168.0.95
...
64 bytes from 192.168.0.95: ...
(works)
^C
$ sudo ip addr del 192.168.0.95/24 dev wlp2s0

现在,我想将此 IP 地址移动到名为 的单独网络命名空间net5,如下所示:

$ sudo ip netns add net5
$ sudo ip link add link wlp2s0 name net5in type macvlan
$ sudo ip link set net5in netns net5
$ sudo ip netns exec net5 ip addr add 192.168.0.95/24 brd + dev net5in
$ sudo ip netns exec net5 ip link set net5in up
$ ssh 192.168.0.12 ping 192.168.0.95
...
From 192.168.0.95: ... Destination Host Unreachable
(doesn't work)
^C
$ sudo ip netns add net5

如何解决这个问题才能使上面的 ping 正常工作?

我正在关注这些教程:

更新:

  • 我能够通过使用type ipvlan mode l2而不是type macvlan上面的方法来使其工作。本地 ping 仍然不起作用,但是——据我所知——这是预期的麦克夫兰ipvlan

答案1

看起来像麦克夫兰无法在 wifi 上使用,请参阅https://unix.stackexchange.com/a/555676了解详情。可以使用以下命令使其在 wifi 和以太网上工作类型 ipvlan 模式 l2代替类型 macvlan

这是我的完整设置,它创建了 3 个 IP 地址,每个地址都有自己的网络命名空间:

sudo ip link del hostnet ||:
sudo ip link add hostnet link wlp2s0 type ipvlan mode l2
sudo ip addr add 192.168.0.90/32 brd + dev hostnet
sudo ip link set hostnet up  # `ip route add' below needs it.

for I in 91 92 93; do
sudo ip netns del net"$I" && sleep .5 ||:
sudo ip netns add net"$I"
sudo ip netns exec net$I ip link set lo up
sudo ip link add link wlp2s0 name net"$I"in type ipvlan mode l2
sudo ip link set net"$I"in netns net"$I"
sudo ip netns exec net"$I" ip addr add 192.168.0."$I"/24 brd + dev net"$I"in
sudo ip netns exec net"$I" ip link set net"$I"in up
sudo ip netns exec net"$I" ip route add default via 192.168.0.1
sudo ip route add 192.168.0."$I"/32 dev hostnet
done

这使得eg ping 192.168.0.91、、、和ping 192.168.0.92在所有5个参与者中工作:主机根网络命名空间(IP地址192.168.0.130),每3个:主机网络命名空间(IP地址192.168.0.91等ping 192.168.0.93),本地网络上的其他主机(IP地址例如 192.168.0.12)。ping 192.168.0.130ping 192.168.0.12net"$I"

这也使得 TCP 连接和 UDP 数据包在 5 个参与者中的任意一个之间以任意方向工作。

这也使得 UDP 广播可以在 5 个参与者中的任何一个之间工作。这是由上述条款规定的brd +。但看起来似乎不需要该子句,因为默认情况下启用广播。

TCP 连接具有正确的 IP 地址,但从主机根网络命名空间到主机net"$I"网络命名空间的 TCP 连接显示传入 IP 地址 192.168.0.90,而不是 192.168.0.130。

主机net"$I"网络命名空间可以使用 IP 地址 192.168.0.90 或 192.168.0.130 连接到主机根网络命名空间。

相关内容