如何在一个Docker容器在Ubuntu 14.04运行的OpenVPN

介绍

本教程将介绍如何设置和运行 的OpenVPN的帮助下容器 Docker 。 OpenVPN提供了一种使用TLS(SSL演进)加密来创建虚拟专用网(VPN)的方法。 OpenVPN保护网络流量免受窃听和中间人(MITM)攻击。专用网络可以用于将诸如在不安全的WiFi网络上运行的膝上型计算机或移动电话的设备安全地连接到远程服务器,该远程服务器然后将流量中继到因特网。专用网络还可以用于通过因特网将设备彼此安全地连接。 Docker提供了一种封装OpenVPN服务器进程和配置数据的方式,使得它更容易管理。DockerOpenVPN的 形象是预建的,包括所有必要的依赖在一个健全的和稳定的环境中运行服务器。 包括脚本以显着自动化标准用例,但仍然允许完全手动配置(如果需要)。 Docker 体积的容器是用来装配置和EasyRSA PKI证书数据,以及。 Docker的注册表是官方和用户开发的Docker图像的中央存储库。 在本教程中使用的图像可在用户贡献的图像 kylemanna / OpenVPN的 。 该图像是使用从源头上组装Docker注册的云构建服务器 GitHub的项目库。 联系到Github上的云服务器构建增加审核Docker图像,使用户能够查看源Dockerfile和相关的代码,称为能力 信任的构建 。当代码在GitHub存储库中更新时,将创建一个新的Docker镜像并在Docker注册表上发布。

示例用例

  • 在不受信任的公共(WiFi)网络上安全地路由到Internet
  • 专用网络连接移动笔记本电脑,办公计算机,家用PC或移动电话
  • 专用网络,用于在没有NAT穿越能力的NAT路由器之后的安全服务

目标

  • 在Ubuntu 14.04 LTS上设置Docker守护进程
  • 设置一个Docker体积的容器来保存配置数据
  • 生成EasyRSA PKI认证中心(CA)
  • 提取自动生成的客户端配置文件
  • 配置选择数量的OpenVPN客户端
  • 在启动时处理启动Docker容器
  • 介绍高级主题

先决条件

  • Linux shell知识。本指南主要假设用户能够设置和运行传统意义上的Linux守护进程
  • 远程服务器上的根访问
  • 本地客户端设备,如Android手机,笔记本电脑或PC。几乎所有的操作系统都支持通过各种OpenVPN客户端

第1步 - 设置和测试Docker

Docker快速移动,Ubuntu的长期支持(LTS)策略跟不上。要解决这个问题,我们将安装一个PPA,它将为我们提供最新版本的Docker。 添加上游Docker存储库包签名密钥。 在 apt-key命令通过使用提升的权限 sudo ,所以可能会出现用户的密码输入密码的提示:
curl -L https://get.docker.com/gpg | sudo apt-key add -
注:如有必要,在闪烁的光标输入sudo的密码。 将上游Docker存储库添加到系统列表:
echo deb http://get.docker.io/ubuntu docker main | sudo tee /etc/apt/sources.list.d/docker.list
更新软件包列表并安装Docker软件包:
sudo apt-get update && sudo apt-get install -y lxc-docker
你的用户添加到 docker群,使通信与Docker守护进程作为普通用户,其中 sammy是你的用户名 退出并为新组生效再次登录
sudo usermod -aG docker sammy
在重新登录使用验证组成员 id命令。 预期反应应该包括 docker像下面的例子:
uid=1001(test0) gid=1001(test0) groups=1001(test0),27(sudo),999(docker)
可选:运行 bash一个简单的DebianDocker图像( --rm清理容器退出后 -it进行互动)来验证主机Docker操作:
docker run --rm -it debian:jessie bash -l
来自docker的预期响应,它拉入图像并设置容器:
Unable to find image 'debian:jessie' locally
debian:jessie: The image you are pulling has been verified
511136ea3c5a: Pull complete
36fd425d7d8a: Pull complete
aaabd2b41e22: Pull complete
Status: Downloaded newer image for debian:jessie
root@de8ffd8f82f6:/#
一旦在容器内,你会看到 root@ <container id> :/#提示符这标志着当前shell是一个Docker容器。要确认它与主机不同,请检查容器中运行的Debian版本:
cat /etc/issue.net
编写时对OpenVPN容器的预期响应:
Debian GNU/Linux jessie/sid
如果你看到不同版本的Debian,这很好。 通过键入退出容器 logout ,和主机的提示应该再次出现。

