无法通过Anyconnect VPN连接到Docker。

19

我在Windows上使用Docker Toolbox进行Docker相关开发。当我在家庭或办公网络上时,这很正常,但是当我使用AnyConnect VPN连接到办公网络时,它就不能工作了。请告诉我是否有可以更改的网络设置来使其工作。

6个回答

6

我特别喜欢OpenConnect(比network-manager-openconnect支持更多的配置选项)。即使需要csd-wrapper的丑陋安装通常也运行良好。

AnyConnect以奇怪的方式破坏Docker网络,即使在退出VPN后它们仍然无法使用(即使在之后停止vpnagentd)。

解决方法是停止docker,清除其所有网络和桥接,并仅在此之后开始AnyConnect VPN。 在VPN会话结束后可以启动docker,它将重新创建所有必要的内容。

我创建了一个脚本来解决这个不幸的行为,正是这样做:

#!/bin/sh
# usage: 
#   vpn.sh [start]
#   vpn.sh stop    

if [ "$1" = "stop" ]; then
    /opt/cisco/anyconnect/vpn/vpn disconnect
    sudo systemctl stop vpnagentd
    echo "Cisco VPN stopped"
    echo "Starting docker"
    sudo systemctl start docker
else
    echo "Stopping docker"
    sudo systemctl stop docker
    bridges=$(sudo brctl show | cut -f1 | tail -n +2)
    for b in $bridges; do
        sudo nmcli connection delete $b
        sudo ip link set dev $b down
        sudo brctl delbr $b
    done
    echo "Starting Cisco VPN"
    sudo systemctl start vpnagentd
    /opt/cisco/anyconnect/vpn/vpn connect 'VPN-NAME'
fi

注意:VPN管理员可以阻止您使用OpenConnect,并强制您仅使用Cisco AnyConnect,但如果VPN配置文件中启用了LocalLanAccess,您可能会获得更好的使用体验。


4
默认情况下,Docker会向路由表中添加一个条目,将所有目的地为172.17.X.X的流量转发到环回地址。如果您的计算机通过AnyConnect分配的IP地址以172.17开头,则两个子网重叠,Docker会使VPN连接冻结(您可以通过查看AnyConnect分配的IP地址并将其与Docker机器的路由表进行比较来检查)。
如果是这种情况,您可以通过向%programdata%\docker\config\daemon.json添加以下内容来更改Docker使用的默认子网。
{
  "default-address-pools":
  [
    {"base":"10.10.0.0/16","size":24}
  ]
}

在进行这些配置更改后,重新启动Docker服务并验证是否已设置新的子网(您可以使用 netstat -rn )。

有关Linux步骤的文章在这里


2
以下方法对我有用。尝试使用OpenConnect代替AnyConnect:
sudo apt install openconnect
sudo apt install network-manager-openconnect

然后(至少适用于Ubuntu 16),请注释掉dns=dnsmasq这一行,使它变成以下形式:

$ cat /etc/NetworkManager/NetworkManager.conf
[main]
plugins=ifupdown,keyfile,ofono
#dns=dnsmasq

然后使用NetworkManager添加一个连接到您的VPN提供商并连接。(NetworkManager->编辑连接->添加。然后选择连接类型为VPN->Cisco Annyconnect)

重新启动并重新连接,现在Docker容器应该可以访问互联网了。


这对我有用。我不确定为什么AnyConnect应用程序不起作用,但我有更好的事情要做,而不是解决VPN连接问题 :) - BillMan

0
您可以配置本地路由表。通常 Docker 端点为 192.168.x.x,为了让其走本地网络而非 VPN,您可以添加以下路由规则。 route add 192.168.0.0 mask 255.255.0.0 192.168.0.1 -p -p 表示将其永久添加。然后运行以下命令查看是否设置成功。 route print

0

我曾经遇到过完全相同的问题——在 Cisco Anyconnect VPN 下,Docker 容器网络无法工作。 我尝试了很多在线发布的解决方案——启用 Cisco Anyconnect 的本地 LAN 地址、更新 IP 路由表等等。 但是,这些方法对我都没有起作用。 后来,我安装了 Docker Desktop 应用程序,该应用程序包含在 Linux 中。 打开 Docker Desktop 应用程序后,我重新启动了所有容器,容器网络恢复正常并开始工作。


0

我知道这个问题有些老了,但如果您在谷歌上搜索docker cisco vpn相关问题的话,这是第一个stackoverflow的结果。 由于我最近几天也遇到了这个问题,并且我在网上找到的所有解决方案都不能解决我的问题,所以我想在这里分享我的解决方案。

# Some setup at first, skip if you already have those..
sudo apt-get install ca-certificates curl gnupg lsb-release

# add key and sources
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# install docker
sudo apt-get update \
&& sudo apt-get install docker-ce docker-ce-cli containerd.io

# disable docker services
sudo systemctl disable --now docker.service docker.socket

# setup docker for rootless usage and switch to that context
dockerd-rootless-setuptool.sh install
docker context use rootless

# add the following to your bashrc or zshrc and source it ofc
export DOCKER_HOST=unix:///run/user/1000/docker.sock

# user start the docker service again (no sudo)
systemctl --user start docker

希望这能至少帮助到某个人。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接