Loading... # OpenVPN for Docker [](https://travis-ci.org/kylemanna/docker-openvpn) [](https://hub.docker.com/r/kylemanna/openvpn/) [](https://hub.docker.com/r/kylemanna/openvpn/) [](https://app.fossa.io/projects/git%2Bgithub.com%2Fkylemanna%2Fdocker-openvpn?ref=badge_shield) OpenVPN服务器位于Docker容器中,配有EasyRSA PKI CA。 在[数字海洋$ 5 / mo节点](http://bit.ly/1C7cKr3)上进行了广泛测试,并且具有 相应的[数字海洋社区教程](http://bit.ly/1AGUZkq)。 #### 上游链接 * Docker Registry @ [kylemanna/openvpn](https://hub.docker.com/r/kylemanna/openvpn/) * GitHub @ [kylemanna/docker-openvpn](https://github.com/kylemanna/docker-openvpn) ## 快速入门 * 为数据卷容器选择一个名称。建议 使用前缀与参考系统无缝操作 服务。鼓励用户替换为描述性名称 他们的选择。`$OVPN_DATA``ovpn-data-``example` ``` OVPN_DATA="ovpn-data-example" ``` * 初始化将保存配置文件的容器 和证书。容器将提示输入密码以保护 新生成的证书颁发机构使用的私钥。`$OVPN_DATA` ``` docker volume create --name $OVPN_DATA docker run -v $OVPN_DATA:/etc/openvpn --rm kylemanna/openvpn ovpn_genconfig -u udp://VPN.SERVERNAME.COM docker run -v $OVPN_DATA:/etc/openvpn --rm -it kylemanna/openvpn ovpn_initpki ``` * 启动OpenVPN服务器进程 ``` docker run -v $OVPN_DATA:/etc/openvpn -d -p 1194:1194/udp --cap-add=NET_ADMIN kylemanna/openvpn ``` * 生成不带密码的客户端证书 ``` docker run -v $OVPN_DATA:/etc/openvpn --rm -it kylemanna/openvpn easyrsa build-client-full CLIENTNAME nopass ``` * 使用嵌入式证书检索客户端配置 ``` docker run -v $OVPN_DATA:/etc/openvpn --rm kylemanna/openvpn ovpn_getclient CLIENTNAME > CLIENTNAME.ovpn ``` ## 后续步骤 ### 更多阅读 [文档](https://github.com/kylemanna/docker-openvpn/blob/master/docs)文件夹中提供了高级配置的杂项记录。 ### 系统初始化脚本 Ainit脚本可用于管理OpenVPN容器。它将 在系统启动时启动容器,如果容器退出,则重新启动容器 出乎意料,并从 Docker Hub 拉取更新以保持自身最新状态。`systemd` 请参阅[systemd 文档](https://github.com/kylemanna/docker-openvpn/blob/master/docs/systemd.md)以了解更多信息。 ### 码头工人撰写 如果您更喜欢使用,请参阅文档。`docker-compose` ## 调试提示 * 创建一个名称为 DEBUG 且值为 1 的环境变量以启用调试输出(使用 “docker -e”)。 ``` docker run -v $OVPN_DATA:/etc/openvpn -p 1194:1194/udp --cap-add=NET_ADMIN -e DEBUG=1 kylemanna/openvpn ``` * 使用正确安装了 openvpn 的客户端进行测试 ``` $ openvpn --config CLIENTNAME.ovpn ``` * 如果事情不起作用,请在客户端上运行一连串的调试检查 ``` $ ping 8.8.8.8 # checks connectivity without touching name resolution $ dig google.com # won't use the search directives in resolv.conf $ nslookup google.com # will use search ``` * 考虑为自动设置[系统服务](https://github.com/kylemanna/docker-openvpn/blob/master/docs/systemd.md) 在启动时启动,并在OpenVPN守护程序或Docker事件中重新启动 崩溃。 ## 它是如何工作的? 使用映像初始化卷容器 包含自动生成的脚本:`kylemanna/openvpn` * 迪菲-赫尔曼参数 * 私钥 * 与OpenVPN服务器的私钥匹配的自证书 * 一个 EasyRSA CA 密钥和证书 * 来自 HMAC 安全性的 TLS 身份验证密钥 OpenVPN服务器以默认运行cmd启动`ovpn_run` 配置位于,并且 Dockerfile 将该目录声明为卷。这意味着您可以开始另一个 带有参数的容器,并访问配置。 该卷还保存 PKI 密钥和证书,以便可以对其进行备份。`/etc/openvpn``-v` 要生成客户端证书,请通过容器路径中的命令使用 EasyRSA。环境 变量将 PKI CA 置于其下。`kylemanna/openvpn``easyrsa``EASYRSA_*``/etc/openvpn/pki` 方便,附带一个脚本称为, 转储内联OpenVPN客户端配置文件。这个单一文件可以 然后提供给客户端以访问VPN。`kylemanna/openvpn``ovpn_getclient` 要为客户端(也称为 OTP)启用双因素身份验证,请参阅[此文档](https://github.com/kylemanna/docker-openvpn/blob/master/docs/otp.md)。 ## OpenVPN详细信息 我们使用mode,因为它适用于最广泛的设备.例如,mode不适用于Android,除非该设备 扎根。`tun``tap` 使用的拓扑是,因为它适用于最广泛的操作系统,例如,不适用于Windows。`net30``p2p` 默认情况下,UDP 服务器用于动态客户端。`192.168.255.0/24` 客户端配置文件指定,这意味着在 建立VPN连接,所有流量都将通过VPN。 如果您使用本地 DNS 解析器,这可能会导致问题,而这些解析器不是 可直接访问,因为您将尝试通过VPN联系它们 他们可能不会回答你。如果发生这种情况,请使用公共 DNS 解析器,如谷歌(8.8.4.4和8.8.8.8)或OpenDNS的解析器 (208.67.222.222 和 208.67.220.220)。`redirect-gateway def1` ## 安全讨论 Docker 容器运行自己的 EasyRSA PKI 证书颁发机构。这是 选择作为在安全性和便利性方面妥协的好方法。容器 假设 OpenVPN 容器在安全上运行 主机,也就是说对手无法访问 PKI 文件 下。这是一个相当合理的折衷方案,因为如果 攻击者可以访问这些文件,攻击者可以操纵 OpenVPN服务器本身的功能(嗅探数据包,创建新的PKI CA,MITM 数据包等)。`/etc/openvpn/pki` * 默认情况下,证书颁发机构密钥保存在容器中 单纯。强烈建议使用一些来保护 CA 密钥 防止文件系统受损的密码。更安全的系统 将 EasyRSA PKI CA 放在离线系统上(可以使用相同的 Docker 图像和脚本[`ovpn_copy_server_files`](https://github.com/kylemanna/docker-openvpn/blob/master/docs/paranoid.md)来完成此操作)。 * 对手不可能签署不良或伪造的证书 如果不首先破解密钥的传递阶段,如果对手有根 访问文件系统。 * EasyRSA命令将生成密钥并将其保留在 服务器,再次可能破坏和窃取密钥。生成的密钥 需要由用户希望使用密码配置的 CA 签名 如上所述。`build-client-full` * 假设 Docker 容器文件系统的其余部分是安全的,TLS + PKI 安全性应防止任何恶意主机使用 VPN。 ## 在 Docker 容器内运行的好处 ### 整个守护程序和依赖项都在 Docker 映像中 这意味着它将在 Docker 本身设置后正常运行 所有发行版Linux发行版,例如:Ubuntu,Arch,Debian,Fedora, 等。此外,旧的稳定服务器可以运行前沿的OpenVPN服务器。 无需安装/清理库依赖项(即运行最新的 OpenVPN 在 Ubuntu 12.04 LTS 上使用最新的 OpenSSL)。 ### 它不会踩遍服务器的文件系统 Docker 容器的所有内容都包含在两个映像中:短暂的 运行时映像(Kylemanna/OpenVPN)和数据卷。要删除 它,删除相应的容器,数据卷和Docker。 图像,它被完全删除。这也使得运行多个 服务器,因为每个服务器都存在于容器的气泡中(当然有多个 IP 或者需要单独的端口与世界通信)。`$OVPN_DATA``$OVPN_DATA` ### 一些(有争议的)安全优势 在最简单的层面上,破坏容器可能会阻止额外的 服务器的危害。围绕这一点有很多争论,但是 带走的是,这肯定会使突破变得更加困难 容器。人们正在积极开发Linux容器,以使其更多 未来的保证。 ## 与jpetazzo / dockvpn的区别 * 不再使用 serveconfig 通过 https 分发配置 * 集成到映像中的适当 PKI 支持 * OpenVPN配置文件,PKI密钥和证书存储在存储中 可跨容器重复使用的卷 * 为 HMAC 安全性添加 tls-auth ## 最初测试于 * 码头工人主机: * 服务器[一个数字海洋](https://www.digitalocean.com/?refcode=d19f7fe88c94)液滴,运行 Ubuntu 14.04 的 512 MB RAM * 客户 * Android App OpenVPN Connect 1.1.14 (build 56) * OpenVPN 核心 3.0 安卓 armv7a thumb2 32 位 * OS X Mavericks with Tunnelblick 3.4beta26 (build 3828) using openvpn-2.3.4 * ArchLinux OpenVPN pkg 2.3.4-1 最后修改:2022 年 11 月 02 日 05 : 46 PM © 转载自他站 赞赏 要多恰饭才能长胖 赞赏作者 支付宝微信