2 秒内在 Docker 中启动 OpenVPN

哈布罗夫斯克居民大家好! 您是否曾经遇到过这样的情况:您真的很想虚拟地传送到另一个城市、国家或大陆? 我经常有这样的需求,所以有机会拥有自己的VPN服务器,可以在任何地方,几秒钟内启动,是相当紧迫的。在这篇文章中,我想谈谈我的项目,这是我在寻找现成的解决方案,在本例中是 Docker 镜像,它允许您快速设置 OpenVPN 服务器,并具有最少的设置和可接受的安全级别。

2 秒内在 Docker 中启动 OpenVPN

史前

在任何机器上运行服务的能力 - 无论是物理服务器,还是虚拟专用服务器,甚至另一个容器管理系统内的容器空间 - 都是至关重要的。 我的目光立刻落在了Docker身上。 首先,这项服务越来越受欢迎,因此越来越多的提供商提供预安装的现成解决方案; 其次,有一个集中的图像存储,您可以在其中使用终端中的一个命令下载并运行该服务。 我想到这样一个项目应该已经存在,并且我努力寻找。 但我发现的大多数项目要么太麻烦(您必须创建一个用于永久数据存储的容器,并使用不同的参数多次启动带有应用程序的容器),要么没有合理的文档,要么完全放弃。没有找到任何可接受的东西,我开始从事你的项目。 在研究文档、编写代码和调试之前,我度过了不眠之夜,但最终我的服务看到了曙光,并开始在路由器单色 LED 面板的所有颜色中闪闪发光。 所以,我请求你们去爱和青睐—— Docker-OpenVPN。 我什至想出了一个标志(上图,在剪切之前),但不要严格判断它,因为我(不再是设计师)。当我实现这个项目时,我优先考虑部署速度,至少设置和可接受的安全级别。 通过反复试验,我找到了这些标准的最佳平衡点,但是,在某些地方我不得不为了安全性而牺牲部署速度,并且我必须为最少的设置的可移植性付出代价:在当前配置中,容器一旦在一台服务器上创建,就无法在另一台服务器上转移和启动。 例如,所有客户端和服务器证书都是在服务启动时生成的,这大约需要 2 秒。 然而,Hellman Defi 文件的生成必须考虑到构建时间:它是在 docker 镜像构建期间创建的,最多可持续 10 分钟。 我真的很希望收到受人尊敬的社区对此类解决方案的安全审核。

发射

要启动该服务,我们需要做几件事:

  1. 服务器:物理或虚拟。 理论上可以以 docker-within-docker 模式运行,但我没有广泛测试这个选项;
  2. 其实是Docker。 许多托管提供商提供带有 Docker 的现成解决方案;
  3. 公共 IP 地址。

如果所有详细信息都已到位,那么我们所要做的就是在服务器的控制台中运行以下命令:

docker run --cap-add=NET_ADMIN 
-it -p 1194:1194/udp -p 80:8080/tcp 
-e HOST_ADDR=$(curl -s https://api.ipify.org) 
alekslitvinenk/openvpn

细心的读者可能已经注意到,服务器 IP 地址是使用自动确定的 ipify.org。 如果由于某种原因这不起作用,那么您可以手动指定地址。如果前面的所有步骤都正确完成,那么我们应该在控制台中看到类似的内容:

Sun Jun  9 08:56:11 2019 Initialization Sequence Completed
Sun Jun  9 08:56:12 2019 Client.ovpn file has been generated
Sun Jun  9 08:56:12 2019 Config server started, download your client.ovpn config at http://example.com/
Sun Jun  9 08:56:12 2019 NOTE: After you download you client config, http server will be shut down!

我们已经接近目标了:现在我们需要复制 example.com (在您的情况下,它将是您服务器的地址)并将其粘贴到浏览器的地址栏中。 按 Enter 键后,将下载 client.ovpn 文件,并且 http 服务器本身将消失。 如果对这个解决方案有疑问,您可以使用以下技巧:运行前面的命令并添加标志 zp 和密码。 现在,如果将生成的链接粘贴到浏览器窗口中,您将收到带有密码的 zip 存档。一旦有了客户端配置文件,您就可以使用任何合适的客户端。 我在 Mac 上使用 Tunnelblick。

视频教程

该视频教程包含在 DigitalOcean 上部署该服务的详细说明。

PS 如果您觉得这个项目有用,请在 GitHub 上给它一个 star,fork 它并告诉您的朋友。 贡献者和安全审计也受到广泛欢迎。聚苯硫醚 如果这篇文章最终出现在 Habr 上,那么我计划写下一篇关于我如何启动 docker-in-docker 和 docker-in-docker-in-docker、为什么这样做以及结果是什么。
EDIT1:

  1. 更正了出版物中的错误,
  2. 为了回应评论,我决定将这些信息放在这里:使用 iptables 需要使用 —privileged 标志

EDIT2:

  1. 改进了图像启动命令:现在它不需要 –privileged 标志
  2. 添加了俄语视频指南的链接: youtu.be/A8zvrHsT9A0

来源: habr.com

添加评论