Linux 接口模式 MACVLAN 与专用模式似乎并不像宣传的那样工作 (Ubuntu)

Linux 接口模式 MACVLAN 与专用模式似乎并不像宣传的那样工作 (Ubuntu)

我正在尝试创建虚拟接口(类型 MACVLAN),以便接口之间的所有通信都从主机发送到永恒的默认网关。有很多描述“私有”模式的文章,例如这里

专用:过滤所有传入数据包,以便绑定到接口的 MAC VLAN 无法相互通信(丢弃通过该接口传入的所有数据包,这些数据包的源 MAC 地址与 MAC VLAN 接口之一相匹配)。

我配置了几个接口,看起来“私有”模式并没有像宣传的那样工作。难道我做错了什么?主机是Ubuntu 18.04 Bionic版本。

数据包在主机内进行交换,忽略“模式专用”命令。只需 4 个命令即可轻松重现。任何帮助,将不胜感激。

root@ubnt-bkp:/home/super# uname -a
Linux ubnt-bkp 4.15.0-96-generic #97-Ubuntu SMP Wed Apr 1 03:25:46 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

root@ubnt-bkp:/home/super# ip link add link ens160 address 38:94:ed:99:99:1A ens160.3 type macvlan mode private
root@ubnt-bkp:/home/super# ip link set ens160.3 up
root@ubnt-bkp:/home/super# ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    link/ether 08:4f:a9:99:99:02 brd ff:ff:ff:ff:ff:ff
...
...
18: ens160.3@ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP **mode** **DEFAULT** group default qlen 1000
    link/ether 38:94:ed:99:99:1a brd ff:ff:ff:ff:ff:ff

重现问题的命令

root@ubnt-bkp:/home/super# ip link add link ens160 address 38:94:ed:99:99:1B ens160.5 type macvlan mode private
root@ubnt-bkp:/home/super# ip link set ens160.5 up
root@ubnt-bkp:/home/super# dhclient ens160.5
root@ubnt-bkp:/home/super# ip link add link ens160 address 38:94:ed:99:99:1C ens160.6 type macvlan mode private
root@ubnt-bkp:/home/super# ip link set ens160.6 up
root@ubnt-bkp:/home/super# dhclient ens160.6

然后ping使用-I选项:

root@ubnt-bkp:/home/super#ping -I <IP address of ens160.5> <IP address of ens160.6>

ens160尝试重现时,替换为您的以太网接口名称,例如 eth0)

答案1

您用于创建 MACVLAN 接口的命令是正确的。

但是,使用ping -I并不能帮助您验证这一点。当源接口和目标接口位于同一主机上(并且在同一命名空间中,如您的情况)时,ping总是会成功。

那么你如何测试这个呢?通过将 MACVLAN 接口放置在不同的非默认命名空间中。然后ping从命名空间执行。

假设您从ens160具有 IP 地址的物理接口 ()开始192.0.2.2/24。我们还假设您的路由器网关地址是192.0.2.1

现在:

# Create namespace named "ns5"
ip netns add ns5

# Create the macvlan interface as usual
ip link add link ens160 address 38:94:ed:99:99:1B ens160.5 type macvlan mode private

# Move the just-created macvlan interface into the "ns5" namespace
ip link set ens160.5 netns ns5

# Set the link up. Observe the "ip netns exec ns5" prefix.
ip netns exec ns5 ip link set ens160.5 up

# Set the IP address for the macvaln interface.  Observe the "ip netns exec ns5" prefix.
ip netns exec ns5 ip address add dev ens160.5 192.0.2.205/24


# Repeat above for another macvlan interface, this one in another namespace
# called "ns6"

ip netns add ns6
ip link add link ens160 address 38:94:ed:99:99:1C ens160.6 type macvlan mode private
ip link set ens160.6 netns ns6
ip netns exec ns6 ip link set ens160.6 up
ip netns exec ns6 ip address add dev ens160.6 192.0.2.206/24

从此时起,两个 macvtap 接口都能够成功 ping 通网关:

ip netns exec ns5 ping 192.0.2.1
ip netns exec ns6 ping 192.0.2.1

如果您有权访问网关设备,则应该能够确认 192.0.2.205 和 192.0.2.6 的 ARP 条目显示 macvlan 接口的 MAC 地址。

但是,由于 macvlan 接口处于private模式,因此以下命令都将失败:

# Try to reach ens160.6 from ens160.5
ip netns exec ns5 ping 192.0.2.206

# Try to reach ens160.5 from ens160.6
ip netns exec ns6 ping 192.0.2.205

重复实验,bridge而不是private;您将观察到最后两个 ping 命令将成功。

相关内容