第2步 - 设置EasyRSA PKI证书存储

这个步骤对于熟悉OpenVPN或任何使用PKI的服务的人来说通常是头痛。幸运的是,Docker和Docker镜像中的脚本通过为我们生成配置文件和所有必要的证书文件来简化此步骤。 创建卷容器。本教程将使用 $OVPN_DATA环境变量,使其便于复制和粘贴。 设置为任何你喜欢的。 默认 ovpn-data值推荐单OpenVPN的Docker容器服务器。在shell中设置变量会利用字符串替换来保存用户,避免在教程中的每个步骤中手动替换它:
OVPN_DATA="ovpn-data"
创建使用空Docker体积容器 busybox作为最小的Docker形象:
docker run --name $OVPN_DATA -v /etc/openvpn busybox
初始化 $OVPN_DATA容器,将持有的配置文件和证书,并更换 vpn.example.com你的FQDN。 该 vpn.example.com值应使用与服务器通信的完全合格的域名。 这是假设的 DNS设置已配置。或者,可以只使用服务器的IP地址,但不建议这样做。
docker run --volumes-from $OVPN_DATA --rm kylemanna/openvpn ovpn_genconfig -u udp://vpn.example.com:1194
生成EasyRSA PKI证书颁发机构。系统将提示您输入CA私钥的密码。选择一个好的,记住它;没有密码,将不可能签发和签署客户端证书:
docker run --volumes-from $OVPN_DATA --rm -it kylemanna/openvpn ovpn_initpki
请注意,在安全$OVPN_DATA容器是非常重要的,它包含了所有的私钥来模拟服务器和所有客户端证书。请记住这一点,并酌情控制访问。默认OpenVPN脚本使用CA密钥的密码,以提高安全性并防止发出伪造证书。 见下面关于如何备份的证书存储更多细节 结论

第3步 - 启动OpenVPN服务器

自动启动运行OpenVPN服务器进程Docker容器创建一个 Upstart使用init文件 nanovim
sudo vim /etc/init/docker-openvpn.conf
内容到位 /etc/init/docker-openvpn.conf
description "Docker container for OpenVPN server"
start on filesystem and started docker
stop on runlevel [!2345]
respawn
script
  exec docker run --volumes-from ovpn-data --rm -p 1194:1194/udp --cap-add=NET_ADMIN kylemanna/openvpn
end script
使用Upstart init机制启动进程:
sudo start docker-openvpn
验证容器开始并没有马上通过查看崩溃 STATUS栏:
test0@tutorial0:~$ docker ps
CONTAINER ID        IMAGE                      COMMAND             CREATED             STATUS              PORTS                    NAMES
c3ca41324e1d        kylemanna/openvpn:latest   "ovpn_run"          2 seconds ago       Up 2 seconds        0.0.0.0:1194->1194/udp   focused_mestorf

第4步 - 生成客户端证书和配置文件

在本节中,我们将使用我们在上一步中创建的PKI CA创建客户端证书。 务必更换 CLIENTNAME合适(这并不一定是一个FQDN)。客户端名称用于标识OpenVPN客户端正在运行的机器(例如,“家庭膝上型计算机”,“工作膝上型计算机”,“nexus5”等)。 该 easyrsa工具将提示CA密码。 这是我们在上面设置的密码 ovpn_initpki命令。创建客户端证书:
docker run --volumes-from $OVPN_DATA --rm -it kylemanna/openvpn easyrsa build-client-full CLIENTNAME nopass
创建每个客户端后,服务器准备好接受连接。 客户端需要证书和一个配置文件来连接。嵌入式脚本自动执行此任务,并使用户能够将配置写入单个文件,然后可以将其传输到客户端。此外,更换 CLIENTNAME酌情:
docker run --volumes-from $OVPN_DATA --rm kylemanna/openvpn ovpn_getclient CLIENTNAME > CLIENTNAME.ovpn
由此产生的 CLIENTNAME .ovpn文件包含需要连接到VPN私钥和证书。 保留这些文件的安全,而不是躺在身边,你会需要安全地传输 *.ovpn文件,将使用它们的客户端。由于安全问题,在传输文件时尽可能避免使用电子邮件或云存储等公共服务。 推荐的传输方法是ssh / scp,HTTPS,USB和microSD卡(如果可用)。

