Docker 容器无法使用 macvlan 网络驱动程序访问或 ping WAN

标签 docker

我正在尝试使用 macvlan 驱动程序配置 Docker 网络,但我的容器无法到达网关或 WAN。

网络设置如下:

docker network create -d macvlan --subnet=10.1.1.0/24 --ip-range=10.1.1.160/28 --gateway=10.1.1.1 -o parent=ens160 pub_net

主机操作系统是 Ubuntu 16.04,它本身是一个运行在 ESXi 上的虚拟机(我知道有很多层)。 ens160 接口(interface)连接到 ESXi vSwitch(“LAN”)。网关 (10.1.1.1) 是同一台机器上的 pfSense VM,并连接到同一“LAN”vSwitch。 pfSense VM 还连接到物理连接到上游网络的“WAN”vSwitch。 Ubuntu 主机操作系统具有 IP 和完整的 WAN 连接,但 Docker 容器没有。

关于 Ubuntu 主机的一些细节:

host$ ifconfig
docker0   Link encap:Ethernet  HWaddr aa:bb:cc:00:e2:77  
          inet addr:172.17.0.1  Bcast:0.0.0.0  Mask:255.255.0.0
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

ens160    Link encap:Ethernet  HWaddr aa:bb:cc:9b:be:f2  
          inet addr:10.1.1.22  Bcast:10.1.1.255  Mask:255.255.255.0
          inet6 addr: fe80::c7b7:d64c/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:64642 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1881 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:19190911 (19.1 MB)  TX bytes:169266 (169.2 KB)

ens192    Link encap:Ethernet  HWaddr aa:bb:cc:9b:be:fc  
          inet addr:10.2.2.22  Bcast:10.2.2.255  Mask:255.255.255.0
          inet6 addr: fe80::bb15:267d/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:294 errors:0 dropped:10 overruns:0 frame:0
          TX packets:515 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:57996 (57.9 KB)  TX bytes:63258 (63.2 KB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:2637 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2637 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1 
          RX bytes:204727 (204.7 KB)  TX bytes:204727 (204.7 KB)


host$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.2.2.1        0.0.0.0         UG    100    0        0 ens192
0.0.0.0         10.1.1.1        0.0.0.0         UG    101    0        0 ens160
10.1.1.0        0.0.0.0         255.255.255.0   U     100    0        0 ens160
10.2.2.0        0.0.0.0         255.255.255.0   U     100    0        0 ens192
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 ens192
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0

切换到 Docker 容器,以及那里的详细信息:

host$ sudo docker run --net=pub_net -it alpine /bin/sh

container$ ifconfig
eth0      Link encap:Ethernet  HWaddr AA:BB:CC:01:01:A0  
          inet addr:10.1.1.160  Bcast:0.0.0.0  Mask:255.255.255.0
          inet6 addr: fe80::42:1a0/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:15 errors:0 dropped:0 overruns:0 frame:0
          TX packets:9 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:1789 (1.7 KiB)  TX bytes:634 (634.0 B)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:2 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1 
          RX bytes:224 (224.0 B)  TX bytes:224 (224.0 B)

container$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.1.1.1        0.0.0.0         UG    0      0        0 eth0
10.1.1.0        0.0.0.0         255.255.255.0   U     0      0        0 eth0

如前所述,如果我从容器内 ping 10.1.1.1(或任何其他外部 IP),我没有收到任何响应。如果我在同一主机上 ping 另一个 Docker 容器,我确实会收到响应。

我需要更改什么以使容器可以到达 WAN?

最佳答案

您需要打开混杂模式并允许您的 LAN vSwitch 进行伪造传输。这是因为 macvlan 模式要求 guest 监听伪造的 MAC 地址并能够伪造 MAC 地址。

VMware Knowledge Base article on promiscuous mode

VMware documentation on forged transmits

关于Docker 容器无法使用 macvlan 网络驱动程序访问或 ping WAN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42465520/

相关文章:

docker - 错误 "The input device is not a TTY"

Docker RabbitMQ 持久性

docker - 如何准备用于服务器连接的容器?

mysql - 使用密码时无法连接到Kubernetes上的mariadb

docker - 有没有办法从容器中知道服务名称(群)?

java - 如果你只有一个 java 应用程序的 shell 安装程序,你如何构建一个 docker 镜像?

docker - 库伯内特斯问题。配置文件。

docker - Docker:从docker.io提取图像(最新)时出错

macos - 如何在 Mac 中安装 SSL/TLS 证书 CA 文件以实现安全 (HTTPS) 远程存储库 docker 登录

postgresql - 从 TypeORM docker 容器连接 PostgreSQL