Docker Desktop Windows和VPN-容器内部没有网络连接

时间:2020-03-26 14:10:06

标签: windows docker vpn

我正在尝试在Windows上使用Docker,同时将其连接到VPN。

未连接VPN时,一切正常。

但是,当我使用Cisco AnyConnect客户端连接到我们的公司VPN时,docker容器内的网络不再起作用:

docker run alpine ping www.google.com
ping: bad address 'www.google.com'

docker run alpine ping -c 5 216.58.204.36
PING 216.58.204.36 (216.58.204.36): 56 data bytes
--- 216.58.204.36 ping statistics ---
5 packets transmitted, 0 packets received, 100% packet loss

如何解决此问题并使之生效?

我的设置是:

  • Windows 10版本1809(操作系统内部版本17763.1098)
  • Docker桌面社区2.2.0.4(43472):引擎19.03.8,撰写1.25.4,Kubernetes 1.15.5,公证人0.6.1,凭据帮助器0.6.3
  • Docker处于Windows容器模式,并启用了实验性功能(需要同时运行Windows和linux映像)

1 个答案:

答案 0 :(得分:0)

实际上我是使用 Docker 桌面和 Hyper-V 虚拟机完成的。使用 OpenConnect,但我认为大多数 VPN 客户端只需稍作调整即可完成。

完整说明的说明在此处Docker Desktop, Hyper-V and VPN,其中包含 Docker 容器、Windows 虚拟机和 Linux 虚拟机的设置

  • 我创建了一个新的内部虚拟交换机(我们称之为“内部”)并为其分配了一个静态 IP 地址(比如说 192.168.4.2)

  • 我使用 Ubuntu 服务器和 OpenConnect 创建了一个新虚拟机,连接到默认虚拟交换机和“内部”

  • 在 OpenConnect 虚拟机上

    • 分配给“内部”一个固定 ip (192.168.4.3)

    • 添加了一个新的 tun 接口“persistent”,告诉 openconnect 使用那个 tun(添加“-i tun0”参数作为 openconnect 启动参数)

      sudo ip tuntap 添加名称 tun0 模式 tun

    • 安装了persist-iptables

    • 强制ip转发

      sudo echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf && sysctl -p

    • 设置路由

      sudo iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE sudo iptables -A FORWARD -i eth0 -o tun0 -j ACCEPT sudo iptables -A FORWARD -o tun0 -j ACCEPT sudo iptables -A FORWARD -i tun0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT 须藤 iptables -A 输入 -i tun0 -j 接受

    • 连接 vpn 后,我将 dns 服务器永久添加到了 resolve.conf

    • 并检索 VPN 的地址类别(如 10...* )

  • 在 Docker 容器上

    • 在 Dockerfile 中添加了基本路由

      RUN route add -net 10.0.0.0 网络掩码 255.0.0.0 gw 1​​92.168.4.3

    • 然后运行 ​​docker 文件,我添加了 dns,授予 net admin 和 sys 模块权限

      --dns 8.8.8.8 --dns 10.1.77.21 --dns 10.4.52.21 --dns-search test.dns.it
      --cap-add=NET_ADMIN --cap-add=SYS_MODULE