通过 docker openvpn 容器路由主机

Lea*_*Man 6 networking proxy openvpn testing docker

我是网络新手,所以我是第一次尝试。我创建了一个连接到 VPN 服务器的 openvpn docker。在 docker 容器内运行wget -q -O - https://api.myip.com可确认 docker 的网络已正确连接到 VPN 并且 IP 属于 VPN 服务器。现在我想尝试通过docker容器路由主机流量,并在主机流量使用docker的VPN连接的容器外部实现相同的结果。我不太清楚如何从 docker 主机 <-> 容器关系中做到这一点,所以我想也许我可以利用 docker 中的端口映射功能,并在 docker 中建立一个 Web 代理来处理任何 http/https要求。

因此,我在同一个 docker 中建立了鱿鱼和 openvpn 服务器并公开了端口 3128(因为这是鱿鱼正在侦听的端口)。主机上的 wget 命令变为: wget -q -O - https://api.myip.com -e use_proxy=yes -e http_proxy=localhost:12345

但测试表明流量没有通过 docker 的 VPN 连接。相反,结果显示通信是通过主机的互联网连接进行的。

我使用以下 Docker run 命令运行容器:

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
Run Code Online (Sandbox Code Playgroud)

上面的做法有错吗?通过多个 docker vpn 连接路由主机流量的最佳方法是什么?

以下资源表明这是可能的,但提供了特定于其用例的解决方案。如果有一个像 wget 或 curl 这样的 Linux 网络工具可以帮助我调试/测试我的解决方案的进度,那就太好了。

小智 0

这是一个老问题,但似乎最近至少获得了一些流量,所以我会回答它。

根据您尝试执行的操作,有 2 种方法可以让您的网络通过 VPN;根据您尝试路由的内容,有 3 种方法可以实现此目的。

代理(转发代理)

这要求您想要使用 VPN 的主机系统或容器将其流量显式定向到 VPN 容器中运行的代理。您的 VPN 容器需要运行代理以及活动 VPN。Pretty 有效地管理双向网络转发。

该技术要求您公开在 VPN 容器内手动配置的容器代理服务器的端口,然后将主机系统配置为用作localhost:port代理。这非常复杂并且有很多选项,所以你应该专门谷歌一下。

直接网络堆栈控制(主机)

通常,VPN 容器有一个单独的网络堆栈在单独的命名空间中运行,但您可以告诉 docker 不要分离网络命名空间并授予其完整的网络堆栈访问权限,因为它在主机上本机运行。如果您尝试使用容器化 VPN,就像它本地安装在主机上一样,那么您应该这样做。然而,对主机网络命名空间的控制是一个单独的权限,而不仅仅是共享它,因此您还需要添加一些功能。3xact 功能取决于您的 VPN 软件,但它们通常是CAP_NETCAP_NET_RAWCAP_ADMIN。如果您不确定并信任您的应用程序,您可以使用特权模式来授予所有功能(加上一些不必要的其他额外功能)。因此,为此,您将这两个选项添加到运行命令中:--net=host --cap=CAP_NET,CAP_NET_RAW,CAP_NET_ADMIN

直接网络堆栈控制(另一个容器的)

此选项与主机的直接网络堆栈控制概念相同,但允许另一个容器而不是主机使用您的 VPN,就像它在该容器内运行一样。要使用它,您只需在非 VPN 容器的运行命令中添加一行,告诉它与您的 VPN 容器共享网络堆栈:--net=container:vpn-container-name