Windows 容器无法访问互联网,但 Linux 容器可以 - 在主机上激活 VPN 客户端

Mor*_*now 5 vpn docker docker-for-windows

我的主机上安装了 Stonesoft VPN-Client 和 Docker-for-Windows。我的 Windows 容器似乎无法解析任何主机(甚至 www.google.com)。然而,我的 Linux 容器工作得很好。当我禁用网络适配器列表中的 VPN 适配器时,Windows 容器可以再次访问 Internet。但我需要它们与 VPN 一起工作。

所以我研究了一段时间并尝试遵循:

  1. 在 powershell 中检查适配器优先级:Get-NetIPInterface -AddressFamily IPv4 | Sort-Object -Property InterfaceMetric -Descending

在此处输入图片说明

据说,主适配器应该具有最低的度量值。在我的情况下是以太网,这似乎很好。https://github.com/docker/for-win/issues/2760

  1. 使用 --dns=8.8.8.8 标志运行图像。没有解决问题。
  2. 我进入了 Hyper-V 管理器的虚拟交换机设置。我将名为“nat”的开关设置为“外部网络”。好吧,我的容器在那之后获得了互联网连接。但它自动禁用了 VPN 适配器,所以这是不对的。

  3. 将 vEthernet(nat) 的 IPv4 地址和 DNS 设置为自动。也没有帮助。

  4. 重新安装容器工具、Hyper-V 和 Docker。没有成功。

  5. 尝试旧版本的 Docker-for-Windows。没有成功。

以下是有关我的环境的一些信息:

我的网络适配器:

在此处输入图片说明

我的 Docker 设置是默认设置。

在此处输入图片说明

在此处输入图片说明

Hyper-V 虚拟交换机:

在此处输入图片说明

vEthernet(nat) IPv4 设置:

在此处输入图片说明

vEthernet(DockerNAT) IPv4 设置:

在此处输入图片说明

vEthernet(默认交换机)IPv4 设置:

在此处输入图片说明

ipconfig /all 在我的主机上:

在此处输入图片说明 在此处输入图片说明

我希望这会有所帮助,有人可以回答这个问题。它已经困扰我很长一段时间了。

编辑:

由于那里没有实际问题:

我该如何解决这个问题?

Sch*_*hLx 0

我假设如果您连接到 VPN(办公网络),从本地网络(家庭网络)访问主机也会遇到问题。您可以在 docker 主机上使用命令检查route print,您可能会看到类似以下内容的行: 172.23.58.112 255.255.255.240 10.141.192.1 10.141.239.232 2

\n

以上是VPN配置相关的内容。可以通过分割隧道来配置 VPN 。这不仅允许网络流量到达办公网络,但出于安全原因,它通常被禁止。

\n

我现在使用的是 Windows 10 build 1803 和 Docker 2.3.0.3 (45519)

\n

如果是这种情况,我们恐怕无能为力,Windows 容器是使用 hyper-v 的虚拟交换机连接的,在我的情况下,AnyConnect 是公司配置的,并禁止公司网络之外的任何网络通信。

\n

有趣的是,Linux 容器的工作方式有所不同,据我所知,网络层现在位于 Linux 下,并且内核具有directdocker 主机连接。使用 Linux 容器,我可以毫无问题地发出ping host.docker.internal.

\n

但我希望我错了,有人告诉我不同​​的:)

\n

您能否route print也从主机和容器发送命令的结果,以验证我的假设!

\n

引用

\n

Windows容器网络

\n
\n

容器主机使用 Hyper-V 虚拟交换机向容器提供此连接,并使用主机虚拟 NIC(Windows Server 容器)或综合 VM NIC(Hyper-V 容器)将容器连接到虚拟交换机 (vSwitch) 。将此与 Linux 容器进行比较,Linux 容器使用桥接设备而不是 Hyper-V 虚拟交换机,并使用 veth 对而不是 vNIC / vmNIC 来为容器本身提供基本的第 2 层(以太网)连接。然而,Hyper-V 虚拟交换机本身并不允许外部世界访问容器中运行的网络服务。我们还需要第 3 层 (IP) 连接来将数据包正确路由到其预期目的地。

\n
\n

Linux 容器(与 VPN 配合使用):

\n

深入了解 Docker 网络的幕后故事

\n
\n

docker0是Docker创建的虚拟桥接接口。它从私有定义的范围中随机选择一个地址和子网。所有的Docker容器都连接到这个网桥,并使用docker创建的NAT规则与外界通信。还记得我上面提到的 \xe2\x80\x9cchannels\xe2\x80\x9d 吗?好吧,这些通道实际上是一个 veth \xe2\x80\x9ctunnel\xe2\x80\x9d (每个容器命名空间和 docker0 桥之间的双向连接)。

\n
\n

一些更有趣的东西:

\n

Hyper-V 支持称为集成服务的功能。

\n
\n

为了使用 Hyper-V 套接字,应用程序必须在 Hyper-V 主机的注册表中注册。

\n

通过在注册表中注册服务,您将获得:

\n

用于启用、禁用和列出可用服务的 WMI 管理 直接与虚拟机通信的权限。

\n

注册表位置和信息:

\n
    \n
  • HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Virtualization\\GuestCommunicationServices\\
  • \n
\n
\n

在我的系统上,该注册表区域包含以下条目:

\n
[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Virtualization\\GuestCommunicationServices\\000007CF-FACB-11E6-BD58-64006A7986D3]\n"ElementName"="Docker VPNKit Bridge"\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Virtualization\\GuestCommunicationServices\\00001003-FACB-11E6-BD58-64006A7986D3]\n"ElementName"="Docker fileserver"\n
Run Code Online (Sandbox Code Playgroud)\n

我发现与此主题相关的一个网站是此网站:\n https://qiita.com/kikuchi_kentaro/items/29dd46ea8d0fda6e7f02#hyper-v-socket

\n

还有一些类似的内容,但我不确定 docker 用于桌面的到底是什么:

\n\n

基于此,我假设 docker 在本地主机网络空间上使用某种隧道代理,该代理通过 Hyper-V 到 Linux 套件的集成服务进行隧道传输。一个端点是 VPN-Kit(Windows 用户空间),另一个端点是连接到 docker0 虚拟网桥的 eth0(Linux 套件)。这就是 Linux 容器不受 VPN 影响的原因。

\n

注意:即使使用 WSL2,VPN-Kit 仍然适用于 Linux 容器。

\n