如何在 Ubuntu 14.04 上设置 OpenVPN 服务器

介绍

想要安全地从智能手机或笔记本电脑上连接到不受信任的网络,如酒店或咖啡店的WiFi? Virtual Private Network(VPN)允许您私下安全地穿过不受信任的网络进入您的DigitalOcean Droplet,就像您在安全和私密的网络上一样。

当与 HTTPS 连接相结合时,此设置允许您保护无线登录和交易,您可以绕过地理限制和审查,并保护您的位置和未加密的 HTTP 流量免受不受信任的网络的影响。

OpenVPN是一个全功能的开源 Secure Socket Layer (SSL) VPN 解决方案,可容纳各种配置。 在本教程中,我们将在Droplet上设置一个OpenVPN服务器,然后从Windows,OS X,iOS和Android配置访问它。本教程将使安装和配置步骤尽可能简单。

<$>[注] 注: OpenVPN 可以通过在启动时将 此脚本添加到其用户数据中自动安装到您的 Droplet。

前提条件

唯一的先决条件是建立并运行Ubuntu 14.04 Droplet,您将需要 root访问才能完成本指南。

  • 可选:本教程完成后,创建一个具有 sudo特权的标准用户帐户,以便在您的服务器上执行一般维护,是一个很好的想法。

步骤 1 — 安装和配置 OpenVPN 的服务器环境

完成这些步骤为您的服务器侧设置。

OpenVPN配置

在我们安装任何包之前,我们首先会更新Ubuntu的存储列表。

1apt-get update

然后我们可以安装OpenVPN和Easy-RSA。

1apt-get install openvpn easy-rsa

例如,VPN服务器配置文件需要提取到/etc/openvpn,以便我们可以将其纳入我们的设置。

1gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz > /etc/openvpn/server.conf

