从docker容器创建OpenVPN连接

从docker容器创建OpenVPN连接,docker,vpn,openvpn,Docker,Vpn,Openvpn,我有一个简单的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我得到以

我有一个简单的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
不会改变任何东西。这不是“拒绝许可”类问题的最终解决方案。当您的容器已经代表
root
运行时,这尤其不起作用

Linux中的特权操作由功能控制,这些功能表示特定特权操作的权限。为了保持此模型与经典UNIX模型兼容,默认情况下代表
root运行的进程具有所有功能。例如,
sudo
,它将UID升级为
0
还可以授予您一整套功能

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

$ 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\u NET\u ADMIN
功能。如您所见,它不在Docker容器的默认边界集中,因此需要使用
--cap add=net_admin
显式添加它:

docker run -it --device=/dev/net/tun --cap-add=net_admin

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

运行OpenVPN。问题是在您的情况下
sudo
不会改变任何东西。这不是“拒绝许可”类问题的最终解决方案。当您的容器已经代表
root
运行时,这尤其不起作用

Linux中的特权操作由功能控制,这些功能表示特定特权操作的权限。为了保持此模型与经典UNIX模型兼容,默认情况下代表
root运行的进程具有所有功能。例如,
sudo
,它将UID升级为
0
还可以授予您一整套功能

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

$ 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\u NET\u ADMIN
功能。如您所见,它不在Docker容器的默认边界集中,因此需要使用
--cap add=net_admin
显式添加它:

docker run -it --device=/dev/net/tun --cap-add=net_admin

在此之后,您将在容器中拥有此功能。考虑到您代表
root
运行它,拥有此功能会使使用
sudo
毫无用处(它不会授予您比现在更多的功能),因此,除了
--device=/dev/net/tun
,您可以简单地删除它并运行OpenVPN,只需使用
OpenVPN config.ovpn

尝试
--cap add=net\u admin
。请更新问题并将格式化的输出放在那里-很难在一行中看到:)这似乎与连接配置本身有关,而不是而不是Docker。。。除非你的Docker网络使用与你的VPN尝试相同的网络。不,对不起,没有立即的想法。很高兴看到您的客户机配置(没有敏感参数)和服务器配置(如果可以访问),以便进行进一步的故障排除。只是为了检查-确保在连接尝试之前容器中没有类似的路由。关于GUI客户端:我不确定它是否与CLI工作相同。最近,当
NetworkManager
覆盖OVPN配置并自行处理路由设置时,连接配置文件在NM中运行良好,但在OVPN CLI中运行不好。OVPNGUI和CLI之间可能存在类似的差异(当然,这种可能性较小)。除了
--device=/dev/net/tun
之外,请尝试
--cap add=net\u admin
。请更新问题并将格式化输出放在那里-很难在一行中看到:)这一问题似乎与连接配置本身有关,而不是与Docker相关。。。除非你的Docker网络使用与你的VPN尝试相同的网络。不,对不起,没有立即的想法。很高兴看到您的客户机配置(没有敏感参数)和服务器配置(如果可以访问),以便进行进一步的故障排除。只是为了检查-确保在连接尝试之前容器中没有类似的路由。关于GUI客户端:我不确定它是否与CLI工作相同。最近,当
NetworkManager
覆盖OVPN配置并自行处理路由设置时,连接配置文件在NM中运行良好,但在OVPN CLI中运行不好。OVPNGUI和CLI之间可能存在类似的差异(当然,这种可能性较小)。