我正在尝试创建虚拟接口(类型 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 命令将成功。