从 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
.
我有一个简单的 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
.