我创建了一个macvlan
以 eth0 为父接口的接口。我可以看到 eth0 的 NS 和来自 eth0 的 NA 消息,但看不到macvlan
接口的 NA 消息。但是,当我从 ping 网关时macvlan
,可以看到 NS 消息,macvlan
但macvlan
没有响应 NA。哪种配置有助于解决此问题?我希望以macvlan
我目前看到的 eth0 的方式查看定期的 NS 和 NA 消息。没有创建命名空间。我正在全局命名空间本身中工作。
另外,为了 ping 到网关,macvlan
我必须将“iface lo inet6 Loopback”放入 /etc/network/interfaces 文件中。否则,每当我尝试macvlan
在 ping6 中显式使用 -I 时,ping6 都会继续将源更改为。从 eth0 到 ping6macvlan
也不起作用。 Ping6 始终使用 msg 更改源地址,例如 ->“警告:可能在 macvlan1 以外的设备上选择源地址。”
要重现问题,请查看以下代码片段:
ubuntu@vm0:~$ uname -r
3.13.0-36-generic
ubuntu@vm0:~$ ip -6 link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 02:ec:39:e5:22:50 brd ff:ff:ff:ff:ff:ff
3: macvlan1@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN mode DEFAULT group default
link/ether ce:99:a8:33:1e:5d brd ff:ff:ff:ff:ff:ff
ubuntu@vm0:~$ ip -6 address
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000
inet6 2001:db8::3/64 scope global
valid_lft forever preferred_lft forever
inet6 fe80::ec:39ff:fee5:2250/64 scope link
valid_lft forever preferred_lft forever
3: macvlan1@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500
inet6 2001:db8::8/64 scope global
valid_lft forever preferred_lft forever
inet6 fe80::cc99:a8ff:fe33:1e5d/64 scope link
valid_lft forever preferred_lft forever
ubuntu@vm0:~$ ip -6 route
2001:db8::/64 dev macvlan1 proto kernel metric 256
2001:db8::/64 dev eth0 proto kernel metric 256
2001:db8::/48 dev eth0 proto kernel metric 256
2001:db8::/48 dev macvlan1 proto kernel metric 256
fe80::/64 dev eth0 proto kernel metric 256
fe80::/64 dev macvlan1 proto kernel metric 256
default via 2001:db8::1 dev eth0 metric 1
default via fe80::ec:39ff:fee5:22 dev eth0 metric 1024
ubuntu@vm0:~$ ip -6 neighbor
2001:db8::1 dev macvlan1 lladdr 00:00:5e:00:01:00 router REACHABLE
2001:db8::1 dev eth0 lladdr 00:00:5e:00:01:00 router STALE
2001:db8::2 dev macvlan1 router FAILED
fe80::5e00:100 dev macvlan1 lladdr 00:00:5e:00:01:00 router STALE
fe80::5e00:100 dev eth0 lladdr 00:00:5e:00:01:00 router STALE
2001:db8::2 dev eth0 lladdr 00:00:5e:00:01:00 router DELAY
2001:db8::9 dev macvlan1 lladdr 6a:25:a8:4e:23:5d STALE
当尝试从 macvlan ping eth0 时,ping6 会更改源并显示以下警告:
ubuntu@vm0:~$ ping6 2001:db8::3 -I macvlan1
ping6: Warning: source address might be selected on device other than macvlan1.
PING 2001:db8::3(2001:db8::3) from 2001:db8::3 macvlan1: 56 data bytes
64 bytes from 2001:db8::3: icmp_seq=1 ttl=64 time=4.41 ms
64 bytes from 2001:db8::3: icmp_seq=2 ttl=64 time=0.548 ms
64 bytes from 2001:db8::3: icmp_seq=3 ttl=64 time=0.628 ms
64 bytes from 2001:db8::3: icmp_seq=4 ttl=64 time=0.546 ms
^C
--- 2001:db8::3 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3053ms
rtt min/avg/max/mdev = 0.546/1.534/4.417/1.665 ms
从 macvlan 可以 Ping 到网关
ubuntu@vm0:~$ ping6 2001:db8::1 -I macvlan1
PING 2001:db8::1(2001:db8::1) from 2001:db8::8 macvlan1: 56 data bytes
64 bytes from 2001:db8::1: icmp_seq=2 ttl=255 time=3.50 ms
64 bytes from 2001:db8::1: icmp_seq=3 ttl=255 time=1.63 ms
64 bytes from 2001:db8::1: icmp_seq=4 ttl=255 time=2.54 ms
64 bytes from 2001:db8::1: icmp_seq=5 ttl=255 time=1.26 ms
^C
--- 2001:db8::1 ping statistics ---
5 packets transmitted, 4 received, 20% packet loss, time 4041ms
rtt min/avg/max/mdev = 1.261/2.237/3.501/0.867 ms
eth0 上的 tcpdump 看起来像这样
ubuntu@vm0:~$ sudo tcpdump -eni eth0 ip6
11:45:39.281934 00:00:5e:00:01:00 > 33:33:00:00:00:01, ethertype IPv6 (0x86dd), length 110: fe80::5e00:100 > ff02::1: ICMP6, router advertisement, length 56
11:45:40.105204 00:00:5e:00:01:00 > 33:33:ff:00:00:03, ethertype IPv6 (0x86dd), length 86: 2001:db8::2 > ff02::1:ff00:3: ICMP6, neighbor solicitation, who has 2001:db8::3, length 32
11:45:40.105975 02:ec:39:e5:22:50 > 00:00:5e:00:01:00, ethertype IPv6 (0x86dd), length 86: 2001:db8::3 > 2001:db8::2: ICMP6, neighbor advertisement, tgt is 2001:db8::3, length 32
但 macvlan 没有 NS
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on macvlan1, link-type EN10MB (Ethernet), capture size 65535 bytes
11:48:09.316865 00:00:5e:00:01:00 > 33:33:00:00:00:01, ethertype IPv6 (0x86dd), length 110: fe80::5e00:100 > ff02::1: ICMP6, router advertisement, length 56
11:48:10.197974 00:00:5e:00:01:00 > 33:33:ff:00:00:03, ethertype IPv6 (0x86dd), length 86: 2001:db8::2 > ff02::1:ff00:3: ICMP6, neighbor solicitation, who has 2001:db8::3, length 32
11:48:20.220753 00:00:5e:00:01:00 > 33:33:ff:00:00:03, ethertype IPv6 (0x86dd), length 86: 2001:db8::2 > ff02::1:ff00:3: ICMP6, neighbor solicitation, who has 2001:db8::3, length 32
答案1
它不能这样工作
问题是错误的路由假设与MACVLAN 是如何工作的。 MACVLAN 的主要用例是网络命名空间和容器。即使在容器情况下,众所周知,当容器使用 MACVLAN 接口时,主机和容器之间也存在通信问题。
创建 MACVLAN 接口时,父 NIC 接口将侦听分配给 MACVLAN 接口的附加 MAC 地址上的数据包,并进一步侦听 MACVLAN 接口所需的所有附加 MAC 地址上的数据包(主要是多播,用于 IPv6)新民主党对多播目的地的初始查询)。我不知道如何列出网卡的 MAC 地址过滤表,但可以使用 列出分配的多播 MAC 地址ip maddress
。所以如果你比较ip maddress show dev eth0
一下抚养前后macvlan1将出现此附加条目:
link 33:33:ff:33:1e:5d
因为这是将用于有关 ce:99:a8:33:1e:5d / fe80::cc99:a8ff:fe33:1e5d/64 的 IPv6 NDP 请求的以太网多播地址(对 IPv4 ARP 的改进)广播)。添加其他 IPv6 地址 2001:db8::8/64?需要新的匹配以太网多播地址供 NIC 侦听:
link 33:33:ff:00:00:08
这只是为了表明接口之间存在关系。当发出帧时macvlan1的 MAC 地址通过 eth0没有看到这个数据包以太网0的 IPv6 堆栈。它是由 MACVLAN 驱动程序在最后一步直接注入的。同样,当收到回复时在 eth0 上对于任何 MACVLAN 的保留地址(到目前为止至少有:ce:99:a8:33:1e:5d
哪些是本地单播,33:33:ff:33:1e:5d
哪些33:33:ff:00:00:08
是 IPv6 的以太网多播),该以太网帧被 MACVLAN 驱动程序窃取并放在macvlan1接口代替。所以后面的IPv6堆栈以太网0永远不会收到这个数据包。
总结一下当一个查询打算被接收时会发生什么以太网0其后面的网络堆栈由链接到的 MACVLAN 接口发出以太网0:
- 框架代表macvlan1是通过发射以太网0到局域网
- 帧从未被接收过以太网0
- 从来没有回复过
想象一下这样的查询实际上以某种方式收到并且实际上以某种方式做出了回复(尽管这里存在路由问题)
- 架子这次真的代以太网0是通过发射以太网0到局域网
- 帧从未被接收过以太网0
- 因此,帧不会被 MACVLAN 驱动程序窃取,也不会被 MACVLAN 接收macvlan1
- 没有收到任何回复
这就是如果macvlan1位于网络命名空间中,仅供参考:
ip netns add experiment
ip link set macvlan1 netns experiment
并重做其配置,因为更改命名空间会重置接口:
ip -n experiment link set macvlan1 up
ip -n experiment address add 2001:db8::8/64 dev macvlan1
并像这样执行 ping(如上所述,仍然会失败):
ip netns exec experiment ping 2001:db8::3/64
如果没有网络命名空间,这种情况就不会自然发生,因为当两个接口位于同一主机上时(无论哪种接口,都不相关),从属于其自身的一个全局 IPv6 地址到达属于其自身的另一个 IPv6 全局地址将会根本不需要以太网:它总是通过罗(环回)接口:
# ip route get 2001:db8::3 from 2001:db8::8
local 2001:db8::3 from 2001:db8::8 dev lo table local proto kernel src 2001:db8::3 metric 0 pref medium
并且只强制与接口平命令将触发额外的路由问题。
因此,我解释了为什么没有回答查询的充分原因,以及应该如何使用该界面以及为什么它仍然无法工作。
这应该如何处理
为了使其工作(至少在网络命名空间的情况下,不考虑本地地址的路由问题),外部交换机必须从帧的来源处发回帧。这里的交换机可以是运行虚拟机的主机系统,也可以是真正的外部交换机,具体取决于配置。
如果配置此类交换机设置(VEPA、发夹...)不切实际,一种方法是在桥接模式下创建 MACVLAN 接口,并在主机上以桥接模式添加另一个 MACVLAN 接口,并具有特定的地址和路由设置。因为这样 MACVLAN 驱动程序就不必通过以太网0但将准确地检测从一个虚拟接口到另一个虚拟接口的所有可在内部处理的情况。从头开始:
ip link add link eth0 name macvlan1 address ce:99:a8:33:1e:5d type macvlan mode bridge
ip netns add experiment
ip link set macvlan1 netns experiment
ip -n experiment link set macvlan1 up
ip -n experiment address add 2001:db8::8/64 dev macvlan1
ip link add link eth0 name macvlanhost up type macvlan mode bridge
ip address add 2001:db8::3/64 dev macvlanhost noprefixroute
ip route add 2001:db8::8/128 dev macvlanhost
下面的命令仍然强制使用地址,以防使用隐私扩展(仅添加了 2001:db8::8 的路由)macvlan主机):
ip netns exec experiment ping -I 2001:db8::8 2001:db8::3
现在可以工作了。如果您必须检查更多 NS/NA,请首先刷新 NDP 条目:
ip -6 neighbour flush dev macvlanhost
ip -n experiment -6 neighbour flush dev macvlan1
主机上的捕获:
tcpdump -e -n -s0 -p -i macvlanhost icmp6
或者在命名空间中:
ip netns exec experiment tcpdump -e -n -s0 -p icmp6
当然是网络命名空间实验仍然可以像以前一样与 LAN 上存在的任何内容进行通信,包括网关,但不能与本地主机上的服务进行通信(即:使用::1
, 作为其自己的实例)罗接口与主机不同罗接口),与主机通信时它的工作方式略有不同。