如何在 CentOS 8 上设置和配置 OpenVPN 服务器

介绍

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

HTTPS 连接结合使用时,此设置可让您确保无线登录和交易的安全。您可以规避地域限制和审查制度,并保护您的位置和来自不受信任网络的任何未加密的 HTTP 流量。

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

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

有关更多信息,请参阅此页面

先决条件

要学习本教程,您需要:

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

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

有了这些先决条件,您就可以开始在 CentOS 8 上设置和配置 OpenVPN 服务器了。

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

步骤 1 — 安装 OpenVPN 和 Easy-RSA

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

但是,默认情况下,CentOS 8 中不提供 OpenVPN 和 Easy-RSA,因此您需要启用 Extra Packages for Enterprise Linux (EPEL) 存储库。EPEL 由 Fedora 项目管理,包含用于 Fedora、CentOS 和其他使用 RPM 包格式的 Linux 发行版的非标准但流行的包。以您在初始设置步骤中创建的非 root sudo 用户身份登录到您的 OpenVPN 服务器并运行以下命令:

  • sudo dnf install epel-release
  • sudo dnf install openvpn easy-rsa

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

  • mkdir ~/easy-rsa

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

  • ln -s /usr/share/easy-rsa/3/* ~/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目录,然后您将vars使用您喜欢的文本编辑器创建和编辑该文件。

CentOS 8 附带的默认文本编辑器是vi. vi是一个非常强大的文本编辑器,但对于缺乏经验的用户来说可能有点迟钝。您可能想要安装一个更人性化的编辑器,例如nano方便编辑 CentOS 8 服务器上的配置文件:

  • sudo dnf install nano

当系统提示您安装时nano,请输入y以继续安装步骤。现在您已准备好编辑vars文件:

  • cd ~/easy-rsa
  • nano vars

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

~/easy-rsa/vars
set_var EASYRSA_ALGO "ec"
set_var EASYRSA_DIGEST "sha512"

这些行将确保您的私钥和证书请求配置为使用现代椭圆曲线加密 (ECC) 为您的客户端和 OpenVPN 服务器生成密钥和安全签名。

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

背景:当客户端连接到 OpenVPN 时,他们使用非对称加密(也称为公钥/私钥)来执行TLS 握手但是,在传输加密的 VPN 流量时,服务器和客户端使用对称加密,也称为共享密钥加密。

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

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

  • ./easyrsa init-pki

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

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

第 3 步 – 创建 OpenVPN 服务器证书请求和私钥

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

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

  • cd ~/easy-rsa

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

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

  • ./easyrsa gen-req server nopass
Output
Common Name (eg: your user, host, or server name) [server]: Keypair and certificate request completed. Your files are: req: /home/sammy/easy-rsa/pki/reqs/server.req key: /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 服务器需要了解server证书并对其进行验证。一旦 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

现在以拥有该easy-rsa目录的非 root 用户身份登录到 CA 服务器,您在目录中创建了您的 PKI。使用easyrsa脚本导入证书请求

  • cd ~/easy-rsa
  • ./easyrsa import-req /tmp/server.req server
Output
. . . The request has been successfully imported with a short name of: server You may now use this name to perform signing operations on this request.

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

  • ./easyrsa sign-req server server

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

Output
You are about to sign the following certificate. Please check over the details shown below for accuracy. Note that this request has not been cryptographically verified. Please be sure it came from a trusted source or that you have verified the request checksum with the sender. Request subject, to be signed as a server certificate for 3650 days: subject= commonName = server Type the word 'yes' to continue, or any other input to abort. Confirm request details: yes . . . Certificate created at: /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指令此选项用于混淆服务器和客户端最初相互连接时使用的 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 目录并easyrsa使用gen-reqnopass选项以及客户端的通用名称运行脚本

  • 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 sign-req client client1

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

Output
Type the word 'yes' to continue, or any other input to abort. Confirm request details: yes

同样,如果您加密了 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/sample/sample-config-files/server.conf /etc/openvpn/server/

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

  • sudo nano /etc/openvpn/server/server.conf

我们需要更改此文件中的几行。首先,HMAC通过搜索tls-auth指令找到配置部分此行应取消注释。通过;在行的开头添加 a注释掉它然后在它只包含值之后添加一个新行tls-crypt ta.key

/etc/openvpn/server.conf
;tls-auth ta.key 0 # This file is secret
tls-crypt ta.key

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

/etc/openvpn/server.conf
;cipher AES-256-CBC
cipher AES-256-GCM

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

/etc/openvpn/server.conf
auth SHA256

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

/etc/openvpn/server.conf
;dh dh2048.pem
dh none

接下来,我们希望 OpenVPN 在启动后无特权运行,因此我们需要告诉它以用户和nobody组运行要启用此功能,请通过删除每行开头符号来查找和取消注释user nobody行:group nobody;

/etc/openvpn/server.conf
user nobody
group nobody

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

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

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

/etc/openvpn/server.conf
push "redirect-gateway def1 bypass-dhcp"

在此行下方,找到该dhcp-option部分。再次,;从两行的开头删除以取消注释:

/etc/openvpn/server.conf
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"

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

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

(可选)调整端口和协议

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

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

/etc/openvpn/server.conf
port 1194

编辑它,使端口为 443:

/etc/openvpn/server.conf
# Optional!
port 443

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

/etc/openvpn/server.conf
# Optional!
proto tcp

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

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

/etc/openvpn/server.conf
# Optional!
explicit-exit-notify 0

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

(可选)指向非默认凭据

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

/etc/openvpn/server.conf
cert server.crt
key server.key

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

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

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

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

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

  • sudo nano /etc/sysctl.conf

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

/etc/sysctl.conf
net.ipv4.ip_forward = 1

完成后保存并关闭文件。

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

  • sudo sysctl -p
Output
net.ipv4.ip_forward = 1

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

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

步骤 9 — 防火墙配置

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

假设您遵循了本教程开始时的先决条件,您应该已经firewalld在服务器上安装并运行。要允许 OpenVPN 通过防火墙,您需要知道您的活动firewalld区域是什么使用以下命令找到它:

  • sudo firewall-cmd --get-active-zones
Output
public Interfaces: eth0

如果您没有看到trusted列出tun0接口区域,运行以下命令将 VPN 设备添加到该区域:

  • sudo firewall-cmd --zone=trusted --add-interface=tun0
  • sudo firewall-cmd --permanent --zone=trusted --add-interface=tun0

接下来,将该openvpn服务添加firewalld您的活动区域内允许服务列表中,然后通过再次运行该命令但--permanent添加选项使该设置永久化

  • sudo firewall-cmd --permanent --add-service openvpn
  • sudo firewall-cmd --permanent --zone=trusted --add-service openvpn

要在防火墙上应用更改,请运行:

  • sudo firewall-cmd --reload

您现在可以使用以下命令检查服务是否已正确添加:

  • sudo firewall-cmd --list-services --zone=trusted
Output
openvpn

接下来,我们将向防火墙添加伪装规则。伪装允许您的 OpenVPN 服务器将您的 OpenVPN 客户端的地址转换为服务器自己的公共地址,然后对发送回客户端的流量执行相反的操作。此过程也称为网络地址转换(NAT)。

使用以下命令添加伪装规则:

  • sudo firewall-cmd --add-masquerade
  • sudo firewall-cmd --add-masquerade --permanent

您可以使用以下命令检查伪装是否正确添加:

  • sudo firewall-cmd --query-masquerade
Output
yes

接下来,您只需要为 OpenVPN 子网创建特定的伪装规则。您可以首先创建一个 shell 变量(DEVICE在我们的示例中),它代表您的服务器使用的主要网络接口,然后使用该变量永久添加路由规则:

  • DEVICE=$(ip route | awk '/^default via/ {print $5}')
  • sudo firewall-cmd --permanent --direct --passthrough ipv4 -t nat -A POSTROUTING -s 10.8.0.0/24 -o $DEVICE -j MASQUERADE

请务必重新加载,firewalld以便您的所有更改生效:

  • sudo firewall-cmd --reload

带有--permanent标志的命令将确保规则在重新启动后保持不变。firewall-cmd --reload命令确保应用对防火墙的所有未完成更改。设置好防火墙规则后,我们可以在服务器上启动 OpenVPN 服务。

第 10 步 – 启动 OpenVPN

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

  • sudo systemctl -f enable openvpn-server@server.service

然后启动OpenVPN服务:

  • sudo systemctl start openvpn-server@server.service

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

  • sudo systemctl status openvpn-server@server.service
Output
● openvpn-server@server.service - OpenVPN service for server Loaded: loaded (/usr/lib/systemd/system/openvpn-server@.service; enabled; vendor preset: disabled) Active: active (running) since Tue 2020-04-07 02:32:07 UTC; 1min 52s ago Docs: man:openvpn(8) https://community.openvpn.net/openvpn/wiki/Openvpn24ManPage https://community.openvpn.net/openvpn/wiki/HOWTO Main PID: 15868 (openvpn) Status: "Initialization Sequence Completed" Tasks: 1 (limit: 5059) Memory: 1.2M CGroup: /system.slice/system-openvpn\x2dserver.slice/openvpn-server@server.service └─15868 /usr/sbin/openvpn --status /run/openvpn-server/status-server.log --status-version 2 --suppress-timestamps --cipher AES-256-GCM --ncp-ciphers AES-256-GCM:AES-128-GCM:AES-256-CBC:AES-128-CBC:BF-CBC --config server.conf . . .

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

第 11 步 – 创建客户端配置基础架构

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

首先创建一个新目录,您将client-configs在之前创建的目录中存储客户端配置文件

  • mkdir -p ~/client-configs/files

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

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

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

  • nano ~/client-configs/base.conf

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

~/client-configs/base.conf
. . .
# The hostname/IP and port of the server.
# You can have multiple remote entries
# to load balance between the servers.
remote your_server_ip 1194
. . .

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

~/client-configs/base.conf
proto udp

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

~/client-configs/base.conf
# Downgrade privileges after initialization (non-Windows only)
user nobody
group nobody

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

~/client-configs/base.conf
# SSL/TLS parms.
# See the server config file for more
# description. It's best to use
# a separate .crt/.key file pair
# for each client. A single ca
# file can be used for all clients.
;ca ca.crt
;cert client.crt
;key client.key

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

~/client-configs/base.conf
# If a tls-auth key is used on the server
# then every client must also have the key.
;tls-auth ta.key 1

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

~/client-configs/base.conf
cipher AES-256-GCM
auth SHA256

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

~/client-configs/base.conf
key-direction 1

最后,添加一些注释掉的行。尽管您可以在每个客户端配置文件中包含这些指令,但您只需为随/etc/openvpn/update-resolv-conf文件提供的 Linux 客户端启用它们此脚本使用该resolvconf实用程序来更新 Linux 客户端的 DNS 信息。

~/client-configs/base.conf
; script-security 2
; up /etc/openvpn/update-resolv-conf
; down /etc/openvpn/update-resolv-conf

如果您的客户端运行 Linux 并且有一个/etc/openvpn/update-resolv-conf文件,请在客户端配置文件生成后取消注释这些行。

完成后保存并关闭文件。

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

  • nano ~/client-configs/make_config.sh

在里面,添加以下内容:

~/client-configs/make_config.sh
#!/bin/bash

# First argument: Client identifier

KEY_DIR=~/client-configs/keys
OUTPUT_DIR=~/client-configs/files
BASE_CONFIG=~/client-configs/base.conf

cat ${BASE_CONFIG} \
<(echo -e '<ca>') \
${KEY_DIR}/ca.crt \
<(echo -e '</ca>\n<cert>') \
${KEY_DIR}/.crt \
<(echo -e '</cert>\n<key>') \
${KEY_DIR}/.key \
<(echo -e '</key>\n<tls-crypt>') \
${KEY_DIR}/ta.key \
<(echo -e '</tls-crypt>') \
> ${OUTPUT_DIR}/.ovpn

完成后保存并关闭文件。

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

  • chmod 700 ~/client-configs/make_config.sh

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

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

第 12 步 – 生成客户端配置

如果您按照指南进行操作,则您在第 6 步中分别创建了一个名为client1.crt的客户端证书和密钥client1.key。您可以通过移动到您的~/client-configs目录并运行您在上一个结尾处创建的脚本来为这些凭据生成一个配置文件步:

  • cd ~/client-configs
  • ./make_config.sh client1

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

  • ls ~/client-configs/files
Output
client1.ovpn

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

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

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

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

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

步骤 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 应用程序设置为始终以管理员身份运行,请右键单击其快捷方式图标并转到“属性”兼容性选项卡的底部,单击按钮更改所有用户的设置在新窗口中,选中Run this program as an administrator

连接

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

OpenVPN 启动后,通过进入系统托盘小程序并右键单击 OpenVPN 小程序图标来启动连接。这将打开上下文菜单。选择菜单顶部的client1(这是您的client1.ovpn个人资料)并选择Connect

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

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

苹果系统

安装

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

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

连接

通过双击应用程序文件夹中的 Tunnelblick 图标启动 Tunnelblick Tunnelblick 启动后,屏幕右上角的菜单栏中会出现一个 Tunnelblick 图标,用于控制连接。单击 图标,然后单击Connect client1菜单项以启动 VPN 连接。

Linux

安装

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

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

在 Ubuntu 或 Debian 上,您可以像在服务器上一样通过键入以下内容进行安装:

  • sudo apt update
  • sudo apt install openvpn

在 CentOS 上,您可以启用 EPEL 存储库,然后键入以下内容进行安装:

  • sudo yum install epel-release
  • sudo yum install openvpn

配置

检查您的发行版是否包含/etc/openvpn/update-resolv-conf脚本:

  • ls /etc/openvpn
Output
update-resolv-conf

接下来,编辑您传输的 OpenVPN 客户端配置文件:

  • nano client1.ovpn

如果您能够找到一个update-resolv-conf文件,请取消注释您添加的用于调整 DNS 设置的三行:

客户端1.ovpn
script-security 2
up /etc/openvpn/update-resolv-conf
down /etc/openvpn/update-resolv-conf

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

客户端1.ovpn
group nobody

保存并关闭文件。

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

  • sudo openvpn --config client1.ovpn

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

IOS

安装

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

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

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

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

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

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

连接到 VPN 的 OpenVPN iOS 应用程序

安卓

安装

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

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

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

OpenVPN Android 应用程序配置文件导入菜单选择

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

选择要导入的 VPN 配置文件的 OpenVPN Android 应用程序

连接

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

添加了新配置文件的 OpenVPN Android 应用程序

要连接,请点击您要使用的配置文件附近的切换按钮。您将看到通过 OpenVPN 服务器路由的连接和流量的实时统计信息:
连接到 VPN 的 OpenVPN Android 应用程序

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

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

注意:此测试 VPN 连接的方法仅适用于在步骤 7 中server.conf为 OpenVPN编辑文件时选择通过 VPN 路由所有流量的情况

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

该站点将返回您的互联网服务提供商分配的 IP 地址,以及您在世界其他地方的形象。要通过同一网站检查您的 DNS 设置,请单击扩展测试,它会告诉您正在使用哪些 DNS 服务器。

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

第 15 步 – 撤销客户端证书

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

为此,请按照有关如何在 CentOS 8 上撤销证书部分设置和配置证书颁发机构的先决条件教程中的示例进行操作

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

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

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

  • sudo nano /etc/openvpn/server/server.conf

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

/etc/openvpn/server/server.conf
crl-verify 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 操作

觉得文章有用?

点个广告表达一下你的爱意吧 !😁