一旦提取,在文本编辑器中打开 `server.conf. 本教程将使用Vim,但您可以使用您喜欢的编辑器。

1vim /etc/openvpn/server.conf

这个文件有几个更改,你会看到一个类似于此的部分:

1# Diffie hellman parameters.
2# Generate your own with:
3#   openssl dhparam -out dh1024.pem 1024
4# Substitute 2048 for 1024 if you are using
5# 2048 bit keys.
6dh dh1024.pem

編輯「dh1024.pem」來說:

1dh2048.pem

这将使在生成服务器和客户端密钥时使用的 RSA 密钥长度增加一倍。

仍然在「server.conf」中,现在寻找此部分:

1# If enabled, this directive will configure
2# all clients to redirect their default
3# network gateway through the VPN, causing
4# all IP traffic such as web browsing and
5# and DNS lookups to go through the VPN
6# (The OpenVPN server machine may need to NAT
7# or bridge the TUN/TAP interface to the internet
8# in order for this to work properly).
9;push "redirect-gateway def1 bypass-dhcp"

Uncomment push "redirect-gateway def1 bypass-dhcp" 以便VPN服务器将客户端的网络流量传送到其目的地。

1push "redirect-gateway def1 bypass-dhcp"

下一个编辑是在这个领域:

1# Certain Windows-specific network settings
2# can be pushed to clients, such as DNS
3# or WINS server addresses. CAVEAT:
4# http://openvpn.net/faq.html#dhcpcaveats
5# The addresses below refer to the public
6# DNS servers provided by opendns.com.
7;push "dhcp-option DNS 208.67.222.222"
8;push "dhcp-option DNS 208.67.220.220"

按一下「dhcp-option DNS 208.67.222.222」和按一下「dhcp-option DNS 208.67.220.220」。

1push "dhcp-option DNS 208.67.222.222"
2push "dhcp-option DNS 208.67.220.220"

这告诉服务器在可能的情况下将 OpenDNS推到连接的客户端进行 DNS 解析。这可以帮助防止 DNS 请求泄露到 VPN 连接之外。但是,在客户端设备中指定所需的 DNS 解析器也很重要。尽管 OpenDNS 是 OpenVPN 的默认使用,但您可以使用您喜欢的任何 DNS 服务。

在「server.conf」中更改的最后一个区域是:

1# You can uncomment this out on
2# non-Windows systems.
3;user nobody
4;group nogroup

用户没有人群组没有人都没有评论,完成后应该是这样的:

1user nobody
2group nogroup

默认情况下,OpenVPN作为 root用户运行,因此可以完全访问系统. 相反,我们将OpenVPN局限于用户 nobody和组 nogroup. 这是一个没有默认登录功能的非特权用户,通常用于运行不受信任的应用程序,如面向网络的服务器。

现在保存您的更改并退出Vim。

包装发送

这是一个 sysctl 设置,该设置告诉服务器的内核将流量从客户端设备传输到互联网。否则,流量将在服务器上停止。

1echo 1 > /proc/sys/net/ipv4/ip_forward

我们需要使这成为永久性的,以便服务器在重新启动后仍然向前传输流量。

1vim /etc/sysctl.conf

在 sysctl 文件的顶部,你会看到:

1# Uncomment the next line to enable packet forwarding for IPv4
2#net.ipv4.ip_forward=1

无评论 net.ipv4.ip_forward. 完成后应该是这样的:

1# Uncomment the next line to enable packet forwarding for IPv4
2net.ipv4.ip_forward=1

保存您的更改和退出。

不复杂的防火墙(UFW)

ufw 是 iptables 的前端,安装 ufw 并不难. 它在 Ubuntu 14.04 中默认包含,所以我们只需要做一些规则和配置编辑,然后打开防火墙。

首先设置 ufw 以允许 SSH. 在命令提示中,‘ENTER’:

1ufw allow ssh

本教程将使用OpenVPN通过UDP,因此UFW必须允许UDP流量通过端口1194

1ufw allow 1194/udp

ufw 转发策略也需要设置,我们将在 ufw 的主要配置文件中执行此操作。

1vim /etc/default/ufw

搜索DEFAULT_FORWARD_POLICY="DROP". 这个必须从 DROP 更改到 ACCEPT. 完成后,它应该是这样的:

1DEFAULT_FORWARD_POLICY="ACCEPT"

接下来,我们将为网络地址翻译和连接客户端的 IP 隐藏添加额外的 ufw 规则。

1vim /etc/ufw/before.rules

让您的before.rules文件的顶部看起来像下面。必须添加红色区域为 OPENVPN RULES:

 1#
 2# rules.before
 3#
 4# Rules that should be run before the ufw command line added rules. Custom
 5# rules should be added to one of these chains:
 6#   ufw-before-input
 7#   ufw-before-output
 8#   ufw-before-forward
 9#
10
11# START OPENVPN RULES
12# NAT table rules
13*nat
14:POSTROUTING ACCEPT [0:0] 
15# Allow traffic from OpenVPN client to eth0
16-A POSTROUTING -s 10.8.0.0/8 -o eth0 -j MASQUERADE
17COMMIT
18# END OPENVPN RULES
19
20# Don't delete these required lines, otherwise there will be errors
21*filter

随着对 ufw 进行的更改,我们现在可以启用它。

1ufw enable

启用 ufw 将返回以下提示:

1Command may disrupt existing ssh connections. Proceed with operation (y|n)?

答案 y. 结果将是这个输出:

1Firewall is active and enabled on system startup

查看 ufw 的主要防火墙规则:

1ufw status

状态命令应该返回这些条目:

1Status: active
2
3To Action From
4--                         ------      ----
522 ALLOW Anywhere
61194/udp ALLOW Anywhere
722 (v6)                    ALLOW Anywhere (v6)
81194/udp (v6)              ALLOW Anywhere (v6)

步骤 2 — 创建证书权威和服务器侧证书和密钥

OpenVPN使用证书来加密流量。

配置和构建证书权限

现在是时候建立自己的证书管理局(CA)并为OpenVPN服务器生成证书和密钥了。OpenVPN支持基于证书的双向身份验证,这意味着客户端必须验证服务器证书,服务器必须验证客户端证书,然后建立相互信任。

第一份 Easy-RSA 世代脚本。

1cp -r /usr/share/easy-rsa/ /etc/openvpn

然后创建关键存储目录。

1mkdir /etc/openvpn/easy-rsa/keys

Easy-RSA有一个变量文件,我们可以编辑,以创建专为我们个人,业务或我们选择的实体的证书. 这些信息被复制到证书和密钥,并将有助于稍后识别密钥。

1vim /etc/openvpn/easy-rsa/vars

下面的红色变量应根据您的偏好进行更改。

1export KEY_COUNTRY="US"
2export KEY_PROVINCE="TX"
3export KEY_CITY="Dallas"
4export KEY_ORG="My Company Name"
5export KEY_EMAIL="[email protected]"
6export KEY_OU="MYOrganizationalUnit"

在相同的vars文件中,也编辑下面的一个行。为了简单,我们将使用server作为密钥名称. 如果您想使用不同的名称,您还需要更新引用server.keyserver.crt的OpenVPN配置文件。

1export KEY_NAME="server"

我们需要生成Diffie-Hellman参数,这可能需要几分钟。

1openssl dhparam -out /etc/openvpn/dh2048.pem 2048

现在让我们更改目录,以便我们直接从我们在步骤 2 中更早地移动 Easy-RSA 脚本的地方工作。

1cd /etc/openvpn/easy-rsa

初始化PKI(公共密钥基础设施)。 注意在./vars命令前面的 **dot(.)**和 space,这意味着当前的工作目录(源)。

1. ./vars

上面的命令的输出如下所示.由于我们尚未在钥匙目录中生成任何东西,警告没有什么可担心的。

1NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys

现在我们将清除任何可能的旧或示例密钥的工作目录,为我们的新密钥铺平空间。

1./clean-all

此最终命令通过调用交互式 OpenSSL 命令来构建证书权限(CA),输出将提示您确认先前在 Easy-RSA 变量文件中输入的 Distinguished Name 变量(国家名称、组织名称等)。

1./build-ca

只需按ENTER来通过每个提示,如果需要更改,您可以从提示的内部进行。

为服务器生成证书和密钥

仍在工作从 /etc/openvpn/easy-rsa,现在输入命令来构建服务器的密钥. 您看到服务器标记为红色的地方是我们在步骤 2 之前的 Easy-RSA 的vars文件中设置的export KEY_NAME变量。

1./build-key-server server

类似的输出被生成,就像我们运行 ./build-ca 时一样,你可以再次按 ENTER’ 来确认每行的区别名称。

1Please enter the following 'extra' attributes
2to be sent with your certificate request
3A challenge password []:
4An optional company name []:

两者都应该留空,所以只需按输入才能通过每一个。

最后两个额外的查询需要一个积极的(y)答案:

1Sign the certificate? [y/n]
21 out of 1 certificate requests certified, commit? [y/n]

上面的最后一个提示应该是:

1Write out database with 1 new entries
2Data Base Updated

移动服务器证书和密钥

OpenVPN希望看到服务器的CA,证书和密钥在/etc/openvpn

1cp /etc/openvpn/easy-rsa/keys/{server.crt,server.key,ca.crt} /etc/openvpn

您可以验证副本是成功的:

1ls /etc/openvpn

您应该看到服务器的证书和密钥文件。

此时,OpenVPN服务器已准备好启动并检查状态。

1service openvpn start
2service openvpn status

状态命令应该返回:

1VPN 'server' is running

恭喜您!您的 OpenVPN 服务器已启动,如果状态消息显示 VPN 未启动,请查看 /var/log/syslog 文件,查找以下错误:

1Options error: --key fails with 'server.key': No such file or directory

此错误表明 server.key 未被正确地复制到 `/etc/openvpn. 重新复制文件并再次尝试。

