macvlan 设备上的 IP 地址重用

macvlan 设备上的 IP 地址重用

我正在尝试为某些产品创建易于使用且可能简单的测试环境,但发现了 macvlan 的一些奇怪行为。

我想要实现的目标是:制作一个工具集,用于单行启动/停止绑定到外部 ip 的 lxc 容器(通过 docker)(我在主机上有足够的)。

所以,我正在做这样的事情:

docker run -d -name=容器名称 容器镜像
管道 eth1 容器名称 ip/前缀长度@网关

这里的管道是这样的:

GUEST_IFNAME=ph$NSPID$eth1

ip link 添加链接 eth1 dev $GUEST_IFNAME 类型 macvlan 模式 bridge
ip link 设置 eth1
IP 链路集 $GUEST_IFNAME netns $NSPID

ip netns exec $NSPID ip link set $GUEST_IFNAME 名称 eth1
ip netns exec $NSPID ip addr add $IPADDR dev eth1
ip netns exec $NSPID ip route 删除默认
ip netns exec $NSPID ip link 设置 eth1
ip netns exec $NSPID ip route 通过 $GATEWAY 替换默认值

ip netns exec $NSPID arping -c 1 -A -I eth1 $IPADDR

它适用于第一的每个 IP 的时间。但对于第二次及以后的容器 IP 数据包,它们无法进入容器,尽管所有配置似乎都很好。

所以它看起来像这样:

外置机

➤ ping 212.76.131.212
....安静....

主机

root@ubuntu:~# ip link 显示 eth1
2:eth1:mtu 1500 qdisc pfifo_fast 状态UP qlen 1000
    链路/以太 00:15:17:c9:e1:c9 brd ff:ff:ff:ff:ff:ff

root@ubuntu:~# ip addr 显示 eth1
2:eth1:mtu 1500 qdisc pfifo_fast 状态UP qlen 1000
    链路/以太 00:15:17:c9:e1:c9 brd ff:ff:ff:ff:ff:ff

root@ubuntu:~# tcpdump -v -i eth1 icmp
tcpdump:警告:eth1:未分配 IPv4 地址
tcpdump:在 eth1 上监听,链接类型 EN10MB(以太网),捕获大小 65535 字节
00:00:46.542042 IP(tos 0x0、ttl 60、id 9623、偏移量 0、标志 [DF]、proto ICMP(1)、长度 84)
    5.134.221.98 > 212.76.131.212:ICMP 回显请求,ID 6718,序列号 2345,长度 64
00:00:47.549969 IP(tos 0x0、ttl 60、id 9624、偏移量 0、标志 [DF]、proto ICMP(1)、长度 84)
    5.134.221.98 > 212.76.131.212:ICMP 回显请求,ID 6718,序列号 2346,长度 64
00:00:48.558143 IP(tos 0x0、ttl 60、id 9625、偏移量 0、标志 [DF]、proto ICMP(1)、长度 84)
    5.134.221.98 > 212.76.131.212:ICMP 回显请求,ID 6718,序列号 2347,长度 64
00:00:49.566319 IP(tos 0x0、ttl 60、id 9626、偏移量 0、标志 [DF]、proto ICMP(1)、长度 84)
    5.134.221.98 > 212.76.131.212:ICMP 回显请求,ID 6718,序列号 2348,长度 64
00:00:50.573999 IP(tos 0x0、ttl 60、id 9627、偏移量 0、标志 [DF]、proto ICMP(1)、长度 84)
    5.134.221.98 > 212.76.131.212:ICMP 回显请求,ID 6718,序列号 2349,长度 64
^C
捕获 5 个数据包
过滤器收到 5 个数据包
内核丢弃了 0 个数据包
接口丢弃 1 个数据包

宿主机、容器的网络

root@ubuntu:~# ip netns exec 32053 ip link show eth1
48:eth1@if2:mtu 1500 qdisc 无队列状态未知
    链路/以太 b2:12:f7:cc:a1:9d brd ff:ff:ff:ff:ff:ff
root@ubuntu:~# ip netns exec 32053 ip addr show eth1
48:eth1@if2:mtu 1500 qdisc 无队列状态未知
    链路/以太 b2:12:f7:cc:a1:9d brd ff:ff:ff:ff:ff:ff
    inet 212.76.131.212/29 范围全局 eth1
    inet6 fe80::b012:f7ff:fecc:a19d/64 范围链接
       valid_lft 永远 preferred_lft 永远
root@ubuntu:~# ip netns exec 32053 tcpdump -v -i eth1 icmp
tcpdump:在 eth1 上监听,链接类型 EN10MB(以太网),捕获大小 65535 字节
....安静....
^C
捕获 0 个数据包
过滤器收到 0 个数据包
内核丢弃了 0 个数据包

那么,谁能说说,这可能是什么原因造成的?这可能是由不是macvlan 实现中存在错误?有什么工具可以用来调试该配置吗?

答案1

这是一个 ARP 缓存问题。

网关上的 ARP 缓存保存着已经失效的 macvlan 的 MAC 地址的 IP 条目,并且无法通过 进行更新arping

通过添加解决

ip netns exec $NSPID ping -c 1 -I eth1 $GATEWAY

到脚本末尾pipework。此 ping 强制网关更新 ARP 缓存条目/

相关内容