我是网络新手,所以这是我第一次尝试。我创建了一个连接到 VPN 服务器的 openvpn docker。wget -q -O - https://api.myip.com
在 docker 容器内运行确认 docker 的网络已正确连接到 VPN,并且 IP 属于 VPN 服务器。现在我想尝试通过 docker 容器路由主机流量,并在容器外实现相同的结果,其中主机流量使用 docker 的 VPN 连接。我不太清楚如何从 docker 主机 <-> 容器关系中执行此操作,所以我想我可以利用 docker 中的端口映射功能,并在 docker 中建立一个 web 代理来处理任何 http/https 请求。
因此,我在同一个docker中启动了squid和openvpn服务器,并公开了3128端口(因为squid正在监听这个端口)。主机上的wget命令变成:
wget -q -O - https://api.myip.com -e use_proxy=yes -e http_proxy=localhost:12345
但测试表明,流量并未通过 docker 的 vpn 连接。结果显示,通信是通过主机的互联网连接进行的。
我使用以下 Docker 运行命令运行容器:
docker run --rm --cap-add NET_ADMIN --device /dev/net/tun --name vpn -it --sysctl net.ipv6.conf.all.disable_ipv6=0 -p 12345:3128 vpn-image
上述方法错误吗?通过多个 docker vpn 连接路由主机流量的最佳方法是什么?
以下资源表明这是可能的,但针对其用例提供了自己的解决方案。如果有一个像 wget 或 curl 这样的 Linux 网络工具可以帮助我调试/测试解决方案的进度,那就太好了。
答案1
这是一个老问题,但似乎至少最近引起了一些关注,所以我来回答它。
根据您要执行的操作,有两种方法可以让您的网络通过 VPN,并且根据您要路由的内容,有 3 种方法可以实现此目的。
代理(正向代理)
这要求您希望使用 VPN 的主机系统或容器明确将其流量定向到在 VPN 容器中运行的代理。您的 VPN 容器需要运行代理以及活动 VPN。这非常有效地管理双向网络转发。
该技术要求您从容器代理服务器公开一个端口,该端口已在 VPN 容器内手动配置,然后配置主机系统以用作localhost:port
代理。这相当复杂,并且有很多选项,因此您应该专门搜索一下。
直接网络堆栈控制(主机)
通常,VPN 容器具有在单独命名空间中运行的单独网络堆栈,但您可以告诉 docker 不要分离网络命名空间,而是授予它完整的网络堆栈访问权限,因为它在主机上本地运行。如果您尝试使用容器化 VPN,就好像它本地安装在主机上一样,您可以这样做。但是,主机网络命名空间的控制是与共享不同的权限,因此您还需要添加一些功能。3xact 功能取决于您的 VPN 软件,但它们通常是CAP_NET
、CAP_NET_RAW
和经常CAP_ADMIN
。如果您不确定并且信任您的应用程序,您可以使用特权模式授予所有功能(加上一些不必要的其他额外功能)。因此,为此,您将以下两个选项添加到您的运行命令中:--net=host --cap=CAP_NET,CAP_NET_RAW,CAP_NET_ADMIN
。
直接网络堆栈控制(另一个容器)
此选项与主机的直接网络堆栈控制概念相同,但允许您的 VPN 由另一个容器而不是主机使用,就像它在该容器内运行一样。要使用它,您只需在非 VPN 容器的运行命令中添加一行,告诉它与您的 VPN 容器共享网络堆栈:--net=container:vpn-container-name