步骤 3 – 为客户生成证书和密钥

到目前为止,我们已经安装并配置了OpenVPN服务器,创建了一个证书权威,并创建了服务器的自己的证书和密钥. 在这个步骤中,我们使用服务器的CA来生成连接到VPN的每个客户端设备的证书和密钥。

密钥和证书建筑

每个连接到VPN的客户端都具有自己的独特证书和密钥,而不是在所有客户端设备中生成一个通用证书和密钥。

注: 默认情况下,OpenVPN不允许客户端使用相同的证书和密钥同时连接到服务器(参见 duplicate-cn/etc/openvpn/server.conf)。

要为您打算连接到VPN的每个设备创建单独的身份验证凭证,您应该为每个设备完成此步骤,但将下面的客户端名称1更改为不同的东西,如客户端2或iPhone2。

正如我们对服务器的密钥所做的那样,现在我们正在为我们的客户端构建一个例子,您仍然应该从/etc/openvpn/easy-rsa中工作。

1./build-key client1

再次,您将被要求更改或确认 Distinguished Name 变量和这两个提示,这些提示应该留空。

1Please enter the following 'extra' attributes
2to be sent with your certificate request
3A challenge password []:
4An optional company name []:

如前所述,在构建过程结束时,这两个确认需要一个(`y')响应:

1Sign the certificate? [y/n]
21 out of 1 certificate requests certified, commit? [y/n]

如果关键构建成功,则输出将再次为:

1Write out database with 1 new entries
2Data Base Updated

示例客户端配置文件也应该被复制到 Easy-RSA 密钥目录,我们将其用作模板,将其下载到客户端设备进行编辑。在复制过程中,我们正在将示例文件的名称从 client.conf 更改为 client.ovpn,因为 .ovpn 文件扩展是客户端希望使用的。

1cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/easy-rsa/keys/client.ovpn

您可以为每个客户端重复此部分,将客户端1替换为整个客户端的相应名称。

将证书和密钥传输到客户端设备

请记住,从上面的步骤中,我们创建了客户端证书和密钥,并将它们存储在OpenVPN服务器上,在/etc/openvpn/easy-rsa/keys目录中。

对于每个客户端,我们需要将客户端证书、密钥和配置文件模板文件转移到我们本地计算机或其他客户端设备上的文件夹中。

在本示例中,我们的客户端1 设备需要其证书和密钥,位于服务器上:

  • /etc/openvpn/easy-rsa/keys/client1.crt
  • /etc/openvpn/easy-rsa/keys/client1.key

ca.crtclient.ovpn 文件对所有客户端都是一样的. 也下载这两个文件; 请注意, ca.crt 文件位于与其他客户端不同的目录中。

  • /etc/openvpn/easy-rsa/keys/client.ovpn
  • /etc/openvpn/ca.crt

虽然用于实现此转移的确切应用程序将取决于您的选择和设备的操作系统,但您希望该应用程序在后端使用SFTP(SSH文件传输协议)或SCP(安全副本)。

以下是使用我们的客户端1 示例的 SCP 命令,它将文件 client1.key 放入本地计算机上的 Downloads 目录。

1scp 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模板文件,以包括服务器的证书权威,以及客户端的证书及其密钥。

我们将在我们下载的所有客户端文件的本地计算机上为我们的客户端1设备创建一个单一的配置文件。本地计算机本身可能是一个预期客户端或只是一个临时的工作区来合并身份验证文件。

** 注意:** 您的重复的「client.ovpn」的名称不需要与客户端设备相关。客户端的 OpenVPN 应用程序将使用该文件名作为VPN连接本身的标识符。相反,您应该重复「client.ovpn」到您希望VPN的名标在您的操作系统中。例如: work.ovpn将被识别为 work, school.ovpn作为 school等。

在本教程中,我们将命名VPN连接DigitalOcean,因此DigitalOcean.ovpn将是从这一点引用的文件名。

第一個關注的區域將是您的 Droplet 的 IP 位址. 在檔案的頂部,更改 my-server-1 以反映您的 VPN 的 IP。

1# The hostname/IP and port of the server.
2# You can have multiple remote entries
3# to load balance between the servers.
4remote my-server-1 1194

接下来,寻找下面的区域,并评论用户没有人群组 nogroup,就像我们在步骤 1中的server.conf中所做的那样 ** 注意:** 这不适用于Windows,所以您可以跳过它。

1# Downgrade privileges after initialization (non-Windows only)
2user nobody
3group nogroup

下面的区域需要显示的三个行评论,所以我们可以直接在DigitalOcean.ovpn文件中包含证书和密钥。

1# SSL/TLS parms.
2# . . .
3#ca ca.crt
4#cert client.crt
5#key client.key

为了将单个文件合并为一个统一的配置文件,将 ca.crt、 **client1.crt、**和 client1.key文件的内容直接粘贴到 .ovpn 配置文件中,使用一个基本的 XML 类似语法。

1<ca>
2(insert ca.crt here)
3</ca>
4<cert>
5(insert client1.crt here)
6</cert>
7<key>
8(insert client1.key here)
9</key>

完成后,文件的结尾应该类似于这个缩短的示例:

 1<ca>
 2-----BEGIN CERTIFICATE-----
 3. . .
 4-----END CERTIFICATE-----
 5</ca>
 6
 7<cert>
 8Certificate:
 9. . .
10-----END CERTIFICATE-----
11. . .
12-----END CERTIFICATE-----
13</cert>
14
15<key>
16-----BEGIN PRIVATE KEY-----
17. . .
18-----END PRIVATE KEY-----
19</key>

client1.crt文件中有一些额外的信息;只需包含整个文件就很好。

我们现在有一个统一的OpenVPN客户端配置文件来配置我们的客户端。

步骤5 - 安装客户端配置文件

现在我们将讨论如何在 Windows、OS X、iOS 和 Android 上安装客户端 VPN 配置文件. 这些客户端指令并不相互依赖,因此您可以跳过适用于您的任何内容。

请记住,连接将被称为任何你命名的.ovpn 文件. 在我们的示例中,由于文件被命名为 'DigitalOcean.ovpn',连接将被命名为 DigitalOcean

窗口

  • 安装 *

OpenVPN Windows 客户端应用程序可在 OpenVPN 的下载页面找到。

注意:OpenVPN需要管理权限来安装。

安装 OpenVPN 后,复制统一的DigitalOcean.ovpn配置文件到:

1C:\Program Files\OpenVPN\config

当您启动OpenVPN时,它会自动看到您的个人资料并使其可用。

OpenVPN 每次使用都必须作为管理员运行,即使是由管理员帐户使用。 要做到这一点,不用右键单击并选择 Run as administrator 每次使用VPN,您可以预设此功能,但必须从管理员帐户执行。 这也意味着标准用户需要输入管理员的密码才能使用 OpenVPN。

要将 OpenVPN 应用程序设置为始终以管理员身份运行,请右键单击其快捷图标,然后转到 属性。在 兼容性选项卡的底部,点击按钮为 更改所有用户的设置

  • 连接 *

每次启动 OpenVPN GUI 时,Windows 都会询问您是否希望允许该程序对您的计算机进行更改. 点击 Yes. 启动 OpenVPN 客户端应用程序只会将 applet 放入系统底盘,以便VPN 可根据需要连接和断开连接;它实际上不会实现 VPN 连接。

一旦 OpenVPN 启动,请通过进入系统底盘的 applet 来启动连接,并右击 OpenVPN applet 图标。这将打开背景菜单。在菜单顶部选择 DigitalOcean(这是我们的DigitalOcean.ovpn配置文件),然后选择 Connect

在建立连接时,会打开状态窗口,显示日志输出,并在客户端连接后会显示消息。

以同样的方式脱离VPN:进入系统底盘应用程序,右键单击OpenVPN应用程序图标,选择客户端配置文件,然后单击 脱离

对于X

  • 安装 *

Tunnelblick 是 Mac OS X 的免费开源 OpenVPN 客户端,您可以从 Tunnelblick 下载页面下载最新的磁盘图像。

安装过程结束时,Tunnelblick 会询问您是否有任何配置文件。 回答 No 可以更容易,然后让Tunnelblick 完成。 打开 Finder 窗口并双击DigitalOcean.ovpn

  • 连接 *

启动 Tunnelblick 通过在 Applications文件夹中双击 Tunnelblick。一旦启动 Tunnelblick,屏幕右上方的菜单栏中将出现一个 Tunnelblick 图标,以控制连接。

  • 安装 *

从 iTunes App Store 搜索并安装 OpenVPN Connect,官方的 iOS OpenVPN 客户端应用程序. 要将您的 iOS 客户端配置文件传输到设备上,请直接连接到计算机。

通过iTunes完成传输将被描述在这里. 在计算机上打开iTunes,然后点击 iPhone > apps. 向下滚动到 File Sharing 部分,然后点击 OpenVPN 应用程序. 右侧的空白窗口, OpenVPN 文档,用于共享文件。

iTunes showing the VPN profile ready to load on the iPhone

现在在 iPhone 上启动 OpenVPN 应用程序. 将收到通知,新配置文件已准备好导入。

The OpenVPN iOS app showing new profile ready to import

  • 连接 *

OpenVPN现在已经准备好与新配置文件一起使用。通过将 Connect按钮滑动到 On位置来启动连接。

** 注意: ** 设置中的 VPN 交换机不能用来连接到 VPN. 如果您尝试,您将收到通知只使用 OpenVPN 应用程序进行连接。

The OpenVPN iOS app connected to the VPN

安卓

  • 安装 *

搜索并安装 Android OpenVPN Connect,是官方的Android OpenVPN客户端应用程序。

可以通过 USB 将 Android 设备连接到您的计算机并复制文件来传输 .ovpn 配置文件. 或者,如果您有 SD 卡阅读器,您可以删除设备的 SD 卡,将该配置文件复制到其上,然后将该卡重新插入到 Android 设备中。

启动OpenVPN应用程序,然后点击菜单来导入配置文件。

The OpenVPN Android app profile import menu selection

然后导航到保存的配置文件的位置(屏幕截图使用 /sdcard/Download/)并选择文件。

The OpenVPN Android app selecting VPN profile to import

  • 连接 *

要连接,只需点击 连接 ** 按钮,您将被问及是否信任 OpenVPN 应用程序。 选择 OK 来启动连接。 要脱离 VPN,请返回 OpenVPN 应用程序并选择 ** 脱离

The OpenVPN Android app ready to connect to the VPN

步骤 6 - 测试您的VPN连接

一旦一切都安装完毕,一个简单的检查就证实一切正常工作了. 没有启用VPN连接,请打开浏览器,然后转到 DNSLeakTest

该网站将返回由您的互联网服务提供商分配的IP地址,并显示给世界其他地方. 要通过相同的网站检查您的DNS设置,请单击 扩展测试,它将告诉您正在使用的DNS服务器。

现在将OpenVPN客户端连接到您的Droplet的VPN,并刷新浏览器。VPN服务器的完全不同的IP地址现在应该出现。这就是您现在向世界展示的方式。 再次,DNSLeakTest(https://www.dnsleaktest.com) Extended Test将检查您的DNS设置并确认您现在正在使用VPN推出的DNS解析器。

恭喜您!您现在正在安全地穿越互联网,保护您的身份,位置和流量免受欺诈者和审查者的影响。

Published At
Categories with 技术
comments powered by Disqus