我正在尝试为某些产品创建易于使用且可能简单的测试环境,但发现了 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 缓存条目/