第5步 - 设置OpenVPN客户端

以下是在将连接到上面配置的OpenVPN服务器的客户端上运行的命令或操作。

Ubuntu和Debian通过Native OpenVPN分发

在Ubuntu 12.04 / 14.04和Debian wheezy / jessie客户端(和类似): 安装OpenVPN:
sudo apt-get install openvpn
从服务器复制客户端配置文件并设置安全权限:
sudo install -o root -m 400 CLIENTNAME.ovpn /etc/openvpn/CLIENTNAME.conf
配置初始化脚本自动启动匹配所有配置 /etc/openvpn/*.conf
echo AUTOSTART=all | sudo tee -a /etc/default/openvpn
重新启动OpenVPN客户端的服务器进程:
sudo /etc/init.d/openvpn restart

Arch Linux通过Native OpenVPN

安装OpenVPN:
pacman -Sy openvpn
从服务器复制客户端配置文件并设置安全权限:
sudo install -o root -m 400 CLIENTNAME.ovpn /etc/openvpn/CLIENTNAME.conf
启动OpenVPN客户端的服务器进程:
systemctl start openvpn@CLIENTNAME
可选:配置systemd启动 /etc/openvpn/ CLIENTNAME .conf在引导:
systemctl enable openvpn@CLIENTNAME

MacOS X通过TunnelBlick

下载并安装 的Tunnelblick 。 拷贝 CLIENTNAME .ovpn从服务器到Mac。 通过双击导入配置 *.ovpn之前复制文件。 TunnelBlick将被调用并导入配置。 打开的Tunnelblick,选择配置,然后选择 连接

Android通过OpenVPN Connect

安装 OpenVPN的连接应用程序从谷歌Play商店。 复制 CLIENTNAME .ovpn从服务器到Android设备以安全的方式。 USB或microSD卡更安全。将文件放在SD卡上,以帮助打开它。 导入配置: 菜单 - > 导入 - 从SD卡 > 导入配置文件 选择 连接

第6步 - 验证操作

有几种方法可以验证流量是否通过VPN路由。

网页浏览器

访问网站以确定外部IP地址。外部IP地址应该是OpenVPN服务器的IP地址。 尝试 谷歌“我的IP”icanhazip.com

命令行

在命令行中, wget ,或 curl派上用场。 例如用 curl
curl icanhazip.com
例如使用 wget
wget -qO - icanhazip.com
预期的响应应该是OpenVPN服务器的IP地址。 另一种选择是只使用为此目的做了特别的DNS查找来专门配置的DNS服务器 hostdig 。 例如,使用 host
host -t A myip.opendns.com resolver1.opendns.com
例如用 dig
dig +short myip.opendns.com @resolver1.opendns.com
预期的响应应该是OpenVPN服务器的IP地址。

额外的事情要检查

查看网络接口配置。在基于Unix的操作系统,这是因为运行简单 ifconfig在终端,并寻找OpenVPN的 tunX接口时,它的连接。 查看日志。在Unix系统中检查 /var/log旧的分布或 journalctl上systemd分布。

结论

构建来运行这个的Docker镜像是开源的,并且能够比这里描述的更多。 该 Docker,OpenVPN的源代码库可用于代码审查以及分叉进行修改。欢迎提出对一般功能或错误修正的请求。 高级主题,如 备份静态IP地址的客户端将被下讨论 Docker-的OpenVPN /文档文件夹中。 报告错误到 Docker,OpenVPN的问题跟踪
赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