如何在 Ubuntu 22.04 上设置和配置 OpenVPN 服务器

介绍

虚拟私人网络(https://en.wikipedia.org/wiki/Virtual_private_network)(VPN)允许您穿过不受信任的网络,就像您在私人网络上一样。

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

OpenVPN是一个完整的,开源的运输层安全(TLS)VPN解决方案,可容纳各种配置. 在本教程中,您将设置OpenVPN在Ubuntu 22.04服务器上,然后将其配置为从客户端机器上访问。

<$>[注] 注: 如果您打算在DigitalOcean Droplet上设置一个OpenVPN服务器,请注意,像许多托管提供商一样,我们会收取带宽过期费用。

请参阅此页面(https://www.digitalocean.com/docs/accounts/billing/bandwidth/)以获取更多信息。

前提条件

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

  • 一个 Ubuntu 22.04 服务器具有 sudo 非 root 用户和启用防火墙。 要设置此功能,您可以遵循我们的 初始服务器设置与 Ubuntu 22.04] 教程。 在本指南中,我们将将此称为 OpenVPN 服务器
  • 一个独立的 Ubuntu 22.04 服务器设置为私人证书授权(CA),我们将在本指南中称为 CA 服务器。 在本服务器上执行 初始服务器设置指南的步骤后,您可以遵循我们关于 如何在 Ubuntu 22.04上设置和配置证书授权(CA)的指南的步骤 1 到 3 来完成。

<$>[注] **注:**虽然在技术上可以使用你的OpenVPN服务器或本地机器作为你的CA,但这并不建议,因为它会打开你的VPN到一些安全漏洞。每 官方OpenVPN文档,你应该把你的CA放在一个专门用于进口和签署证书请求的独立机器上。

此外,您还需要一个客户端机器,您将使用它连接到您的OpenVPN服务器。 在本指南中,我们将称之为OpenVPN客户端。

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

请注意,如果您在配置这些服务器时禁用密码身份验证,您可能会在本指南晚些时候在这些服务器之间传输文件时遇到困难。 为了解决此问题,您可以在每个服务器上重新启用密码身份验证。 或者,您可以为每个服务器生成一个SSH密钥对,然后将OpenVPN服务器的公共SSH密钥添加到CA机器的authorized_keys文件中,反之亦然。

步骤 1 — 安装 OpenVPN 和 Easy-RSA

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

要開始,請更新您的 OpenVPN 伺服器的包索引,並安裝 OpenVPN 和 Easy-RSA. 兩個包都可在 Ubuntu 的默認儲存庫中使用,因此您可以使用「apt」進行安裝:

1[environment second]
2sudo apt update
3sudo apt install openvpn easy-rsa

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

1[environment second]
2mkdir ~/easy-rsa

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

1[environment second]
2ln -s /usr/share/easy-rsa/* ~/easy-rsa/

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

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

1[environment second]
2sudo chown sammy ~/easy-rsa
3chmod 700 ~/easy-rsa

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

步骤 2 — 创建 OpenVPN 的 PKI

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

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

1[environment second]
2cd ~/easy-rsa
3nano vars

一旦文件被打开,粘贴在以下两行:

1[environment second]
2[label ~/easy-rsa/vars]
3set_var EASYRSA_ALGO "ec"
4set_var EASYRSA_DIGEST "sha512"

这些是你在OpenVPN服务器上需要的vars文件中唯一的两行,因为它不会被用作证书授权机构,它们将确保你的私钥和证书请求配置为使用现代的Eliptic Curve Cryptography(ECC)来生成密钥和安全的签名为您的客户端和OpenVPN服务器。

将您的 OpenVPN 和 CA 服务器配置为使用 ECC 意味着当客户端和服务器尝试建立一个共享的对称密钥时,他们可以使用 Elliptic Curve 算法进行交换。

<$>[注] **背景:**当客户端连接到OpenVPN时,他们使用不对称的加密(也称为公共/私钥)来执行TLS握手(https://www.cloudflare.com/learning/ssl/what-happens-in-a-tls-handshake/).然而,当发送加密VPN流量时,服务器和客户端使用对称的加密,也称为共享密钥加密。

与非对称加密相比,具有对称加密的计算覆盖率要少得多:使用的数字要小得多,而现代CPU 集成执行优化对称加密操作的指示 为了从非对称加密切换到对称加密,OpenVPN服务器和客户端将使用Elliptic Curve Diffie-Hellman(ECDH)算法(https://en.wikipedia.org/wiki/Elliptic_curve_Diffie-Hellman)尽快同意共享的秘密密密钥。

一旦你填充了vars文件,你可以继续创建PKI目录。 要做到这一点,用init-pki选项运行easyrsa脚本. 虽然你已经在CA服务器上运行了这个命令作为前提的一部分,但你必须在这里运行它,因为你的OpenVPN服务器和CA服务器有不同的PKI目录:

1[environment second]
2./easyrsa init-pki

请注意,在您的 OpenVPN 服务器上,无需创建证书授权机构,您的 CA 服务器是唯一负责验证和签署证书的。

在 OpenVPN 服务器上初始化 PKI 后,您已经准备好进入下一步,即创建 OpenVPN 服务器证书请求和私钥。

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

现在你的OpenVPN服务器已经安装了所有先决条件,下一步就是在OpenVPN服务器上生成一个私钥和证书签名请求(CSR)。

要开始,请导航到您的OpenVPN服务器上的~/easy-rsa目录,作为您的非根用户:

1[environment second]
2cd ~/easy-rsa

现在你会用gen-req选项打电话给easyrsa,然后为机器提供一个常用名称(CN)。 CN 可以是你喜欢的任何东西,但可以有助于使它具有描述性。 在本教程中,OpenVPN 服务器的 CN 将是服务器。 请确保包括nopass选项。

<$>[注] 注: 如果您在这里选择了服务器以外的名称,您将不得不调整下面的一些说明。例如,当您将生成的文件复制到/etc/openvpn目录时,您将不得不更换正确的名称。

1[environment second]
2./easyrsa gen-req server nopass
1[environment second]
2[secondary_label Output]
3Common Name (eg: your user, host, or server name) [server]:
4
5Keypair and certificate request completed. Your files are:
6req: /home/sammy/easy-rsa/pki/reqs/server.req
7key: /home/sammy/easy-rsa/pki/private/server.key

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

1[environment second]
2sudo cp /home/sammy/easy-rsa/pki/private/server.key /etc/openvpn/server/

完成这些步骤后,您已成功为您的 OpenVPN 服务器创建了一个私钥,您还为 OpenVPN 服务器生成了一份证书签名请求, CSR 现在已经准备好由您的 CA 签名。

步骤 4 – 签署 OpenVPN 服务器的证书请求

在之前的步骤中,您为OpenVPN服务器创建了证书签名请求(CSR)和私钥,现在CA服务器需要了解服务器证书并验证它。

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

1[environment second]
2scp /home/sammy/easy-rsa/pki/reqs/server.req sammy@your_ca_server_ip:/tmp

如果您遵循了 How To Set Up and Configure a Certificate Authority (CA) on Ubuntu 22.04]教程的先决条件,下一步是登录到 CA服务器作为您创建的非根用户来管理您的CA。

1[environment third]
2cd ~/easy-rsa
3./easyrsa import-req /tmp/server.req server
1[environment third]
2[secondary_label Output]
3. . .
4The request has been successfully imported with a short name of: server
5You may now use this name to perform signing operations on this request.

接下来,通过运行easyrsa脚本来签名请求,然后是sign-req选项,然后是请求类型和常用名称。请求类型可以是客户端服务器

1[environment third]
2./easyrsa sign-req server server

在输出中,您将被要求验证请求来自可信来源. 输入然后按输入来确认:

 1[environment third]
 2[secondary_label Output]
 3You are about to sign the following certificate.
 4Please check over the details shown below for accuracy. Note that this request
 5has not been cryptographically verified. Please be sure it came from a trusted
 6source or that you have verified the request checksum with the sender.
 7
 8Request subject, to be signed as a server certificate for 3650 days:
 9
10subject=
11commonName = server
12
13Type the word 'yes' to continue, or any other input to abort.
14Confirm request details: yes
15. . .
16Certificate created at: /home/sammy/easy-rsa/pki/issued/server.crt

请注意,如果您加密了CA私钥,您将在此时被要求提供密码。

完成这些步骤后,您使用 CA 服务器的私钥签署了 OpenVPN 服务器的证书请求,结果的 server.crt 文件包含 OpenVPN 服务器的公共加密密钥,以及 CA 服务器的签名。

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

1[environment third]
2scp pki/issued/server.crt sammy@your_vpn_server_ip:/tmp
3scp pki/ca.crt sammy@your_vpn_server_ip:/tmp

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

1[environment second]
2sudo cp /tmp/{server.crt,ca.crt} /etc/openvpn/server

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

步骤 5 – 配置 OpenVPN 加密材料

对于额外的安全层,添加一个额外的共享秘密密密钥,服务器和所有客户端将使用 OpenVPN的‘tls-crypt’指令。 此选项被用来掩盖服务器和客户端最初连接时使用的TLS证书。 它也被OpenVPN服务器用来对接入包进行快速检查:如果一个包使用预共享密钥签名,那么服务器会处理它;如果它没有签名,那么服务器知道它来自一个不受信任的来源,并且可以丢弃它,而无需执行额外的解密工作。

此选项将有助于确保您的 OpenVPN 服务器能够应对未经身份验证的流量、端口扫描和拒绝服务攻击,这可能会连接服务器资源。

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

1[environment second]
2cd ~/easy-rsa
3openvpn --genkey --secret ta.key

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

1[environment second]
2sudo cp ta.key /etc/openvpn/server

有了这些文件在OpenVPN服务器上,您可以为用户创建客户端证书和关键文件,您将使用它们连接到VPN。

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

虽然您可以在客户端机器上生成私钥和证书请求,然后将其发送到CA进行签名,但本指南概述了在OpenVPN服务器上生成证书请求的过程。这种方法的好处是您可以创建一个脚本,该脚本将自动生成客户端配置文件,其中包含所有所需的密钥和证书。

您将为本指南生成单个客户端密钥和证书对. 如果您有多个客户端,您可以对每个客户端重复此过程. 请注意,但是,您需要为每个客户端传递一个独特的名称值。

通过在您的主目录中创建一个目录结构来开始存储客户端证书和关键文件:

1[environment second]
2mkdir -p ~/client-configs/keys

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

1[environment second]
2chmod -R 700 ~/client-configs

接下来,返回 EasyRSA 目录并运行easyrsa脚本,使用gen-reqnopass选项,以及客户端的常用名称:

1[environment second]
2cd ~/easy-rsa
3./easyrsa gen-req client1 nopass

然后,将「client1.key」文件复制到您之前创建的 ~/client-configs/keys/ 目录:

1[environment second]
2cp pki/private/client1.key ~/client-configs/keys/

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

1[environment second]
2scp pki/reqs/client1.req sammy@your_ca_server_ip:/tmp

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

1[environment third]
2cd ~/easy-rsa
3./easyrsa import-req /tmp/client1.req client1

接下来,与上一步中的服务器相同的方式签署请求,但这一次,请确保指定客户端请求类型:

1[environment third]
2./easyrsa sign-req client client1

当被提示时,输入来确认您打算签署证书请求,并且它来自可信来源:

1[environment third]
2[secondary_label Output]
3Type the word 'yes' to continue, or any other input to abort.
4Confirm request details: yes

再次,如果您加密了CA密钥,您将被要求在这里提供您的密码。

这将创建一个名为client1.crt的客户端证书文件。

1[environment third]
2scp pki/issued/client1.crt sammy@your_server_ip:/tmp

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

1[environment second]
2cp /tmp/client1.crt ~/client-configs/keys/

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

1[environment second]
2cp ~/easy-rsa/ta.key ~/client-configs/keys/
3sudo cp /etc/openvpn/server/ca.crt ~/client-configs/keys/
4sudo chown sammy.sammy ~/client-configs/keys/*

因此,您的服务器和客户端的证书和密钥都被生成并存储在您的OpenVPN服务器上的适当目录中。

步骤 7 – 配置 OpenVPN

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

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

1[environment second]
2sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf /etc/openvpn/server/

使用nano或您选择的文本编辑器打开新文件进行编辑:

1[environment second]
2sudo nano /etc/openvpn/server/server.conf

您需要在这个文件中更改几行。 首先,通过搜索tls-auth指令来找到配置的HMAC部分。 此行将默认启用。 通过在行开始时添加一个;来评论它。 然后在它之后添加一个新的行,仅包含值的tls-crypt ta.key:

1[environment second]
2[label /etc/openvpn/server/server.conf]
3;tls-auth ta.key 0 # This file is secret
4tls-crypt ta.key

接下来,通过搜索加密线来查找加密的部分。默认值为AES-256-CBC,但是AES-256-GCM加密提供了更好的加密水平,性能,并且在最新的OpenVPN客户端中得到良好的支持。

1[environment second]
2[label /etc/openvpn/server/server.conf]
3;cipher AES-256-CBC
4cipher AES-256-GCM

就在这行之后,添加一个auth指令来选择HMAC消息消化算法,因此,SHA256是一个很好的选择:

1[environment second]
2[label /etc/openvpn/server/server.conf]
3auth SHA256

接下来,找到包含dh指令的行,该行定义了Diffie-Hellman参数。由于您已经配置了所有证书以使用Elliptic Curve Cryptography,所以不需要一个Diffie-Hellman种子文件。评论现有的行,它看起来像dh dh2048.pemdh.pem。Diffie-Hellman密钥的文件名称可能与示例服务器配置文件中列出的不同。然后添加一个后面的行,内容为dh none:

1[environment second]
2[label /etc/openvpn/server/server.conf]
3;dh dh2048.pem
4dh none

接下来,一旦启动,OpenVPN应该没有特权运行,所以你需要告诉它与用户 nobody和组 nogroup一起运行。

1[environment second]
2[label /etc/openvpn/server/server.conf]
3user nobody
4group nogroup

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

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

要开始,请查找并删除含有推送的行,这样做会告诉您的客户端通过您的OpenVPN服务器重定向所有流量。请注意,启用此功能可能会导致与其他网络服务(如SSH)的连接问题:

1[environment second]
2[label /etc/openvpn/server/server.conf]
3push "redirect-gateway def1 bypass-dhcp"

就在这行下面,找到dhcp-option部分. 再次,从两行开始删除;以不评论它们:

1[environment second]
2[label /etc/openvpn/server/server.conf]
3push "dhcp-option DNS 208.67.222.222"
4push "dhcp-option DNS 208.67.220.220"

这些行会告诉您的客户端在列出的 IP 地址上使用免费的 OpenDNS resolvers

这将帮助客户重新配置他们的DNS设置,以便使用VPN隧道作为默认网关。

(可选) 调整端口和协议

默认情况下,OpenVPN服务器使用端口1194和UDP协议来接受客户端连接. 如果您需要使用不同的端口,因为客户端可能存在的限制性网络环境,您可以更改端口选项。

要更改 OpenVPN 以倾听 443 端口,打开 server.conf 文件,然后找到看起来像这样的行:

1[environment second]
2[label /etc/openvpn/server/server.conf]
3port 1194

编辑它以便端口为 443:

1[environment second]
2[label /etc/openvpn/server/server.conf]
3# Optional!
4port 443

如果是这样,请在端口线下找到proto线,并将协议从udp更改为tcp:

1[environment second]
2[label /etc/openvpn/server/server.conf]
3# Optional!
4proto tcp

如果您将协议转换为 TCP,则需要将明确退出通知指令的值从1更改为0,因为该指令仅被 UDP 使用。

查找文件末尾的明确退出通知行,并将值更改为0:

1[environment second]
2[label /etc/openvpn/server/server.conf]
3# Optional!
4explicit-exit-notify 0

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

(可选)指向非默认凭证

如果您早些时候在./easyrsa gen-req server命令中选择了不同的名称,则在server.conf配置文件中修改certkey行,以便它们指向相应的.crt.key文件。

1[environment second]
2[label /etc/openvpn/server/server.conf]
3cert server.crt
4key server.key

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

您现在已经完成了配置您的 OpenVPN 一般设置. 在下一步,您将定制服务器的网络选项。

第8步:调整OpenVPN服务器网络配置

有服务器网络配置的一些方面需要调整,以便OpenVPN能够正确地通过VPN路由流量. 其中第一个是 IP forwarding,用于确定IP流量应该路由的地方的方法. 这对于服务器提供的VPN功能至关重要。

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

1[environment second]
2sudo nano /etc/sysctl.conf

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

1[environment second]
2[label /etc/sysctl.conf]
3net.ipv4.ip_forward = 1

保存并关闭文件,当你完成。

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

1[environment second]
2sudo sysctl -p
1[environment second]
2[secondary_label Output]
3net.ipv4.ip_forward = 1

现在,您的OpenVPN服务器将能够将从一个以太网设备传输的流量传输到另一个以太网设备。此设置确保服务器可以通过其其他物理以太网设备直接从虚拟VPN接口连接的客户端传输流量。

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

第9步:设置防火墙

到目前为止,您已经在您的服务器上安装了 OpenVPN,配置了它,并生成了客户端访问VPN所需的密钥和证书,但您尚未向OpenVPN提供有关从客户端发送入口网络流量的任何说明。

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

在打开防火墙配置文件以添加隐藏规则之前,您必须先找到您的机器的公共网络接口。

1[environment second]
2ip route list default

您的公共界面是该命令输出中所发现的字符串,该字符串跟随dev。例如,此结果显示了名为eth0的界面,该界面如下所示:

1[environment second]
2[secondary_label Output]
3default via 159.65.160.1 dev eth0 proto static

当您有与默认路径相关联的界面时,请打开 /etc/ufw/before.rules 文件以添加相关配置:

1[environment second]
2sudo nano /etc/ufw/before.rules

UFW 规则通常是使用ufw命令添加的。然而,在before.rules文件中列出的规则在通常的 UFW 规则被加载之前被读取并放置在位置上。 向文件的顶部添加下面的突出的行。 这将在nat表中设置POSTROUTING链条的默认策略,并掩盖来自 VPN 的任何流量。 请记住在下面的-A POSTROUTING行中用您在上面的命令中发现的界面替换eth0:

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

保存并关闭文件,当你完成。

接下来,您需要告诉 UFW 默认允许转发的数据包,然后打开 /etc/default/ufw 文件:

1sudo nano /etc/default/ufw

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

1[label /etc/default/ufw]
2DEFAULT_FORWARD_POLICY="ACCEPT"

保存并关闭文件,当你完成。

接下来,调整防火墙本身,以允许流量到OpenVPN. 如果你没有在 /etc/openvpn/server.conf文件中更改端口和协议,你需要打开UDP流量到端口 1194

如果您在遵循前提教程时忘了添加 SSH 端口,请在这里添加它:

1sudo ufw allow 1194/udp
2sudo ufw allow OpenSSH

<$>[注意] 注意:如果您正在使用不同的防火墙或已定制您的UFW配置,您可能需要添加额外的防火墙规则。例如,如果您决定通过VPN连接隧道您的所有网络流量,您需要确保端口 53的流量允许DNS请求,以及对HTTP和HTTPS流量的端口如 80443分别。

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

1sudo ufw disable
2sudo ufw enable

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

第10步:启动OpenVPN

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

1[environment second]
2sudo systemctl -f enable [email protected]

然后启动OpenVPN服务:

1[environment second]
2sudo systemctl start [email protected]

您应该在输出中看到活跃(运行):

1[environment second]
2sudo systemctl status [email protected]
 1[environment second]
 2[secondary_label Output]
 3 openvpn-server@server.service - OpenVPN service for server
 4     Loaded: loaded (/lib/systemd/system/openvpn-server@.service; enabled; vendor preset: enabled)
 5     Active: active (running) since Thu 2022-04-21 17:58:24 UTC; 6s ago
 6       Docs: man:openvpn(8)
 7             https://community.openvpn.net/openvpn/wiki/Openvpn24ManPage
 8             https://community.openvpn.net/openvpn/wiki/HOWTO
 9   Main PID: 144351 (openvpn)
10     Status: "Initialization Sequence Completed"
11      Tasks: 1 (limit: 4665)
12     Memory: 1.8M
13        CPU: 27ms
14     CGroup: /system.slice/system-openvpn\x2dserver.slice/openvpn-server@server.service
15             └─144351 /usr/sbin/openvpn --status /run/openvpn-server/status-server.log --status-version 2 --suppress-timestamps --config server.conf
16
17. . .

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

步骤 11 – 创建客户端配置基础设施

创建 OpenVPN 客户端的配置文件可能有些涉及,因为每个客户端都必须有自己的配置,每个客户端都必须与服务器配置文件中描述的设置相匹配。而不是写一个只能在一个客户端上使用的单个配置文件,此步骤概述了构建一个客户端配置基础设施的过程,您可以使用它来生成配置文件。

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

1[environment second]
2mkdir -p ~/client-configs/files

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

1[environment second]
2cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/client-configs/base.conf

使用nano或您喜爱的文本编辑器打开此新文件:

1[environment second]
2nano ~/client-configs/base.conf

在内部,找到远程指令,指向客户端您的OpenVPN服务器地址 - 您的OpenVPN服务器的公共IP地址. 如果您决定更改OpenVPN服务器正在收听的端口,您还需要更改1194到您选择的端口:

1[environment second]
2[label ~/client-configs/base.conf]
3. . .
4# The hostname/IP and port of the server.
5# You can have multiple remote entries
6# to load balance between the servers.
7remote your_server_ip 1194
8. . .

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

1[environment second]
2[label ~/client-configs/base.conf]
3proto udp

接下来,通过在每个行开始时删除 ; 符号来解析用户指令:

1[environment second]
2[label ~/client-configs/base.conf]
3# Downgrade privileges after initialization (non-Windows only)
4user nobody
5group nogroup

查找设置ca,certkey的指令. 评论这些指令,因为您很快就会在文件本身中添加证件和密钥:

 1[environment second]
 2[label ~/client-configs/base.conf]
 3# SSL/TLS parms.
 4# See the server config file for more
 5# description. It's best to use
 6# a separate .crt/.key file pair
 7# for each client. A single ca
 8# file can be used for all clients.
 9;ca ca.crt
10;cert client.crt
11;key client.key

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

1[environment second]
2[label ~/client-configs/base.conf]
3# If a tls-auth key is used on the server
4# then every client must also have the key.
5;tls-auth ta.key 1

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

1[environment second]
2[label ~/client-configs/base.conf]
3cipher AES-256-GCM
4auth SHA256

接下来,在文件中的某个地方添加钥匙方向指令. 您 必须将此设置为1以便VPN在客户端机器上正常运作:

1[environment second]
2[label ~/client-configs/base.conf]
3key-direction 1

最后,添加几个 评论的行来处理基于Linux的VPN客户端将使用的各种方法来解决DNS。您将添加两组相似但独立的评论的线条。 第一组是用于使用systemd-resolved来管理DNS的客户端。

1[environment second]
2[label ~/client-configs/base.conf]
3; script-security 2
4; up /etc/openvpn/update-resolv-conf
5; down /etc/openvpn/update-resolv-conf

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

1[environment second]
2[label ~/client-configs/base.conf]
3; script-security 2
4; up /etc/openvpn/update-systemd-resolved
5; down /etc/openvpn/update-systemd-resolved
6; down-pre
7; dhcp-option DOMAIN-ROUTE .

保存并关闭文件,当你完成。

在本教程的 第 13 步 - 安装客户端配置步骤中,您将学习如何确定DNS分辨率如何在Linux客户端上工作,以及哪些部分不评论。

接下来,您将创建一个脚本,该脚本将用相关证书、密钥和加密文件来编译您的基础配置,然后将生成的配置放置到 `~/client-configs/files’ 目录中。

1[environment second]
2nano ~/client-configs/make_config.sh

内部,添加以下内容:

 1[environment second]
 2[label ~/client-configs/make_config.sh]
 3#!/bin/bash
 4
 5# First argument: Client identifier
 6
 7KEY_DIR=~/client-configs/keys
 8OUTPUT_DIR=~/client-configs/files
 9BASE_CONFIG=~/client-configs/base.conf
10
11cat ${BASE_CONFIG} \
12    <(echo -e '<ca>') \
13    ${KEY_DIR}/ca.crt \
14    <(echo -e '</ca>\n<cert>') \
15    ${KEY_DIR}/${1}.crt \
16    <(echo -e '</cert>\n<key>') \
17    ${KEY_DIR}/${1}.key \
18    <(echo -e '</key>\n<tls-crypt>') \
19    ${KEY_DIR}/ta.key \
20    <(echo -e '</tls-crypt>') \
21    > ${OUTPUT_DIR}/${1}.ovpn

保存并关闭文件,当你完成。

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

1[environment second]
2chmod 700 ~/client-configs/make_config.sh

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

请注意,每次你添加一个新客户端,你需要为它生成新的密钥和证书,然后你可以运行这个脚本并生成它的配置文件。

步骤 12 – 生成客户端配置

如果您跟随了指南,您在步骤 6 中分别创建了名为client1.crtclient1.key的客户端证书和密钥,您可以通过进入您的~/client-configs目录并运行您在上一步结束时创建的脚本来生成这些身份证件的配置文件:

1[environment second]
2cd ~/client-configs
3./make_config.sh client1

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

1[environment second]
2ls ~/client-configs/files
1[environment second]
2[secondary_label Output]
3client1.ovpn

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

虽然用于实现此转移的确切应用程序将取决于您的设备的操作系统和您的个人偏好,但一个可靠和安全的方法是使用SFTP(SSH文件传输协议)或SCP(安全副本)在后端。

以下是一個例子 SFTP 命令,您可以從本地電腦(macOS 或 Linux)執行。這將將您在最後一步中創建的「client1.ovpn」檔案複製到您的主目錄:

1[environment local]
2sftp sammy@openvpn_server_ip:client-configs/files/client1.ovpn ~/

以下是几个工具和教程来安全地将文件从OpenVPN服务器传输到本地计算机:

步骤 13 – 安装客户端配置

本节涵盖了如何在 Windows、macOS、Linux、iOS 和 Android 上安装客户端 VPN 配置文件. 这些客户端指令并不相互依赖,因此请轻松跳过适用于您的设备的任何内容。

对于本教程,这意味着连接被命名为client1.ovpn,与您生成的第一个客户端文件一致。

窗口

  • 安装 *

請從 OpenVPN 的下載頁面下載 Windows 的 OpenVPN 客戶端應用程式。

<$>[注意] 注意:OpenVPN需要管理权限来安装。

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

1[environment local]
2C:\Program Files\OpenVPN\config

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

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

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

  • 连接 *

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

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

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

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

马克思

  • 安装 *

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

安装过程结束时,Tunnelblick 会问你是否有任何配置文件。 回答 我有配置文件,然后让Tunnelblick 完成。 打开 Finder 窗口并双击client1.ovpn

  • 连接 *

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

Linux 的

  • 安装 *

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

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

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

1[environment local]
2sudo apt update
3sudo apt install openvpn

在CentOS上,您可以启用EPEL存储库,然后通过键入来安装它:

1[environment local]
2sudo dnf install epel-release
3sudo dnf install openvpn

配置使用systemd-resolved的客户端

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

1[environment local]
2cat /etc/resolv.conf
1[secondary_label Output]
2[environment local]
3# This file is managed by man:systemd-resolved(8). Do not edit.
4. . .
5
6nameserver 127.0.0.53
7options edns0

如果您的系统配置为使用systemd-resolved用于 DNS 解析,那么在nameserver选项之后的 IP 地址将是127.0.0.53。在文件中也应该有评论,如显示的输出,说明systemd-resolved是如何管理该文件的。

要支持这些客户端,先安装openvpn-systemd-resolved包,它提供将systemd-resolved强迫使用VPN服务器进行DNS解决的脚本。

1[environment local]
2sudo apt install openvpn-systemd-resolved

安装该套件,配置客户端使用它,并通过VPN接口发送所有DNS查询。

1[environment local]
2nano client1.ovpn

现在不评论您之前添加的以下行:

1[label client1.ovpn]
2[environment local]
3script-security 2
4up /etc/openvpn/update-systemd-resolved
5down /etc/openvpn/update-systemd-resolved
6down-pre
7dhcp-option DOMAIN-ROUTE .

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

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

1[environment local]
2ls /etc/openvpn
1[secondary_label Output]
2[environment local]
3update-resolv-conf

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

1[environment local]
2nano client1.ovpn

删除您添加的三个行以调整 DNS 设置:

1[label client1.ovpn]
2[environment local]
3script-security 2
4up /etc/openvpn/update-resolv-conf
5down /etc/openvpn/update-resolv-conf

如果您正在使用 CentOS,请将指令从nogroup更改为nobody,以匹配分布的可用组:

1[label client1.ovpn]
2[environment local]
3group nobody

保存并关闭文件。

  • 连接 *

现在,您可以通过指向客户端配置文件的openvpn命令连接到VPN:

1[environment local]
2sudo openvpn --config client1.ovpn

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

<$>[注] 注: 如果您的客户端使用systemd-resolved来管理DNS,请通过执行systemd-resolve --status命令来检查设置是否正确应用:

1[environment local]
2systemd-resolve --status tun0

你应该看到的输出如下:

1[secondary_label Output]
2[environment local]
3Link 22 (tun0)
4. . .
5         DNS Servers: 208.67.222.222
6                      208.67.220.220
7          DNS Domain: ~.

如果您在输出中看到您在 OpenVPN 服务器上配置的 DNS 服务器的 IP 地址,以及对 DNS Domain~. 设置,那么您已正确配置您的客户端以使用 VPN 服务器的 DNS 解决方案。

  • 安装 *

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

The process of completing the transfer with iTunes is outlined here. Open iTunes on the computer and click on iPhone > apps. Scroll down to the bottom to the File Sharing section and click the OpenVPN app. The blank window to the right, OpenVPN Documents, is for sharing files. Drag the .ovpn file to the OpenVPN Documents window. iTunes showing the VPN profile ready to load on the iPhone

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

The OpenVPN iOS app showing new profile ready to import Connecting

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

然后导航到保存的配置文件的位置(屏幕截图使用 /storage/emulated/0/openvpn)并选择您的 .ovpn 文件。

The OpenVPN Android app selecting VPN profile to import

连接 一旦添加了个人资料,你会看到这样的屏幕:

The OpenVPN Android app with new profile added

To connect, tap the toggle button close to the profile you want to use. You'll see real time stats of your connection and traffic being routed through your OpenVPN server: The OpenVPN Android app connected to the VPN

要切断连接,只需再次点击左上角的切换按钮,您将被要求确认您想要切断连接到您的VPN。

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

<$>[注] **注:**此方法来测试您的VPN连接只会有效,如果您在编辑OpenVPN的server.conf文件时选择在第7步中通过VPN路由所有流量。

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

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

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

步骤 15 – 撤销客户证书

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

要做到这一点,请遵循如何在 Ubuntu 22.04 上设置和配置证书授权(https://andsky.com/tech/tutorials/how-to-set-up-and-configure-a-certificate-authority-on-ubuntu-22-04#optional-%E2%80%94-revoking-a-certificate)上的前提教程中的示例,请参阅 Revoking a Certificate 部分。

一旦您使用这些指示撤销了客户端的证书,您将需要将生成的crl.pem文件复制到您的OpenVPN服务器中在/etc/openvpn/server目录:

1[environment second]
2sudo cp /tmp/crl.pem /etc/openvpn/server/

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

1[environment second]
2sudo nano /etc/openvpn/server/server.conf

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

1[environment second]
2[label /etc/openvpn/server/server.conf]
3crl-verify crl.pem

保存并关闭文件。

最后,重新启动 OpenVPN 来执行证书撤销:

1[environment second]
2sudo systemctl restart [email protected]

客户端不再能够使用旧身份证成功连接到服务器。

若要取消额外的客户,请遵循此过程:

  1. ./easyrsa revoke client_name 命令 取消证书 2. 生成新的 CRL
  2. 将新的 crl.pem 文件传输到您的 OpenVPN 服务器,并将其复制到 /etc/openvpn/server/ 目录,以重写旧列表。
  3. 重新启动 OpenVPN 服务。

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

结论

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

您可以采取若干步骤来进一步定制 OpenVPN 安装,例如配置客户端自动连接到 VPN 或配置客户端特定的规则和访问策略。

要配置更多的客户端,您只需按照步骤 611-13对每个额外的设备进行配置。

Published At
Categories with 技术
comments powered by Disqus