介绍

虚拟专用网络 (VPN) 允许您像在专用网络上一样穿越不受信任的网络。当您连接到不受信任的网络(如酒店或咖啡店的 WiFi)时,它让您可以自由地从智能手机或笔记本电脑安全地访问互联网。

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

OpenVPN 是一个功能齐全的开源传输层安全 (TLS) VPN 解决方案,可适应各种配置。在本教程中,您将在 Ubuntu 20.04 服务器上设置 OpenVPN,然后将其配置为可从客户端计算机访问。

注意: 如果您计划在 DigitalOcean Droplet 上设置 OpenVPN 服务器,请注意,我们与许多托管服务提供商一样,会对带宽超额收费。因此,请注意您的服务器正在处理多少流量。

有关详细信息,请参阅 此页面。

先决条件

要遵循本教程,您将需要:

  • 一台 Ubuntu 20.04 服务器,具有 sudo 非 root 用户并启用了防火墙。要进行此设置,您可以按照我们的 使用 Ubuntu 20.04 进行初始服务器设置 教程进行操作。在本指南中,我们将其称为 OpenVPN 服务器

  • 一个单独的 Ubuntu 20.04 服务器设置为私有证书颁发机构 (CA),我们将在本指南中将其称为 CA 服务器。在此服务器上执行初始服务器设置指南中的步骤后,您可以按照步骤1到我们关于 [如何在 Ubuntu 20.04 上设置和配置证书颁发机构 (CA)] 指南的第 3 条(https://www.digitalocean.com/community/tutorials/how-to-set-up-and-configure- a-certificate-authority-ca-on-ubuntu-20-04) 来实现这一点。

注意: 虽然技术上可以使用您的 OpenVPN 服务器或本地计算机作为您的 CA,但不建议这样做,因为它会使您的 VPN 面临一些安全漏洞。根据 官方 OpenVPN 文档,您应该将您的 CA 放置在专用于导入和签署证书请求的独立机器上。出于这个原因,本指南假定您的 CA 位于单独的 Ubuntu 20.04 服务器上,该服务器还具有具有 sudo 权限的非 root 用户并启用了基本防火墙。

除此之外,您还需要一台用于连接 OpenVPN 服务器的客户端计算机。在本指南中,我们将其称为 OpenVPN 客户端。出于本教程的目的,建议您使用本地计算机作为 OpenVPN 客户端。

具备这些先决条件后,您就可以开始在 Ubuntu 20.04 上设置和配置 OpenVPN 服务器了。

注意: 请注意,如果您在配置这些服务器时禁用密码验证,则在本指南后面的它们之间传输文件时可能会遇到困难。要解决此问题,您可以在每台服务器上重新启用密码验证。或者,您可以为每个服务器生成一个 SSH 密钥对,然后将 OpenVPN 服务器的公共 SSH 密钥添加到 CA 机器的 authorized_keys 文件中,反之亦然。请参阅 如何在 Ubuntu 20.04 上设置 SSH 密钥 以获取有关说明如何执行这些解决方案中的任何一个。

第 1 步 — 安装 OpenVPN 和 Easy-RSA

本教程的第一步是安装 OpenVPN 和 Easy-RSA。 Easy-RSA 是一种公钥基础设施 (PKI) 管理工具,您将在 OpenVPN 服务器上使用它来生成证书请求,然后您将在 CA 服务器上验证和签名。

首先,更新您的 OpenVPN 服务器的软件包索引并安装 OpenVPN 和 Easy-RSA。这两个软件包都在 Ubuntu 的默认存储库中可用,因此您可以使用 apt 进行安装:

sudo apt 更新
sudo apt install openvpn easy-rsa

接下来,您需要以非 root 用户身份在 OpenVPN 服务器上创建一个名为 ~/easy-rsa 的新目录:

mkdir ~/easy-rsa

现在,您需要从软件包安装到您刚刚创建的 ~/easy-rsa 目录中的 easyrsa 脚本创建一个符号链接:

ln -s /usr/share/easy-rsa/* ~/easy-rsa/

注意: 虽然其他指南可能会指示您将 easy-rsa 包文件复制到 PKI 目录中,但本教程采用符号链接方法。因此,对 easy-rsa 包的任何更新都会自动反映在您的 PKI 脚本中。

最后,确保目录的所有者是您的非 root sudo 用户,并使用 chmod 限制对该用户的访问:

sudo chown sammy ~/easy-rsa
chmod 700 ~/easy-rsa

安装这些程序并移动到系统上的正确位置后,下一步是在 OpenVPN 服务器上创建公钥基础设施 (PKI),以便您可以为客户端和其他服务器请求和管理 TLS 证书连接到您的 VPN。

第 2 步 — 为 OpenVPN 创建 PKI

在创建 OpenVPN 服务器的私钥和证书之前,您需要在 OpenVPN 服务器上创建本地公钥基础结构目录。您将使用此目录来管理服务器和客户端的证书请求,而不是直接在您的 CA 服务器上进行。

要在您的 OpenVPN 服务器上构建 PKI 目录,您需要使用一些默认值填充一个名为“vars”的文件。首先,您将 cd 进入 easy-rsa 目录,然后您将使用 nano 或您喜欢的文本编辑器创建和编辑 vars 文件。

cd ~/easy-rsa
纳米年

打开文件后,粘贴以下两行:

~/easy-rsa/vars

set_var EASYRSA_ALGO "ec"
set_var EASYRSA_DIGEST "sha512"

这是您在 OpenVPN 服务器上的这个 vars 文件中唯一需要的两行,因为它不会用作证书颁发机构。他们将确保您的私钥和证书请求配置为使用现代椭圆曲线密码术 (ECC) 为您的客户端和 OpenVPN 服务器生成密钥和安全签名。

将您的 OpenVPN 和 CA 服务器配置为使用 ECC 意味着当客户端和服务器尝试建立共享对称密钥时,他们可以使用椭圆曲线算法进行交换。使用 ECC 进行密钥交换比使用带有经典 RSA 算法的普通 Diffie-Hellman 快得多,因为数字要小得多并且计算速度更快。

背景: 当客户端连接到 OpenVPN 时,他们使用非对称加密(也称为公钥/私钥)来执行 [TLS 握手](https://www.cloudflare.com/learning/ssl/what-happens -in-a-tls-handshake/)。但是,在传输加密的 VPN 流量时,服务器和客户端使用对称加密,也称为共享密钥加密。

与非对称相比,对称加密的计算开销要少得多:使用的数字要小得多,并且现代 CPU 集成指令以执行优化的对称加密操作 .为了从非对称加密切换到对称加密,OpenVPN 服务器和客户端将使用 椭圆曲线 Diffie-Hellman (ECDH) 算法 就一个尽快共享密钥。

填充 vars 文件后,您可以继续创建 PKI 目录。为此,请使用 init-pki 选项运行 easyrsa 脚本。尽管您已经在 CA 服务器上运行了此命令作为先决条件的一部分,但有必要在此处运行它,因为您的 OpenVPN 服务器和 CA 服务器具有单独的 PKI 目录:

./easyrsa 初始化-pki

请注意,在您的 OpenVPN 服务器上,无需创建证书颁发机构。您的 CA 服务器全权负责验证和签署证书。您的 VPN 服务器上的 PKI 仅用作存储证书请求和公共证书的方便且集中的地方。

在 OpenVPN 服务器上初始化 PKI 后,您就可以继续下一步,即创建 OpenVPN 服务器证书请求和私钥。

步骤 3 — 创建 OpenVPN 服务器证书请求和私钥

现在您的 OpenVPN 服务器已安装所有先决条件,下一步是在您的 OpenVPN 服务器上生成私钥和证书签名请求 (CSR)。之后,您会将请求转移到您的 CA 进行签名,创建所需的证书。获得签名证书后,您会将其传输回 OpenVPN 服务器并安装它以供服务器使用。

首先,以非 root 用户身份导航到 OpenVPN 服务器上的 ~/easy-rsa 目录:

cd ~/easy-rsa

现在,您将调用带有 gen-req 选项的 easyrsa,后跟机器的通用名称 (CN)。 CN 可以是您喜欢的任何内容,但使其具有描述性会很有帮助。在本教程中,OpenVPN 服务器的 CN 将是“服务器”。一定要包括 nopass 选项。如果不这样做,将对请求文件进行密码保护,这可能会导致以后出现权限问题。

注意: 如果您在此处选择“服务器”以外的名称,则必须调整以下说明。例如,将生成的文件复制到 /etc/openvpn 目录时,您必须替换正确的名称。您还必须稍后修改 /etc/openvpn/server.conf 文件以指向正确的 .crt.key 文件。

./easyrsa gen-req 服务器 nopass

输出通用名称(例如:您的用户、主机或服务器名称)[服务器]:

密钥对和证书请求已完成。您的文件是:
请求:/home/sammy/easy-rsa/pki/reqs/server.req
密钥:/home/sammy/easy-rsa/pki/private/server.key

这将为服务器创建一个私钥和一个名为“server.req”的证书请求文件。将服务器密钥复制到 /etc/openvpn/server 目录:

sudo cp /home/sammy/easy-rsa/pki/private/server.key /etc/openvpn/server/

完成这些步骤后,您已成功为您的 OpenVPN 服务器创建了一个私钥。您还为 OpenVPN 服务器生成了证书签名请求。 CSR 现在已准备好由您的 CA 签名。在本教程的下一部分中,您将学习如何使用 CA 服务器的私钥签署 CSR。

第 4 步 — 签署 OpenVPN 服务器的证书请求

在上一步中,您为 OpenVPN 服务器创建了证书签名请求 (CSR) 和私钥。现在 CA 服务器需要了解“服务器”证书并对其进行验证。一旦 CA 验证并将证书转发回 OpenVPN 服务器,信任您的 CA 的客户端也将能够信任 OpenVPN 服务器。

在 OpenVPN 服务器上,作为您的非 root 用户,使用 SCP 或其他传输方法将 server.req 证书请求复制到 CA 服务器进行签名:

scp /home/sammy/easy-rsa/pki/reqs/server.req sammy@your_ca_server_ip:/tmp

如果您遵循先决条件 [如何在 Ubuntu 20.04 上设置和配置证书颁发机构 (CA)](https://www.digitalocean.com/community/tutorials/how-to-set-up-and-configure-a -certificate-authority-ca-on-ubuntu-20-04) 教程,下一步是以您创建的用于管理 CA 的非 root 用户身份登录 CA 服务器。您将 cd 到创建 PK 的 ~/easy-rsa 目录,然后使用 easyrsa 脚本导入证书请求:

cd ~/easy-rsa
./easyrsa import-req /tmp/server.req 服务器

输出。 . .
请求已成功导入,短名称为:server
您现在可以使用此名称对此请求执行签名操作。

接下来,通过运行带有 sign-req 选项的 easyrsa 脚本对请求进行签名,然后是请求类型和通用名称。请求类型可以是“客户端”或“服务器”。由于我们正在处理 OpenVPN 服务器的证书请求,请务必使用 server 请求类型:

./easyrsa sign-req 服务器 服务器

在输出中,系统将提示您验证请求是否来自受信任的来源。输入 yes 然后按 ENTER 确认:

输出您即将签署以下证书。
请检查下面显示的详细信息以确保准确性。注意这个请求
尚未经过密码验证。请确保它来自受信任的
来源或您已与发件人验证请求校验和。

请求主题,作为服务器证书签署 3650 天:

主题u003d
commonName u003d 服务器


键入单词“yes”继续,或任何其他输入中止。
确认请求详细信息:是
. . .
证书创建于:/home/sammy/easy-rsa/pki/issued/server.crt

请注意,如果您加密了 CA 私钥,此时将提示您输入密码。

完成这些步骤后,您已经使用 CA 服务器的私钥签署了 OpenVPN 服务器的证书请求。生成的“server.crt”文件包含 OpenVPN 服务器的公共加密密钥,以及来自 CA 服务器的签名。签名的目的是告诉任何信任 CA 服务器的人,当他们连接到 OpenVPN 服务器时,他们也可以信任它。

要完成证书配置,请将 server.crtca.crt 文件从 CA 服务器复制到 OpenVPN 服务器:

scp pki/issued/server.crt sammy@your_vpn_server_ip:/tmp
scp pki/ca.crt sammy@your_vpn_server_ip:/tmp

现在回到您的 OpenVPN 服务器,将文件从 /tmp 复制到 /etc/openvpn/server:

sudo cp /tmp/{server.crt,ca.crt} /etc/openvpn/server

现在您的 OpenVPN 服务器几乎已准备好接受连接。在下一步中,您将执行一些额外的步骤来提高服务器的安全性。

步骤 5 — 配置 OpenVPN 加密材料

为了增加一层安全性,我们将添加一个额外的共享密钥,服务器和所有客户端将使用 [OpenVPN 的 tls-crypt 指令](https://build.openvpn.net/doxygen/group__tls__crypt.html #细节)。此选项用于混淆服务器和客户端最初相互连接时使用的 TLS 证书。 OpenVPN 服务器也使用它对传入的数据包执行快速检查:如果数据包使用预共享密钥签名,则服务器对其进行处理;如果未签名,则服务器知道它来自不受信任的来源,并且可以丢弃它而无需执行额外的解密工作。

此选项将有助于确保您的 OpenVPN 服务器能够应对未经身份验证的流量、端口扫描和拒绝服务攻击,这些攻击会占用服务器资源。它还使识别 OpenVPN 网络流量变得更加困难。

要生成 tls-crypt 预共享密钥,请在 OpenVPN 服务器上的 ~/easy-rsa 目录中运行以下命令:

cd ~/easy-rsa
openvpn --genkey --secret ta.key

结果将是一个名为“ta.key”的文件。将其复制到 /etc/openvpn/server/ 目录:

sudo cp ta.key /etc/openvpn/server

在 OpenVPN 服务器上准备好这些文件后,您就可以为您的用户创建客户端证书和密钥文件,您将使用它们连接到 VPN。

步骤 6 — 生成客户端证书和密钥对

尽管您可以在客户端计算机上生成私钥和证书请求,然后将其发送到 CA 进行签名,但本指南概述了在 OpenVPN 服务器上生成证书请求的过程。这种方法的好处是我们可以创建一个脚本,该脚本将自动生成包含所有必需密钥和证书的客户端配置文件。这让您不必将密钥、证书和配置文件传输到客户端,并简化加入 VPN 的过程。

我们将为本指南生成一个客户端密钥和证书对。如果您有多个客户,您可以为每个客户重复此过程。但请注意,您需要为每个客户端向脚本传递一个唯一的名称值。在本教程中,第一个证书/密钥对被称为“client1”。

首先在您的主目录中创建一个目录结构来存储客户端证书和密钥文件:

mkdir -p ~/client-configs/keys

由于您将在此目录中存储客户端的证书/密钥对和配置文件,因此您现在应该锁定其权限作为安全措施:

chmod -R 700 ~/client-configs

接下来,导航回 EasyRSA 目录并运行带有 gen-reqnopass 选项的 easyrsa 脚本,以及客户端的通用名称:

cd ~/easy-rsa
./easyrsa gen-req client1 nopass

ENTER确认通用名称。然后,将 client1.key 文件复制到您之前创建的 ~/client-configs/keys/ 目录:

cp pki/private/client1.key ~/client-configs/keys/

接下来,使用安全方法将“client1.req”文件传输到您的 CA 服务器:

scp pki/reqs/client1.req sammy@your_ca_server_ip:/tmp

现在登录到您的 CA 服务器。然后,导航到 EasyRSA 目录,并导入证书请求:

cd ~/easy-rsa
./easyrsa import-req /tmp/client1.req client1

接下来,以与上一步中对服务器相同的方式签署请求。不过,这一次,请务必指定 client 请求类型:

./easyrsa 签名请求客户端 client1

出现提示时,输入“是”以确认您打算签署证书请求并且它来自受信任的来源:

输出键入单词“是”以继续,或任何其他输入以中止。
确认请求详细信息:是

同样,如果您加密了 CA 密钥,系统会在此处提示您输入密码。

这将创建一个名为“client1.crt”的客户端证书文件。将此文件传输回服务器:

scp pki/issued/client1.crt sammy@your_server_ip:/tmp

回到您的 OpenVPN 服务器,将客户端证书复制到 ~/client-configs/keys/ 目录:

cp /tmp/client1.crt ~/client-configs/keys/

接下来,将 ca.crtta.key 文件也复制到 ~/client-configs/keys/ 目录,并为您的 sudo 用户设置适当的权限:

cp ~/easy-rsa/ta.key ~/client-configs/keys/
sudo cp /etc/openvpn/server/ca.crt ~/client-configs/keys/
sudo chown sammy.sammy ~/client-configs/keys/*

这样,您的服务器和客户端的证书和密钥都已生成并存储在您的 OpenVPN 服务器上的适当目录中。仍然需要对这些文件执行一些操作,但这些操作将在稍后的步骤中进行。现在,您可以继续配置 OpenVPN。

步骤 7 — 配置 OpenVPN

与许多其他广泛使用的开源工具一样,OpenVPN 有许多配置选项可用于根据您的特定需求定制您的服务器。在本节中,我们将提供有关如何根据该软件文档中包含的示例配置文件之一设置 OpenVPN 服务器配置的说明。

首先,复制示例 server.conf 文件作为您自己的配置文件的起点:

sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/server/
sudo gunzip /etc/openvpn/server/server.conf.gz

使用您选择的文本编辑器打开新文件进行编辑。我们将在示例中使用 nano:

Sudonano / 等 / 打开 vp / Serer / Serer。 conf

我们需要更改此文件中的几行。首先,通过搜索“tls-auth”指令找到配置的“HMAC”部分。此行将默认启用。通过在行首添加 ; 将其注释掉。然后在其后添加一个新行,仅包含值 tls-crypt ta.key:

/etc/openvpn/server/server.conf

;tls-auth ta.key 0 # 这个文件是秘密的
tls-crypt ta.key

接下来,通过查找“cipher”行找到关于密码学密码的部分。默认值设置为“AES-256-CBC”,但是,“AES-256-GCM”密码提供了更好的加密水平和性能,并且在最新的 OpenVPN 客户端中得到了很好的支持。我们将通过在这一行的开头添加一个 ; 符号来注释掉默认值,然后我们将在它之后添加另一行,其中包含 AES-256-GCM 的更新值:

/etc/openvpn/server/server.conf

;密码AES-256-CBC
密码AES-256-GCM

在这一行之后,添加一个 auth 指令来选择 HMAC 消息摘要算法。为此,SHA256 是一个不错的选择:

/etc/openvpn/server/server.conf

验证 SHA256

接下来,找到包含定义 Diffie-Hellman 参数的 dh 指令的行。由于我们已将所有证书配置为使用椭圆曲线密码术,因此不需要 Diffie-Hellman 种子文件。注释掉看起来像“dh dh2048.pem”或“dh dh.pem”的现有行。 Diffie-Hellman 密钥的文件名可能与示例服务器配置文件中列出的不同。然后在其后添加一行内容为“dh none”:

/etc/openvpn/server/server.conf

;dh dh2048.pem
没有

接下来,我们希望 OpenVPN 一旦启动就可以在没有权限的情况下运行,因此我们需要告诉它使用用户 nobody 和组 nogroup 运行。要启用此功能,请通过删除每行开头的 ; 符号来查找并取消注释 user nobodygroup nogroup 行:

/etc/openvpn/server/server.conf

用户没有人
组别组

###(可选)推送 DNS 更改以通过 VPN 重定向所有流量

上面的设置将在您的客户端和服务器之间创建 VPN 连接,但不会强制任何连接使用隧道。如果您希望使用 VPN 通过 VPN 路由您的所有客户端流量,您可能需要将一些额外的设置推送到客户端计算机。

首先,找到并取消注释包含 push "redirect-gateway def1 bypass-dhcp" 的行。这样做会告诉您的客户端通过您的 OpenVPN 服务器重定向其所有流量。请注意,启用此功能可能会导致与其他网络服务(如 SSH)的连接问题:

/etc/openvpn/server/server.conf

推送“重定向网关 def1 旁路 dhcp”

就在这一行下方,找到“dhcp-option”部分。再次,从两行的开头删除 ; 以取消注释它们:

/etc/openvpn/server/server.conf

推送“dhcp-option DNS 208.67.222.222”
推送“dhcp-option DNS 208.67.220.220”

这些行将告诉您的客户在列出的 IP 地址处使用免费的 OpenDNS 解析器。如果您更喜欢其他 DNS 解析器,您可以用它们代替突出显示的 IP。

这将帮助客户端重新配置其 DNS 设置以使用 VPN 隧道作为默认网关。

###(可选)调整端口和协议

默认情况下,OpenVPN 服务器使用端口“1194”和 UDP 协议来接受客户端连接。如果由于客户端可能处于限制性网络环境而需要使用不同的端口,则可以更改“端口”选项。如果您不在 OpenVPN 服务器上托管 Web 内容,端口“443”是一个流行的选择,因为它通常被允许通过防火墙规则。

要将 OpenVPN 更改为侦听端口 443,请打开“server.conf”文件并找到如下所示的行:

/etc/openvpn/server/server.conf

端口 1194

编辑它,使端口为 443:

/etc/openvpn/server/server.conf

# 可选的!
端口 443

通常,该协议也仅限于该端口。如果是这样,请在 port 行下方找到 proto 行,并将协议从 udp 更改为 tcp:

/etc/openvpn/server/server.conf

# 可选的!
原型 tcp

如果你 do 将协议切换到 TCP,则需要将 explicit-exit-notify 指令的值从 1 更改为 0,因为该指令仅由 UDP 使用。如果在使用 TCP 时不这样做,则会在您启动 OpenVPN 服务时导致错误。

找到文件末尾的 explicit-exit-notify 行并将值更改为 0:

/etc/openvpn/server/server.conf

# 可选的!
显式退出通知 0

如果您不需要使用不同的端口和协议,最好保持这些设置不变。

###(可选)指向非默认凭据

如果您之前在 ./easyrsa gen-req server 命令中选择了不同的名称,请修改 server.conf 配置文件中的 certkey 行,使它们指向适当的 .crt和 .key 文件。如果您使用默认名称“服务器”,则它已正确设置:

/etc/openvpn/server/server.conf

证书服务器.crt
密钥服务器.key

完成后,保存并关闭文件。

您现在已经完成了 OpenVPN 常规设置的配置。在下一步中,我们将自定义服务器的网络选项。

步骤 8 — 调整 OpenVPN 服务器网络配置

服务器网络配置的某些方面需要调整,以便 OpenVPN 可以正确地通过 VPN 路由流量。其中第一个是_IP 转发_,一种确定IP 流量应该路由到哪里的方法。这对于您的服务器将提供的 VPN 功能至关重要。

要调整 OpenVPN 服务器的默认 IP 转发设置,请使用 nano 或您喜欢的编辑器打开 /etc/sysctl.conf 文件:

Sudona 没有 /etc/sysctl. conf

然后在文件底部添加以下行:

/etc/sysctl.conf

net.ipv4.ip_forward u003d 1

完成后保存并关闭文件。

要读取文件并为当前会话加载新值,请键入:

sudo sysctl -p

输出net.ipv4.ip_forward u003d 1

现在您的 OpenVPN 服务器将能够将传入流量从一个以太网设备转发到另一个。此设置确保服务器可以将来自连接在虚拟 VPN 接口上的客户端的流量引导到其其他物理以太网设备上。此配置将通过您的服务器的 IP 地址路由来自您客户端的所有 Web 流量,并且您的客户端的公共 IP 地址将被有效地隐藏。

在下一步中,您将需要配置一些防火墙规则,以确保进出 OpenVPN 服务器的流量正常流动。

步骤 9 — 防火墙配置

到目前为止,您已经在服务器上安装了 OpenVPN,对其进行了配置,并生成了客户端访问 VPN 所需的密钥和证书。但是,您尚未向 OpenVPN 提供任何有关从客户端发送传入 Web 流量的说明。您可以通过建立一些防火墙规则和路由配置来规定服务器应如何处理客户端流量。

假设您遵循本教程开始时的先决条件,您应该已经在您的服务器上安装并运行了“ufw”。要允许 OpenVPN 通过防火墙,您需要启用伪装,这是一种 iptables 概念,可提供即时动态网络地址转换 (NAT) 以正确路由客户端连接。

在打开防火墙配置文件添加伪装规则之前,首先要找到自己机器的公网接口。为此,请键入:

ip 路由列表默认

您的公共接口是在此命令的输出中找到的跟在单词“dev”后面的字符串。例如,这个结果显示了名为 eth0 的接口,它在下面突出显示:

Outputdefault 通过 159.65.160.1 dev eth0 proto static

当你有与你的默认路由关联的接口时,打开/etc/ufw/before.rules文件添加相关配置:

须藤/等/Ufw/之前。鲁斯

UFW 规则通常使用 ufw 命令添加。但是,“before.rules”文件中列出的规则会在加载常规 UFW 规则之前被读取并放置到位。在文件的顶部,添加下面突出显示的行。这将为 nat 表中的 POSTROUTING 链设置默认策略,并伪装来自 VPN 的任何流量。请记住将下面 -A POSTROUTING 行中的 eth0 替换为您在上述命令中找到的接口:

/etc/ufw/before.rules

#
# rules.before
#
# 应该在 ufw 命令行添加规则之前运行的规则。风俗
# 规则应添加到以下链之一:
# ufw-输入前
# ufw-输出前
# ufw-before-forward
#

# 开始 OPENVPN 规则
# NAT 表规则
*nat
:POSTROUTING 接受 [0:0]
# 允许从 OpenVPN 客户端到 eth0 的流量(更改为您发现的接口!)
-A POSTROUTING -s 10.8.0.0/8 -o eth0 -j MASQUERADE
犯罪
# 结束 OPENVPN 规则

# 不要删除这些必填行,否则会出错
*筛选
. . .

完成后保存并关闭文件。

接下来,您需要告诉 UFW 默认情况下也允许转发数据包。为此,请打开 /etc/default/ufw 文件:

须藤纳米 /etc/default/ufw

在里面,找到 DEFAULT_FORWARD_POLICY 指令并将值从 DROP 更改为 ACCEPT:

/etc/default/ufw

DEFAULT_FORWARD_POLICYu003d"接受"

完成后保存并关闭文件。

接下来,调整防火墙本身以允许流量到 OpenVPN。如果您没有更改 /etc/openvpn/server.conf 文件中的端口和协议,则需要打开 UDP 流量到端口 1194。如果您修改了端口和/或协议,请替换您在此处选择的值。

如果您在遵循先决条件教程时忘记添加 SSH 端口,也请在此处添加:

sudo ufw 允许 1194/udp
sudo ufw 允许 OpenSSH

注意:如果您使用不同的防火墙或自定义了您的 UFW 配置,您可能需要添加额外的防火墙规则。例如,如果您决定通过 VPN 连接对所有网络流量进行隧道传输,则需要确保 DNS 请求允许端口“53”流量,并确保 HTTP 和 HTTPS 流量允许端口“80”和“443”分别。如果您在 VPN 上使用其他协议,那么您还需要为它们添加规则。

添加这些规则后,禁用并重新启用 UFW 以重新启动它并从您修改的所有文件中加载更改:

sudo ufw 禁用
sudo ufw 启用

您的服务器现在已配置为正确处理 OpenVPN 流量。有了防火墙规则,我们就可以在服务器上启动 OpenVPN 服务了。

第 10 步 — 启动 OpenVPN

OpenVPN 作为 systemd 服务运行,因此我们可以使用 systemctl 来管理它。我们会将 OpenVPN 配置为在启动时启动,这样只要您的服务器正在运行,您就可以随时连接到您的 VPN。为此,请通过将 OpenVPN 服务添加到 systemctl 来启用它:

sudo systemctl -f 启用 openvpn-server@server.service

然后启动 OpenVPN 服务:

sudo systemctl start openvpn-server@server.service

使用以下命令仔细检查 OpenVPN 服务是否处于活动状态。您应该在输出中看到 active (running):

sudo systemctl status openvpn-server@server.service

输出● openvpn-server@server.service - 服务器的OpenVPN服务
已加载:已加载(/lib/systemd/system/openvpn-server@.service;已启用;供应商预设:已启用)
活跃:自 2020 年 4 月 29 日星期三 15:39:59 UTC 起活跃(运行); 6 秒前
文档:man:openvpn(8)
https://community.openvpn.net/openvpn/wiki/Openvpn24ManPage
https://community.openvpn.net/openvpn/wiki/HOWTO
主PID:16872(openvpn)
状态:“初始化序列完成”
任务:1(限制:1137)
内存:1.0M
CGroup:/system.slice/system-openvpn\x2dserver.slice/openvpn-server@server.service
└─16872 /usr/sbin/openvpn --status /run/openvpn-server/status-server.log --status-version 2 --suppress-timestamps --c>
. . .
. . .
4 月 29 日 15:39:59 ubuntu-20 openvpn[16872]:初始化序列完成

我们现在已经完成了 OpenVPN 的服务器端配置。接下来,您将配置您的客户端计算机并连接到 OpenVPN 服务器。

步骤 11 — 创建客户端配置基础架构

为 OpenVPN 客户端创建配置文件可能会有些麻烦,因为每个客户端都必须有自己的配置,并且每个客户端都必须与服务器配置文件中列出的设置保持一致。此步骤不是编写只能在一个客户端上使用的单个配置文件,而是概述了构建客户端配置基础架构的过程,您可以使用该基础架构即时生成配置文件。您将首先创建一个“基本”配置文件,然后构建一个脚本,该脚本将允许您根据需要生成唯一的客户端配置文件、证书和密钥。

通过创建一个新目录开始,您将在之前创建的 client-configs 目录中存储客户端配置文件:

mkdir -p ~/client-configs/文件

接下来,将示例客户端配置文件复制到 client-configs 目录中以用作您的基本配置:

cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/client-configs/base.conf

使用 nano 或您喜欢的文本编辑器打开这个新文件:

纳米 ~/client-configs/base.conf

在里面,找到 remote 指令。这会将客户端指向您的 OpenVPN 服务器地址——您的 OpenVPN 服务器的公共 IP 地址。如果您决定更改 OpenVPN 服务器正在侦听的端口,您还需要将“1194”更改为您选择的端口:

~/client-configs/base.conf

. . .
# 服务器的主机名/IP 和端口。
# 你可以有多个远程入口
# 在服务器之间进行负载平衡。
远程 your_server_ip 1194
. . .

确保协议与您在服务器配置中使用的值匹配:

~/client-configs/base.conf

原型 udp

接下来,通过删除每行开头的 ; 符号来取消注释 usergroup 指令:

~/client-configs/base.conf

# 初始化后降级权限(仅限非 Windows)
用户没有人
组别组

找到设置 cacertkey 的指令。注释掉这些指令,因为您很快就会在文件本身中添加证书和密钥:

~/client-configs/base.conf

# SSL/TLS 参数。
# 查看服务器配置文件以获取更多信息
# 描述。最好使用
# 一个单独的 .crt/.key 文件对
# 每个客户。单卡
# 文件可用于所有客户端。
; 该怎么办
;证书客户端.crt
;key 客户端.key

同样,注释掉 tls-auth 指令,因为您将直接将 ta.key 添加到客户端配置文件中(并且服务器设置为使用 tls-crypt):

~/client-configs/base.conf

# 如果服务器上使用了 tls-auth 密钥
# 那么每个客户端也必须有密钥。
;tls-auth ta.key 1

镜像您在 /etc/openvpn/server/server.conf 文件中设置的 cipherauth 设置:

~/client-configs/base.conf

密码AES-256-GCM
验证 SHA256

接下来,在文件的某处添加 key-direction 指令。您必须将此设置为“1”,以便 VPN 在客户端计算机上正常运行:

~/client-configs/base.conf

键方向 1

最后,添加一些注释掉的行来处理基于 Linux 的 VPN 客户端将用于 DNS 解析的各种方法。您将添加两组相似但不同的注释行。第一组是_不_使用systemd-resolved来管理DNS的客户端。这些客户端依靠 resolvconf 实用程序来更新 Linux 客户端的 DNS 信息。

~/client-configs/base.conf

;脚本安全 2
;向上 /etc/openvpn/update-resolv-conf
;向下 /etc/openvpn/update-resolv-conf

现在为使用 systemd-resolved 进行 DNS 解析的客户端添加另一组行:

~/client-configs/base.conf

;脚本安全 2
;向上 /etc/openvpn/update-systemd-resolved
;关闭 /etc/openvpn/update-systemd-resolved
;向下预
; dhcp 选项 DOMAIN-ROUTE 。

完成后保存并关闭文件。

稍后在本教程的 第 13 步 - 安装客户端配置步骤 中,您将了解如何确定 DNS 解析如何在 Linux 客户端和要取消注释的部分。

接下来,我们将创建一个脚本,该脚本将使用相关的证书、密钥和加密文件编译您的基本配置,然后将生成的配置放置在 ~/client-configs/files 目录中。在 ~/client-configs 目录中打开一个名为 make_config.sh 的新文件:

纳米 ~/client-configs/make_config.sh

在里面,添加以下内容:

~/client-configs/make_config.sh

#!/bin/bash

# 第一个参数:客户端标识符

KEY_DIRu003d~/client-configs/keys
OUTPUT_DIRu003d~/client-configs/文件
BASE_CONFIGu003d~/client-configs/base.conf

猫 ${BASE_CONFIG} \
<(echo -e '<ca>') \
${KEY_DIR}/ca.crt \
<(echo -e '</ca>\n<cert>') \
${KEY_DIR}/${1}.crt \
<(echo -e '</cert>\n<key>') \
${KEY_DIR}/${1}.key \
<(echo -e '</key>\n<tls-crypt>') \
${what_dir}/so.what \
<(echo -e '</tls-crypt>') \
> ${OUTPUT_DIR}/${1}.ovpn

完成后保存并关闭文件。

在继续之前,请务必通过键入以下内容将此文件标记为可执行文件:

chmod 700 ~/client-configs/make_config.sh

此脚本将复制您创建的“base.conf”文件,收集您为客户端创建的所有证书和密钥文件,提取它们的内容,将它们附加到基本配置文件的副本,然后导出所有将此内容添加到新的客户端配置文件中。这意味着,不必单独管理客户端的配置、证书和密钥文件,所有必需的信息都存储在一个地方。使用此方法的好处是,如果您将来需要添加客户端,您可以运行此脚本来快速创建一个新的配置文件,并确保所有重要信息都存储在一个易于访问的单一文件中地点。

请注意,每次添加新客户端时,都需要为其生成新的密钥和证书,然后才能运行此脚本并生成其配置文件。您将在下一步中使用此脚本进行一些练习。

步骤 12 — 生成客户端配置

如果您按照指南进行操作,则您在第 6 步中分别创建了一个名为“client1.crt”和“client1.key”的客户端证书和密钥。您可以通过进入您的“~/ client-configs` 目录并运行您在上一步结束时创建的脚本:

cd ~/client-configs
./make_config.sh 客户端1

这将在您的 ~/client-configs/files 目录中创建一个名为 client1.ovpn 的文件:

ls ~/client-configs/文件

输出client1.ovpn

您需要将此文件传输到您计划用作客户端的设备。例如,这可能是您的本地计算机或移动设备。

虽然用于完成此传输的确切应用程序将取决于您设备的操作系统和您的个人偏好,但可靠且安全的方法是在后端使用 SFTP(SSH 文件传输协议)或 SCP(安全副本)。这将通过加密连接传输您客户端的 VPN 身份验证文件。

这是一个示例 SFTP 命令,您可以从本地计算机(macOS 或 Linux)运行它。这会将我们在上一步中创建的“client1.ovpn”文件复制到您的主目录:

sftp sammy@openvpn_server_ip:client-configs/files/client1.ovpn ~/

以下是一些用于将文件从 OpenVPN 服务器安全传输到本地计算机的工具和教程:

  • WinSCP

  • 如何使用 SFTP 通过远程服务器安全传输文件

  • [如何使用 Filezilla 在您的 VPS 上安全地传输和管理文件](https://www.digitalocean.com/community/tutorials/how-to-use-filezilla-to-transfer-and-manage-files-securely -on-your-vps)

步骤 13 — 安装客户端配置

本节介绍如何在 Windows、macOS、Linux、iOS 和 Android 上安装客户端 VPN 配置文件。这些客户端说明均不相互依赖,因此请随意跳至适用于您设备的任何说明。

OpenVPN 连接将与您称为“.ovpn”文件的名称相同。关于本教程,这意味着连接被命名为“client1.ovpn”,与您生成的第一个客户端文件一致。

窗户

安装

从 OpenVPN 的下载页面 下载适用于 Windows 的 OpenVPN 客户端应用程序。为您的 Windows 版本选择适当的安装程序版本。

注意:OpenVPN 需要管理员权限才能安装。

安装 OpenVPN 后,将 .ovpn 文件复制到:

C:\Program Files\OpenVPN\config

当您启动 OpenVPN 时,它会自动找到配置文件并使其可用。

每次使用 OpenVPN 时,您都必须以管理员身份运行它,即使是管理帐户也是如此。要做到这一点,而不必在每次使用 VPN 时右键单击并选择 以管理员身份运行,您必须从管理帐户中预设此设置。这也意味着标准用户需要输入管理员密码才能使用 OpenVPN。另一方面,标准用户无法正确连接到服务器,除非客户端上的 OpenVPN 应用程序具有管理员权限,因此需要提升权限。

要将 OpenVPN 应用程序设置为始终以管理员身份运行,请右键单击其快捷方式图标并转到 Properties。在兼容性选项卡底部,单击按钮以更改所有用户的设置。在新窗口中,选中以管理员身份运行此程序

连接

每次启动 OpenVPN GUI 时,Windows 都会询问您是否要允许该程序对您的计算机进行更改。单击。启动 OpenVPN 客户端应用程序只会将小程序放在系统托盘中,以便您可以根据需要连接和断开 VPN;它实际上并没有建立 VPN 连接。

一旦 OpenVPN 启动,通过进入系统托盘小程序并右键单击 OpenVPN 小程序图标来启动连接。这将打开上下文菜单。选择菜单顶部的 client1(即您的 client1.ovpn 配置文件),然后选择 Connect

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

以相同方式断开 VPN:进入系统托盘小程序,右键单击 OpenVPN 小程序图标,选择客户端配置文件并单击 断开连接

苹果系统

安装

Tunnelblick 是适用于 macOS 的免费开源 OpenVPN 客户端。您可以从 Tunnelblick 下载页面 下载最新的磁盘映像。双击下载的.dmg文件,按照提示进行安装。

在安装过程即将结束时,Tunnelblick 会询问您是否有任何配置文件。回答我有配置文件,让 Tunnelblick 完成。打开 Finder 窗口并双击“client1.ovpn”。 Tunnelblick 将安装客户端配置文件。需要管理权限。

连接

通过双击 Applications 文件夹中的 Tunnelblick 图标启动 Tunnelblick。 Tunnelblick 启动后,屏幕右上角的菜单栏中将出现一个 Tunnelblick 图标,用于控制连接。单击图标,然后单击 Connect client1 菜单项以启动 VPN 连接。如果您在 Tunnelblick 中使用自定义 DNS 设置,您可能需要在高级配置对话框中选中“允许更改手动设置的网络设置”。

Linux

安装

如果您使用的是 Linux,则可以使用多种工具,具体取决于您的发行版。您的桌面环境或窗口管理器可能还包括连接实用程序。

然而,最通用的连接方式是使用 OpenVPN 软件。

在 Ubuntu 或 Debian 上,您可以像在服务器上一样安装它,方法是键入:

sudo apt 更新
sudo apt install openvpn

在 CentOS 上,您可以启用 EPEL 存储库,然后输入以下命令进行安装:

sudo dnf install epel-release
须藤 dnf 安装 openvpn

配置使用systemd-resolved的客户端

首先通过检查 /etc/resolv.conf 文件确定您的系统是否使用 systemd-resolved 来处理 DNS 解析:

猫 /etc/resolv.conf

输出# 此文件由 man:systemd-resolved(8) 管理。不要编辑。
. . .

名称服务器 127.0.0.53
选项 edns0

如果您的系统配置为使用 systemd-resolved 进行 DNS 解析,则 nameserver 选项后的 IP 地址将为 127.0.0.53。文件中还应该有注释,如显示的输出,解释“systemd-resolved”如何管理文件。如果您的 IP 地址与 127.0.0.53 不同,那么很可能您的系统没有使用 systemd-resolved,您可以转到下一部分配置具有 update-resolv-conf 脚本的 Linux 客户端.

要支持这些客户端,首先安装 openvpn-systemd-resolved 包。它提供了强制“systemd-resolved”使用 VPN 服务器进行 DNS 解析的脚本。

sudo apt install openvpn-systemd-resolved

安装该软件包,配置客户端以使用它,并通过 VPN 接口发送所有 DNS 查询。打开客户端的 VPN 文件:

纳米客户端1.ovpn

现在取消注释您之前添加的以下行:

client1.ovpn

脚本安全 2
向上 /etc/openvpn/update-systemd-resolved
关闭 /etc/openvpn/update-systemd-resolved
向下预
dhcp 选项 DOMAIN-ROUTE 。

配置使用 update-resolv-conf 的客户端

如果您的系统没有使用 systemd-resolved 来管理 DNS,请检查您的发行版是否包含 /etc/openvpn/update-resolv-conf 脚本:

ls /etc/openvpn

输出更新解析配置

如果您的客户端包含 update-resolv-conf 文件,则编辑您之前传输的 OpenVPN 客户端配置文件:

纳米客户端1.ovpn

取消注释您添加以调整 DNS 设置的三行:

client1.ovpn

脚本安全 2
向上 /etc/openvpn/update-resolv-conf
向下 /etc/openvpn/update-resolv-conf

如果您使用的是 CentOS,请将 group 指令从 nogroup 更改为 nobody 以匹配发行版的可用组:

client1.ovpn

组没人

保存并关闭文件。

连接

现在,您只需将“openvpn”命令指向客户端配置文件即可连接到 VPN:

sudo openvpn --config client1.ovpn

这应该将您连接到您的 VPN。

注意: 如果您的客户端使用 systemd-resolved 来管理 DNS,请通过运行 systemd-resolve --status 命令检查设置是否正确应用,如下所示:

systemd-resolve --status tun0

您应该看到如下输出:

输出链接 22 (tun0)
. . .
DNS 服务器:208.67.222.222
208.67.220.220
DNS域:〜。

如果您在输出中看到您在 OpenVPN 服务器上配置的 DNS 服务器的 IP 地址,以及 DNS Domain~. 设置,那么您已正确配置客户端以使用 VPN 服务器的 DNS 解析器。您还可以使用 DNS leak test.com 之类的网站检查您是否通过 VPN 发送 DNS 查询。

iOS

安装

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

此处概述了使用 iTunes 完成传输的过程。在电脑上打开 iTunes,然后点击 iPhone > apps。向下滚动到底部的文件共享部分,然后单击 OpenVPN 应用程序。右侧的空白窗口 OpenVPN Documents 用于共享文件。将“.ovpn”文件拖到 OpenVPN Documents 窗口。 iTunes 显示准备在 iPhone 上加载的 VPN 配置文件

现在在 iPhone 上启动 OpenVPN 应用程序。您将收到新配置文件已准备好导入的通知。点击绿色加号将其导入。

显示新配置文件准备导入的 OpenVPN iOS 应用程序 正在连接

OpenVPN 现在可以与新配置文件一起使用。通过将 Connect 按钮滑动到 On 位置来开始连接。通过将相同的按钮滑动到 Off 来断开连接。

注意:设置下的VPN开关不能用于连接VPN。如果您尝试,您将收到仅使用 OpenVPN 应用程序连接的通知。

连接VPN的OpenVPN iOS app

安卓

安装

打开 Google Play 商店。搜索并安装Android OpenVPN Connect,官方Android OpenVPN客户端应用程序。

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

启动 OpenVPN 应用程序并点击“文件”菜单以导入配置文件。

OpenVPN安卓应用配置文件导入菜单选择

然后导航到保存配置文件的位置(屏幕截图使用 /storage/emulated/0/openvpn)并选择您的 .ovpn 文件。点击“导入”按钮以完成导入此配置文件。

选择要导入的VPN配置文件的OpenVPN安卓应用

正在连接 添加配置文件后,您将看到如下屏幕:

新增配置文件的OpenVPN安卓应用

要连接,请点击靠近您要使用的配置文件的切换按钮。您将看到通过 OpenVPN 服务器路由的连接和流量的实时统计信息:![连接到 VPN 的 OpenVPN Android 应用程序](https://devpress-image.s3.cn-north-1.jdcloud-oss .com/a/125a90c52c_05-connected.jpg)

要断开连接,只需再次点击左上角的切换按钮。系统将提示您确认是否要断开与 VPN 的连接。

第 14 步 — 测试您的 VPN 连接(可选)

**注意:**只有当您在第 7 步中编辑 OpenVPN 的 server.conf 文件时选择通过 VPN 路由所有流量时,此测试 VPN 连接的方法才有效。

安装完所有内容后,只需进行简单检查即可确认一切正常。在未启用 VPN 连接的情况下,打开浏览器并转到 DNSLeakTest。

该站点将返回由您的互联网服务提供商分配的 IP 地址,并且与您在世界其他地方看到的一样。要通过同一网站检查您的 DNS 设置,请单击 Extended Test,它会告诉您您正在使用哪些 DNS 服务器。

现在将 OpenVPN 客户端连接到您的 Droplet 的 VPN 并刷新浏览器。现在应该会出现一个完全不同的 IP 地址(您的 VPN 服务器的 IP 地址),这就是您向世界展示的方式。同样,DNSLeakTest’s Extended Test 将检查您的 DNS 设置并确认您现在正在使用您的 VPN 推送的 DNS 解析器。

步骤 15 — 撤销客户端证书

有时,您可能需要撤销客户端证书以防止进一步访问 OpenVPN 服务器。

为此,请按照[如何在 Ubuntu 20.04 上设置和配置证书颁发机构](https://www.digitalocean.com/community/tutorials/how-to-set-up-and -configure-a-certificate-authority-ca-on-ubuntu-20-04#optional-%E2%80%94-revoking-a-certificate) 在 Revoking a Certificate 部分。

使用这些说明撤销客户端证书后,您需要将生成的“crl.pem”文件复制到“/etc/openvpn/server”目录中的 OpenVPN 服务器:

sudo cp /tmp/crl.pem /etc/openvpn/server/

接下来,打开 OpenVPN 服务器配置文件:

Sudonano / 等 / 打开 vp / Serer / Serer。 conf

在文件的底部,添加 crl-verify 选项,它将指示 OpenVPN 服务器在每次尝试连接时检查我们创建的证书吊销列表:

/etc/openvpn/server/server.conf

crl-验证 crl.pem

保存并关闭文件。

最后重启OpenVPN实现证书撤销:

sudo systemctl restart openvpn-server@server.service

客户端应该不再能够使用旧凭据成功连接到服务器。

要撤销其他客户端,请按照以下流程操作:

  1. 使用 ./easyrsa revoke client_name 命令撤销证书

  2. 生成新的 CRL

  3. 将新的 crl.pem 文件传输到您的 OpenVPN 服务器并将其复制到 /etc/openvpn/server/ 目录以覆盖旧列表。

  4. 重启 OpenVPN 服务。

您可以使用此过程撤销您之前为服务器颁发的任何证书。

结论

您现在应该在您的 OpenVPN 服务器上运行一个完全可操作的虚拟专用网络。您可以浏览网页并下载内容,而不必担心恶意行为者会跟踪您的活动。

您可以采取几个步骤来进一步自定义 OpenVPN 安装,例如将客户端配置为自动连接到 VPN 或配置客户端特定的规则和访问策略。对于这些和其他 OpenVPN 自定义,您应该查阅 官方 OpenVPN 文档。

要配置更多客户端,您只需为每个附加设备执行步骤 611-13。要撤销对客户端的访问权限,请执行步骤 15

Logo

更多推荐