从docker容器创建OpenVPN连接
我有一个简单的docker文件从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我得到以
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之间可能存在类似的差异(当然,这种可能性较小)。