对于我的客户,我必须在不同的机器上设置 docker 容器,这些机器在各种物理链路上运行各种服务。
我不能对我的 docker 容器使用“主机”模式。
到目前为止,我已经愉快地使用 macvlan 驱动程序在我的容器中生成了新的网络接口。
例如:
networks:
good_net:
driver: macvlan
driver_opts:
parent: eno0
slow_net:
driver: macvlan
driver_opts:
parent: eno0
high_latency_net:
driver: macvlan
driver_opts:
parent: eno0
我在容器启动时有一个脚本:
- 给一个唯一的mac地址
- 培养
- dhcp 或静态地址
- 应用 tc 过滤器来调整每个网络的流量
工作正常:我可以在各个链接上运行 ping 和 iperf3 以测试它们是否按预期工作。
问题:现在真正的界面来了,它们破坏了我的设置。
其中一个链接现在是 LTE。
lte_net:
driver: macvlan
driver_opts:
parent: lte0
在 PC1(主机,而不是容器)上:
4: lte0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 1000
link/ether 7e:c4:d2:6a:e3:07 brd ff:ff:ff:ff:ff:ff
inet 10.0.250.1/30 brd 10.0.250.3 scope global noprefixroute lte0
valid_lft forever preferred_lft forever
在 PC2(主机,而不是容器)上:
4: lte0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 1000
link/ether b6:30:cb:12:31:16 brd ff:ff:ff:ff:ff:ff
inet 10.0.250.5/30 brd 10.0.250.7 scope global noprefixroute lte0
valid_lft forever preferred_lft forever
主机可以通过 LTE 链路愉快地相互 ping 和 iperf3。
但是:在容器中,使用 macvlan 方法,它们不能:
- 我为每个容器中的接口分配了同一子网中的 IP 地址:10.100.10.1/24 和 10.100.10.2/24
- 我已经关闭了所有其他接口,所以只剩下一条路线:10.100.10.0/24 dev lte0 proto kernel scope link src 10.100.10.1
- 从 pc1 上的容器,我尝试在 pc2 上的容器中 ping 通 LTE 接口的 IP
- 在主机上使用 tcpdump,我可以看到 lte 接口上的 ARP 数据包:
02:2d:6d:ad:63:62 (oui Unknown) > Broadcast, ethertype ARP (0x0806), length 42: Ethernet (len 6), IPv4 (len 4), Request who-has 10.100.10.2 tell 10.100.10.1, length 28
但是我看不到它们到达 pc2,甚至在主机级别也看不到。
原因很可能是来自 LTE 调制解调器无法识别的 MAC 地址的数据包被丢弃。这类似于 WLAN 发生的情况。
所以我尝试使用 ipvlan l2 代替,正如有时建议的那样:
lte_net:
driver: ipvlan
driver_opts:
ipvlan_mode: l2
parent: lte0
容器中的 lte0 接口与其在主机上的父接口具有相同的 MAC 地址。但是没有变化:仍然没有跨越 LTE...
ipvlan l3 甚至没有出现,但我认为这不是我需要的。
所以我的问题是:我做错了什么?如何正确访问我的物理 LTE 作为 docker 容器中 IP 流量的网络接口?
对 3G 标记感到抱歉:我没有足够的声誉来创建 LTE 标记...
谢谢 !