我运行的是 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 正常工作?
我正在关注这些教程:
- https://serverfault.com/a/900666: ping 不通。
- https://blog.oddbit.com/post/2018-03-12-using-docker-macvlan-networks/推荐docker网络创建,但我没有 Docker,我想让它在没有 Docker 的情况下也能工作。
- https://sreeninet.wordpress.com/2016/05/29/macvlan-and-ipvlan/没有解释如何设置IP地址。
- https://docs.oracle.com/cd/E37670_01/E37355/html/ol_mcvnbr_lxc.html不显示要运行哪些安装命令。
更新:
- 我能够通过使用
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.130
ping 192.168.0.12
net"$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 连接到主机根网络命名空间。