我正在尝试在 Docker 容器内运行 OpenVPN 客户端,并使用--up/--down
参数来运行应用程序。连接正在建立,但来自应用程序的所有流量仍通过默认网关。
连接建立时,OpenVPN 服务器正在推送“redirect-gateway def1”,但 OpenVPN 客户端不会创建额外的路由来覆盖默认网关。
我尝试让我的应用程序通过隧道设备拨号,但超时了。当我从主机尝试时,这是可行的。
因此,我尝试手动建立路由(1 条到 openvpn 服务器的静态路由,以及用于所有其他流量的两条路由 0.0.0.0/1、128.0.0.0/1,就像在主机上尝试时创建的那样),并恢复应用程序以遵循默认路由,但仍然超时。
当我使用相同的 ovpn 配置文件从主机连接时,附加路由已建立。所有流量都通过 vpn 隧道,没有任何超时。
我在 fedora:latest、ubuntu:latest、alpine:latest 上尝试了相同的 docker 配置。
如何让隧道在 Docker 内部工作?
更新:
我意识到丢失路由是因为我运行带有--up/--down
参数的 openvpn。删除它们并将 openvpn 作为守护进程运行,将我的程序作为阻止进程运行后,路由已创建,但请求仍然超时。我在虚拟机中测试了同样的事情,它在那里工作正常。
答案1
容器与虚拟机不同,它们共享相同的内核。因此,容器内的 root 不具有与容器外的 root 相同的访问权限。否则,root 用户可以退出容器、挂载设备、更改其命名空间等。容器网络是从 root 用户中删除的功能之一。要删除所有这些限制,您可以使用选项测试您的代码docker run --privileged ...
。如果有效,您可以使用各种选项进行微调--cap-add
。无论您是否获得最低权限,您的主机都无法免受在具有这些设置的容器中运行的恶意应用程序的攻击。