从 docker 个容器创建 OpenVPN 连接

Create OpenVPN connection from docker container

我有一个简单的 docker 文件

FROM ubuntu:14.04

USER root

RUN apt-get update && sudo apt-get -y install openvpn

COPY . /tmp

在哪里。包含有关 vpn 连接的所有必要信息(ovpn 文件、ca 文件、用户证书和密钥)。

通过 docker run -it --device=/dev/net/tun 构建和 运行 容器,然后切换到 /tmp 目录并执行 sudo openvpn config.ovpn 我收到以下错误:

Fri Aug 23 06:15:21 2019 ERROR: Cannot ioctl TUNSETIFF tun: Operation not permitted (errno=1)

[编辑] 通过 OpenVPN GUI 启动 .ovpn 配置工作正常。

有什么建议吗?

谢谢。

问题是 sudo 在你的情况下没有任何改变。它不是 "Permission denied" 类问题的最终解决方案。当您的容器已经 运行 代表 root.

时,这尤其不起作用

Linux 中的特权操作受 capabilities 控制,代表特定特权操作的权限。为了使该模型与经典 UNIX 模型兼容,默认情况下代表 root 的进程 运行ning 具有所有功能。例如,sudo 之类的东西将您的 UID 升级为 0 授予您一整套功能。

然而,这在容器中并非如此 - 容器中进程可用的功能数量(即使是 root 拥有的)受到所谓的 边界集 ,默认情况下包含非常有限的功能,当 运行ning in Docker:

$ docker run -it ubuntu:14.04
root@fe50edf72783:/# capsh --print

Current: = cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,
cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,
cap_mknod,cap_audit_write,cap_setfcap+eip

Bounding set =cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,
cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,
cap_mknod,cap_audit_write,cap_setfcap

网络管理(接口配置等)需要 CAP_NET_ADMIN 能力。如您所见,它不在 Docker 容器的默认边界集中,因此您需要使用 --cap-add=net_admin:

显式添加它
docker run -it --device=/dev/net/tun --cap-add=net_admin

在此之后,您将在容器中拥有此功能。考虑到你 运行 它代表 root,拥有这个能力使得使用 sudo 变得毫无用处(它不会赋予你比现在更多的能力),所以你可以放弃它并 运行 OpenVPN 只需 openvpn config.ovpn.