介绍
想要在连接到不受信任的网络(例如酒店或咖啡店的 WiFi)时从您的智能手机或笔记本电脑安全地访问 Internet? Virtual Private Network (VPN) 让您可以像在安全的专用网络上一样,私密且安全地穿越不受信任的网络到您的 DigitalOcean Droplet。 流量从 Droplet 中流出并继续前往目的地。
当与 HTTPS 连接 结合使用时,此设置可让您保护您的无线登录和交易。 您可以规避地理限制和审查,并从不受信任的网络中屏蔽您的位置和未加密的 HTTP 流量。
OpenVPN 是一个功能齐全的开源安全套接层 (SSL) VPN 解决方案,可适应各种配置。 在本教程中,我们将在 Droplet 上设置 OpenVPN 服务器,然后配置从 Windows、OS X、iOS 和 Android 对其的访问。 本教程将使这些设置的安装和配置步骤尽可能简单。
先决条件
唯一的先决条件是建立并运行 Ubuntu 14.04 Droplet。 您需要 root 访问权限才能完成本指南。
- 可选:完成本教程后,最好创建一个具有 sudo 权限的标准用户帐户,以便在您的服务器上执行一般维护。
第 1 步 — 安装和配置 OpenVPN 的服务器环境
为您的服务器端设置完成这些步骤。
- OpenVPN 配置
在我们安装任何软件包之前,首先我们将更新 Ubuntu 的存储库列表。
apt-get update
然后我们可以安装 OpenVPN 和 Easy-RSA。
apt-get install openvpn easy-rsa
需要将示例 VPN 服务器配置文件解压缩到 /etc/openvpn
,以便我们可以将其合并到我们的设置中。 这可以通过一个命令来完成:
gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz > /etc/openvpn/server.conf
解压后,在文本编辑器中打开 server.conf
。 本教程将使用 Vim,但您可以使用您喜欢的任何编辑器。
vim /etc/openvpn/server.conf
在此文件中有几处更改。 您将看到如下所示的部分:
# Diffie hellman parameters. # Generate your own with: # openssl dhparam -out dh1024.pem 1024 # Substitute 2048 for 1024 if you are using # 2048 bit keys. dh dh1024.pem
编辑 dh1024.pem
说:
dh2048.pem
这将使生成服务器和客户端密钥时使用的 RSA 密钥长度加倍。
还在 server.conf
中,现在寻找这个部分:
# If enabled, this directive will configure # all clients to redirect their default # network gateway through the VPN, causing # all IP traffic such as web browsing and # and DNS lookups to go through the VPN # (The OpenVPN server machine may need to NAT # or bridge the TUN/TAP interface to the internet # in order for this to work properly). ;push "redirect-gateway def1 bypass-dhcp"
取消注释 push "redirect-gateway def1 bypass-dhcp"
以便 VPN 服务器将客户端的网络流量传递到其目的地。 完成后应该是这样的:
push "redirect-gateway def1 bypass-dhcp"
下一个编辑是在这个区域:
# Certain Windows-specific network settings # can be pushed to clients, such as DNS # or WINS server addresses. CAVEAT: # http://openvpn.net/faq.html#dhcpcaveats # The addresses below refer to the public # DNS servers provided by opendns.com. ;push "dhcp-option DNS 208.67.222.222" ;push "dhcp-option DNS 208.67.220.220"
取消注释 push "dhcp-option DNS 208.67.222.222"
和 push "dhcp-option DNS 208.67.220.220"
。 完成后应该是这样的:
push "dhcp-option DNS 208.67.222.222" push "dhcp-option DNS 208.67.220.220"
这告诉服务器在可能的情况下将 OpenDNS 推送到连接的客户端以进行 DNS 解析。 这有助于防止 DNS 请求泄漏到 VPN 连接之外。 但是,在客户端设备中指定所需的 DNS 解析器也很重要。 尽管 OpenDNS 是 OpenVPN 使用的默认设置,但您可以使用您喜欢的任何 DNS 服务。
server.conf
中最后一个要更改的区域在这里:
# You can uncomment this out on # non-Windows systems. ;user nobody ;group nogroup
取消注释 user nobody
和 group nogroup
。 完成后应该是这样的:
user nobody group nogroup
默认情况下,OpenVPN 以 root 用户身份运行,因此具有系统的完全 root 访问权限。 我们将改为将 OpenVPN 限制为用户 nobody 和组 nogroup。 这是一个没有默认登录功能的非特权用户,通常保留用于运行不受信任的应用程序,例如面向 Web 的服务器。
现在保存您的更改并退出 Vim。
- 数据包转发
这是一个 sysctl 设置,它告诉服务器内核将流量从客户端设备转发到 Internet。 否则,流量将在服务器处停止。 通过输入以下命令在运行时启用数据包转发:
echo 1 > /proc/sys/net/ipv4/ip_forward
我们需要使其永久化,以便服务器在重新启动后仍转发流量。
vim /etc/sysctl.conf
在 sysctl 文件的顶部附近,您将看到:
# Uncomment the next line to enable packet forwarding for IPv4 #net.ipv4.ip_forward=1
取消注释 net.ipv4.ip_forward
。 完成后应该是这样的:
# Uncomment the next line to enable packet forwarding for IPv4 net.ipv4.ip_forward=1
保存更改并退出。
简单防火墙 (ufw)
ufw 是 iptables 的前端,设置 ufw 并不难。 它默认包含在 Ubuntu 14.04 中,因此我们只需要进行一些规则和配置编辑,然后打开防火墙。 作为 ufw 更多用途的参考,请参阅 如何在 Ubuntu 和 Debian 云服务器上使用 UFW 设置防火墙 。
首先将 ufw 设置为允许 SSH。 在命令提示符下,ENTER
:
ufw allow ssh
本教程将使用基于 UDP 的 OpenVPN,因此 ufw 还必须允许端口 1194
上的 UDP 流量。
ufw allow 1194/udp
ufw 转发策略也需要设置。 我们将在 ufw 的主配置文件中执行此操作。
vim /etc/default/ufw
寻找 DEFAULT_FORWARD_POLICY="DROP"
。 这必须从 DROP 更改为 ACCEPT。 完成后应该是这样的:
DEFAULT_FORWARD_POLICY="ACCEPT"
接下来,我们将为连接的客户端的网络地址转换和 IP 伪装添加额外的 ufw 规则。
vim /etc/ufw/before.rules
使 before.rules
文件的顶部如下所示。 OPENVPN RULES的red区域必须加上:
# # rules.before # # Rules that should be run before the ufw command line added rules. Custom # rules should be added to one of these chains: # ufw-before-input # ufw-before-output # ufw-before-forward # # START OPENVPN RULES # NAT table rules *nat :POSTROUTING ACCEPT [0:0] # Allow traffic from OpenVPN client to eth0 -A POSTROUTING -s 10.8.0.0/8 -o eth0 -j MASQUERADE COMMIT # END OPENVPN RULES # Don't delete these required lines, otherwise there will be errors *filter
通过对 ufw 所做的更改,我们现在可以启用它。 进入命令提示符:
ufw enable
启用 ufw 将返回以下提示:
Command may disrupt existing ssh connections. Proceed with operation (y|n)?
回答 y
。 结果将是这个输出:
Firewall is active and enabled on system startup
检查 ufw 的主要防火墙规则:
ufw status
status 命令应返回以下条目:
Status: active To Action From -- ------ ---- 22 ALLOW Anywhere 1194/udp ALLOW Anywhere 22 (v6) ALLOW Anywhere (v6) 1194/udp (v6) ALLOW Anywhere (v6)
第 2 步 — 创建证书颁发机构和服务器端证书和密钥
OpenVPN 使用证书来加密流量。
- 配置和构建证书颁发机构
现在是时候建立我们自己的证书颁发机构 (CA) 并为 OpenVPN 服务器生成证书和密钥了。 OpenVPN 支持基于证书的双向认证,这意味着客户端必须对服务器证书进行认证,而服务器必须在建立相互信任之前对客户端证书进行认证。 我们将使用我们之前复制的 Easy RSA 脚本来执行此操作。
首先复制 Easy-RSA 生成脚本。
cp -r /usr/share/easy-rsa/ /etc/openvpn
然后制作密钥存储目录。
mkdir /etc/openvpn/easy-rsa/keys
Easy-RSA 有一个变量文件,我们可以编辑它来创建我们的个人、企业或我们选择的任何实体专有的证书。 此信息将复制到证书和密钥中,并有助于以后识别密钥。
vim /etc/openvpn/easy-rsa/vars
下面用red标记的变量应根据您的喜好进行更改。
export KEY_COUNTRY="US" export KEY_PROVINCE="TX" export KEY_CITY="Dallas" export KEY_ORG="My Company Name" export KEY_EMAIL="sammy@example.com" export KEY_OU="MYOrganizationalUnit"
在同一个 vars
文件中,也编辑如下所示的这一行。 为简单起见,我们将使用 server
作为键名。 如果您想使用不同的名称,您还需要更新引用 server.key
和 server.crt
的 OpenVPN 配置文件。
export KEY_NAME="server"
我们需要生成 Diffie-Hellman 参数; 这可能需要几分钟。
openssl dhparam -out /etc/openvpn/dh2048.pem 2048
现在让我们更改目录,以便直接从步骤 2 中将 Easy-RSA 的脚本移到的位置直接工作。
cd /etc/openvpn/easy-rsa
初始化 PKI(公钥基础设施)。 注意 ./vars
命令前面的 dot (.) 和 space。 这表示当前的工作目录(源)。
. ./vars
上述命令的输出如下所示。 由于我们尚未在 keys
目录中生成任何内容,因此无需担心警告。
NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys
现在我们将清除所有可能的旧密钥或示例密钥的工作目录,以便为我们的新密钥让路。
./clean-all
这个最终命令通过调用交互式 OpenSSL 命令来构建证书颁发机构 (CA)。 输出将提示您确认之前输入到 Easy-RSA 变量文件中的专有名称变量(国家名称、组织等)。
./build-ca
只需按 ENTER
即可通过每个提示。 如果必须更改某些内容,您可以在提示中进行更改。
- 为服务器生成证书和密钥
仍然从 /etc/openvpn/easy-rsa
工作,现在输入命令来构建服务器的密钥。 您看到 server
标记为红色的地方是我们在前面的步骤 2 中在 Easy-RSA 的 vars
文件中设置的 export KEY_NAME
变量。
./build-key-server server
当我们运行 ./build-ca
时会生成类似的输出,您可以再次按 ENTER
来确认专有名称的每一行。 但是,这次有两个额外的提示:
Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
两者都应留空,因此只需按 ENTER
即可通过每一个。
最后的两个额外查询需要一个肯定的 (y
) 响应:
Sign the certificate? [y/n] 1 out of 1 certificate requests certified, commit? [y/n]
上面的最后一个提示应该完成:
Write out database with 1 new entries Data Base Updated
- 移动服务器证书和密钥
OpenVPN 期望在 /etc/openvpn
中看到服务器的 CA、证书和密钥。 让我们将它们复制到适当的位置。
cp /etc/openvpn/easy-rsa/keys/{server.crt,server.key,ca.crt} /etc/openvpn
您可以通过以下方式验证复制是否成功:
ls /etc/openvpn
您应该会看到服务器的证书和密钥文件。
此时,OpenVPN 服务器已准备就绪。 启动它并检查状态。
service openvpn start service openvpn status
status 命令应该返回:
VPN 'server' is running
恭喜! 您的 OpenVPN 服务器正在运行。 如果状态消息显示 VPN 未运行,请查看 /var/log/syslog
文件中的错误,例如:
Options error: --key fails with 'server.key': No such file or directory
该错误表明 server.key
未正确复制到 /etc/openvpn
。 重新复制文件并重试。
第 3 步 — 为客户生成证书和密钥
到目前为止,我们已经安装和配置了 OpenVPN 服务器,创建了证书颁发机构,并创建了服务器自己的证书和密钥。 在这一步中,我们使用服务器的 CA 为将连接到 VPN 的每个客户端设备生成证书和密钥。 这些文件稍后将安装到客户端设备上,例如笔记本电脑或智能手机。
- 密钥和证书建设
对于连接到 VPN 的每个客户端来说,拥有自己唯一的证书和密钥是理想的选择。 这优于生成一个通用证书和密钥以在所有客户端设备中使用。
注意: 默认情况下,OpenVPN 不允许使用相同证书和密钥的客户端同时连接到服务器。 (参见
/etc/openvpn/server.conf
中的duplicate-cn
。)
要为您打算连接到 VPN 的每台设备创建单独的身份验证凭据,您应该为每台设备完成此步骤,但将下面的名称 client1 更改为不同的名称,例如 client2 或iphone2。 每个设备都有单独的凭据,如果需要,以后可以在服务器上单独停用它们。 本教程中的其余示例将使用 client1 作为示例客户端设备的名称。
正如我们对服务器密钥所做的那样,现在我们为我们的 client1 示例构建一个。 您应该仍在使用 /etc/openvpn/easy-rsa
。
./build-key client1
再一次,您将被要求更改或确认专有名称变量以及这两个应留空的提示。 按 ENTER
接受默认值。
Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
和以前一样,构建过程结束时的这两个确认需要 (y
) 响应:
Sign the certificate? [y/n] 1 out of 1 certificate requests certified, commit? [y/n]
如果密钥构建成功,输出将再次为:
Write out database with 1 new entries Data Base Updated
示例客户端配置文件也应复制到 Easy-RSA 密钥目录。 我们将使用它作为模板下载到客户端设备进行编辑。 在复制过程中,我们将示例文件的名称从 client.conf
更改为 client.ovpn
,因为 .ovpn
文件扩展名是客户期望使用的。
cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/easy-rsa/keys/client.ovpn
您可以为每个客户端再次重复此部分,将 client1 替换为适当的客户端名称。
将证书和密钥传输到客户端设备
回想上面的步骤,我们创建了客户端证书和密钥,它们存储在 OpenVPN 服务器上的 /etc/openvpn/easy-rsa/keys
目录中。
对于每个客户端,我们需要将客户端证书、密钥和配置文件模板文件传输到本地计算机或其他客户端设备上的文件夹中。
在此示例中,我们的 client1 设备需要其证书和密钥,位于服务器上:
/etc/openvpn/easy-rsa/keys/client1.crt
/etc/openvpn/easy-rsa/keys/client1.key
ca.crt
和 client.ovpn
文件对于所有客户端都是相同的。 同时下载这两个文件; 请注意,ca.crt
文件与其他文件位于不同的目录中。
/etc/openvpn/easy-rsa/keys/client.ovpn
/etc/openvpn/ca.crt
虽然用于完成此传输的确切应用程序将取决于您的选择和设备的操作系统,但您希望应用程序在后端使用 SFTP(SSH 文件传输协议)或 SCP(安全复制)。 这将通过加密连接传输您客户端的 VPN 身份验证文件。
这是使用我们的 client1 示例的示例 SCP 命令。 它将文件 client1.key
放入本地计算机上的 Downloads 目录中。
scp root@your-server-ip:/etc/openvpn/easy-rsa/keys/client1.key Downloads/
以下是一些用于将文件从服务器安全传输到本地计算机的工具和教程:
在本节结束时,确保您的 客户端 设备上有这四个文件:
client1.crt
client1.key
client.ovpn
ca.crt
第 4 步 - 为客户端设备创建统一 OpenVPN 配置文件
管理客户端文件有多种方法,但最简单的方法是使用 unified 配置文件。 这是通过修改 client.ovpn
模板文件以包含服务器的证书颁发机构、客户端的证书及其密钥来创建的。 合并后,只需将单个 client.ovpn
配置文件导入客户端的 OpenVPN 应用程序。
我们将在我们将所有客户端文件下载到的 本地计算机 上为我们的 client1 设备创建一个配置文件。 这台本地计算机本身可能是预期的客户端,也可能只是用于合并身份验证文件的临时工作区。 原来的 client.ovpn
模板文件应该被复制和重命名。 如何执行此操作取决于本地计算机的操作系统。
注意:你复制的client.ovpn
的名称不需要与客户端设备相关。 客户端 OpenVPN 应用程序将使用文件名作为 VPN 连接本身的标识符。 相反,您应该将 client.ovpn
复制到您希望 VPN 的名称标签出现在您的操作系统中的任何位置。 例如:work.ovpn会被识别为work,school.ovpn会被识别为school等。
在本教程中,我们将 VPN 连接命名为 DigitalOcean,因此 DigitalOcean.ovpn
将是从此时开始引用的文件名。 命名后,我们必须在文本编辑器中打开 DigitalOcean.ovpn
; 您可以使用您喜欢的任何编辑器。
第一个关注领域是您的 Droplet 的 IP 地址。 在文件顶部附近,更改 my-server-1 以反映您的 VPN 的 IP。
# The hostname/IP and port of the server. # You can have multiple remote entries # to load balance between the servers. remote my-server-1 1194
接下来,找到下图所示的区域并取消注释 user nobody
和 group nogroup
,就像我们在步骤 1 中的 server.conf
中所做的那样。 注意:这不适用于Windows,因此您可以跳过它。 完成后应该是这样的:
# Downgrade privileges after initialization (non-Windows only) user nobody group nogroup
下面给出的区域需要注释掉显示的三行,因此我们可以直接在 DigitalOcean.ovpn
文件中包含证书和密钥。 完成后应该是这样的:
# SSL/TLS parms. # . . . #ca ca.crt #cert client.crt #key client.key
要将各个文件合并到一个统一的配置文件中,将 ca.crt、client1.crt、 和 client1.key 文件的内容直接粘贴到.ovpn
配置文件使用基本的类似 XML 的语法。 文件末尾的 XML 应采用以下形式:
<ca> (insert ca.crt here) </ca> <cert> (insert client1.crt here) </cert> <key> (insert client1.key here) </key>
完成后,文件的结尾应类似于以下缩写示例:
<ca> -----BEGIN CERTIFICATE----- . . . -----END CERTIFICATE----- </ca> <cert> Certificate: . . . -----END CERTIFICATE----- . . . -----END CERTIFICATE----- </cert> <key> -----BEGIN PRIVATE KEY----- . . . -----END PRIVATE KEY----- </key>
client1.crt
文件中有一些额外的信息; 只需包含整个文件就可以了。
保存更改并退出。 我们现在有一个统一的 OpenVPN 客户端配置文件来配置我们的 client1。
第 5 步 - 安装客户端配置文件
现在我们将讨论在 Windows、OS X、iOS 和 Android 上安装客户端 VPN 配置文件。 这些客户说明均不相互依赖,因此您可以跳至适用于您的任何说明。
请记住,无论您如何命名 .ovpn
文件,都会调用连接。 在我们的示例中,由于文件名为 DigitalOcean.ovpn
,因此连接将命名为 DigitalOcean。
视窗
安装
适用于 Windows 的 OpenVPN 客户端应用程序可以在 OpenVPN 的下载页面 上找到。 为您的 Windows 版本选择适当的安装程序版本。
注意: OpenVPN 需要管理员权限才能安装。
安装OpenVPN后,将统一的DigitalOcean.ovpn
配置文件复制到:
C:\Program Files\OpenVPN\config
当您启动 OpenVPN 时,它会自动查看配置文件并使其可用。
每次使用 OpenVPN 时都必须以管理员身份运行,即使是管理帐户也是如此。 要做到这一点而不必在每次使用 VPN 时右键单击并选择 以管理员身份运行 ,您可以预设此设置,但必须从管理帐户完成。 这也意味着标准用户需要输入管理员密码才能使用 OpenVPN。 另一方面,标准用户无法正确连接到服务器,除非客户端上的 OpenVPN 具有管理员权限,因此需要提升权限。
要将 OpenVPN 应用程序设置为始终以管理员身份运行,请右键单击其快捷方式图标并转到 属性 。 在兼容性选项卡底部,单击按钮以更改所有用户的设置。 在新窗口中,勾选以管理员身份运行此程序。
连接
每次启动 OpenVPN GUI 时,Windows 都会询问您是否要允许该程序对您的计算机进行更改。 单击是。 启动 OpenVPN 客户端应用程序只会将小程序放在系统托盘中,因此可以根据需要连接和断开 VPN; 它实际上并没有建立 VPN 连接。
一旦 OpenVPN 启动,通过进入系统托盘小程序并右键单击 OpenVPN 小程序图标来启动连接。 这将打开上下文菜单。 选择菜单顶部的 DigitalOcean(这是我们的 DigitalOcean.ovpn
配置文件),然后选择 Connect。
建立连接时将打开一个状态窗口,显示日志输出,并在客户端连接后显示一条消息。
以同样的方式断开 VPN:进入系统托盘小程序,右键单击 OpenVPN 小程序图标,选择客户端配置文件,然后单击 Disconnect。
操作系统
安装
Tunnelblick 是适用于 Mac OS X 的免费开源 OpenVPN 客户端。 您可以从 Tunnelblick 下载页面 下载最新的磁盘映像。 双击下载的【X28X】【X32X】文件,按照提示进行安装。
在安装过程即将结束时,Tunnelblick 会询问您是否有任何配置文件。 回答 No 并让 Tunnelblick 完成会更容易。 打开 Finder 窗口并双击 DigitalOcean.ovpn
。 Tunnelblick 将安装客户端配置文件。 需要管理权限。
连接
双击 Applications 文件夹中的 Tunnelblick 启动 Tunnelblick。 Tunnelblick 启动后,屏幕右上角的菜单栏中将出现一个 Tunnelblick 图标,用于控制连接。 单击图标,然后单击 Connect 菜单项以启动 VPN 连接。 选择 DigitalOcean 连接。
iOS
安装
在 iTunes App Store 中,搜索并安装 OpenVPN Connect,官方 iOS OpenVPN 客户端应用程序。 要将您的 iOS 客户端配置文件传输到设备上,请将其直接连接到计算机。
此处将概述使用 iTunes 完成传输。 在电脑上打开 iTunes 并点击 iPhone > apps。 向下滚动到底部的 文件共享 部分,然后单击 OpenVPN 应用程序。 右侧的空白窗口 OpenVPN Documents 用于共享文件。 将 .ovpn
文件拖到 OpenVPN 文档窗口。
现在在 iPhone 上启动 OpenVPN 应用程序。 将会有一个新的配置文件已准备好导入的通知。 点击绿色加号将其导入。
连接
OpenVPN 现在可以与新配置文件一起使用。 通过将 Connect 按钮滑动到 On 位置来开始连接。 通过将相同的按钮滑动到 Off 来断开连接。
注意: 设置下的VPN开关不能用于连接VPN。 如果您尝试,您将收到仅使用 OpenVPN 应用程序连接的通知。
安卓
安装
打开 Google Play 商店。 搜索并安装 Android OpenVPN Connect,官方的 Android OpenVPN 客户端应用程序。
.ovpn
配置文件可以通过 USB 将 Android 设备连接到您的计算机并复制文件来传输。 或者,如果您有 SD 卡读卡器,您可以移除设备的 SD 卡,将配置文件复制到其中,然后将卡重新插入 Android 设备。
启动 OpenVPN 应用程序并点击菜单以导入配置文件。
然后导航到保存配置文件的位置(屏幕截图使用 /sdcard/Download/
)并选择文件。 该应用程序将记录配置文件已导入。
连接
要连接,只需点击 Connect 按钮。 系统会询问您是否信任 OpenVPN 应用程序。 选择 OK 启动连接。 要断开与 VPN 的连接,请返回 OpenVPN 应用程序并选择 Disconnect。
第 6 步 - 测试您的 VPN 连接
安装完所有内容后,只需进行简单检查即可确认一切正常。 在未启用 VPN 连接的情况下,打开浏览器并转到 DNSLeakTest。
该站点将返回由您的互联网服务提供商分配的 IP 地址,并且与您在世界其他地方看到的一样。 要通过同一网站检查您的 DNS 设置,请单击 Extended Test,它会告诉您您正在使用哪些 DNS 服务器。
现在将 OpenVPN 客户端连接到 Droplet 的 VPN 并刷新浏览器。 现在应该会出现您的 VPN 服务器的完全不同的 IP 地址。 这就是你现在出现在世界上的样子。 同样,DNSLeakTest's Extended Test 将检查您的 DNS 设置并确认您现在正在使用您的 VPN 推送的 DNS 解析器。
恭喜! 您现在可以安全地穿越互联网,保护您的身份、位置和流量免受窥探者和审查者的侵害。