从Docker容器创建OpenVPN连接

时间:2019-08-22 17:55:27

标签: 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,我得到以下错误:

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

[EDIT]通过OpenVPN GUI启动.ovpn配置可以正常工作。

有什么建议吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

问题在于您所用的sudo不会改变任何内容。它不是“权限被拒绝”类型问题的最终解决方案。当您的容器已经代表root运行时,这尤其不起作用。

Linux中的特权操作由功能控制,这些功能表示特定特权操作的权限。为了使该模型与经典UNIX模型兼容,缺省情况下,代表root运行的进程具有所有功能。例如,诸如sudo之类的将您的UID升级为0的事物,为您提供了全套功能。

但是,在容器中并非如此-容器中的过程(甚至是root拥有的)可用的功能量受到所谓的边界集的限制,在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毫无用处(它不会为您提供更多的功能),因此您可以删除它并仅使用{{1 }}。