如何在 Ubuntu 20.04 上设置 OpenVPN 服务器如何在 Ubuntu 20.04 上设置 OpenVPN 服务器如何在 Ubuntu 20.04 上设置 OpenVPN 服务器如何在 Ubuntu 20.04 上设置 OpenVPN 服务器
  • 业务
  • 目标
  • 支持
  • 登录
找到的结果: {phrase} (显示: {results_count} 共: {results_count_total})
显示: {results_count} 共: {results_count_total}

加载更多搜索结果...

搜索范围
模糊匹配
搜索标题
搜索内容

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

发表 admin at 2025年2月28日
类别
  • 未分类
标签
コアサーバーV2プランご契約でドメイン更新費用が永久無料

Ubuntu 20.04 Focal Fossa 是最常用的 Linux 发行版之一的最后一个长期支持。在本教程中,我们将了解如何使用此操作系统创建 OpenVPN 服务器以及如何创建用于从客户端计算机连接到该服务器的 .ovpn 文件。

在本教程中您将学习:

  • 如何生成证书颁发机构

  • 如何生成服务器和客户端证书和密钥

  • 如何与证书颁发机构签署证书

  • 如何创建 Diffie-Hellman 参数

  • 如何生成 tls-auth 密钥

  • 如何配置 OpenVPN 服务器

  • 如何生成 .ovpn 文件以连接到 VPN

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

场景设置

在继续进行实际的 VPN 配置之前,我们先讨论一下本教程中将采用的约定和设置。

我们将使用两台机器,均由 Ubuntu 20.04 Focal Fossa 驱动。第一个,camachine 将用于托管我们的证书颁发机构;第二个 openvpnmachine 将是我们将设置为实际 VPN 服务器的服务器。可以将同一台机器用于这两个目的,但它的安全性会降低,因为破坏服务器的人可以“冒充”证书颁发机构,并使用它来签署不需要的证书(只有当您计划拥有多于一台服务器或者您计划将同一个 CA 用于其他目的)。要在一台机器和另一台机器之间移动文件,我们将使用 scp (安全复制)命令。我们将执行的 10 个主要步骤如下:

  1. 证书颁发机构的生成;

  2. 生成服务器密钥和证书请求;

  3. 与 CA 签署服务器证书请求;

  4. 在服务器上生成 Diffie-Hellman 参数;

  5. 在服务器上生成 tls-auth 密钥;

  6. OpenVPN配置;

  7. 服务器上的网络和防火墙(ufw)配置;

  8. 生成客户端密钥和证书请求;

  9. 与CA签署客户端证书;

  10. 创建用于连接到 VPN 的客户端 .ovpn 文件。

第 1 步 – 生成证书颁发机构 (CA)

我们旅程的第一步是在专用机器上创建证书颁发机构。我们将以非特权用户的身份生成所需的文件。在开始之前,我们需要安装 easy-rsa 软件包:

$ sudo apt-get update && sudo apt-get -y install easy-rsa

安装软件包后,我们可以使用 make-cadir 命令生成一个包含所需工具和配置文件的目录,在本例中我们将其称为 certificate_authority。创建后,我们将移入其中:

$ make-cadir certificate_authority && cd certificate_authority

在该目录中,我们将找到一个名为 vars 的文件。在该文件中,我们可以定义一些将用于证书生成的变量。这些变量的注释集可以在 91 到 96 行找到。只需删除注释并分配适当的值:

set_var EASYRSA_REQ_COUNTRY    "US"
set_var EASYRSA_REQ_PROVINCE   "California"
set_var EASYRSA_REQ_CITY       "San Francisco"
set_var EASYRSA_REQ_ORG        "Copyleft Certificate Co"
set_var EASYRSA_REQ_EMAIL      "me@example.net"
set_var EASYRSA_REQ_OU         "My Organizational Unit"

保存更改后,我们可以继续生成 PKI(公钥基础设施),使用以下命令将创建一个名为 pki 的目录:

$ ./easyrsa init-pki

基础设施到位后,我们可以生成 CA 密钥和证书。启动以下命令后,系统将要求我们输入 ca 密钥的密码。每次与当局交互时,我们都需要提供相同的密码。还应提供证书的通用名称。这可以是任意值;如果我们在提示符下按 Enter 键,将使用默认值,在本例中为 Easy-RSA CA:

$ ./easyrsa build-ca

这是命令的输出:

Note: using Easy-RSA configuration from: ./vars

Using SSL: openssl OpenSSL 1.1.1d  10 Sep 2019

Enter New CA Key Passphrase:
Re-Enter New CA Key Passphrase:
Generating RSA private key, 2048 bit long modulus (2 primes)
..........+++++
....................................................................+++++
e is 65537 (0x010001)
Can't load /home/egdoc/certificate_authority/pki/.rnd into RNG
140296362980608:error:2406F079:random number generator:RAND_load_file:Cannot open file:../crypto/rand/randfile.c:98:Filename=/home/egdoc/certificate_authority/pki/.rnd
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:

CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/home/egdoc/certificate_authority/pki/ca.crt

build-ca 命令生成了两个文件;他们相对于我们工作目录的路径是:

  • pki/ca.crt

  • pki/private/ca.key

第一个是公共证书,第二个是将用于签署服务器和客户端证书的密钥,因此应尽可能安全。

在我们继续之前,请注意一点:在命令的输出中,您可能已经注意到一条错误消息。尽管该错误不是严重的,但避免该错误的解决方法是注释生成的工作目录内的 openssl-easyrsa.cnf 文件的第三行。该问题在 openssl github 存储库上进行了讨论。修改后,文件应如下所示:

# For use with Easy-RSA 3.1 and OpenSSL or LibreSSL

RANDFILE                = $ENV::EASYRSA_PKI/.rnd

也就是说,让我们继续将用作 OpenVPN 服务器的机器并生成服务器密钥和证书。

第 2 步 – 生成服务器密钥和证书请求

在此步骤中,我们将生成服务器密钥和由证书颁发机构签名的证书请求。在我们将用作 OpenVPN 服务器的计算机上,我们必须安装 openvpn、easy-rsa 和 ufw 软件包:

$ sudo apt-get update && sudo apt-get -y install openvpn easy-rsa ufw

为了生成服务器密钥和证书请求,我们执行与托管证书颁发机构的计算机上使用的相同过程:

  1. 我们使用 make-cadir 命令生成一个工作目录,并移入其中。

  2. 设置 vars 文件中包含的将用于证书的变量。

  3. 使用 ./easyrsa init-pki 命令生成公钥基础设施。

经过这些初步步骤后,我们可以发出命令来生成服务器证书和密钥文件:

$ ./easyrsa gen-req server nopass

这次,由于我们使用了nopass选项,因此在生成服务器密钥期间不会提示我们插入密码。我们仍会被要求输入服务器证书的通用名称。在这种情况下,使用的默认值是server。这就是我们将在本教程中使用的内容:

Note: using Easy-RSA configuration from: ./vars

Using SSL: openssl OpenSSL 1.1.1d  10 Sep 2019

Generating a RSA private key
....................+++++
.................+++++
writing new private key to '/home/egdoc/openvpnserver/pki/private/server.key.9rU3WfZMbW'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Common Name (eg: your user, host, or server name) [server]:

Keypair and certificate request completed. Your files are:
req: /home/egdoc/openvpnserver/pki/reqs/server.req
key: /home/egdoc/openvpnserver/pki/private/server.key

将生成证书签名请求和私钥:

    /home/egdoc/openvpnserver/pki/reqs/server.req
  • /home/egdoc/openvpnserver/pki/private/server.key。

密钥文件必须移动到 /etc/openvpn 目录中:

$ sudo mv pki/private/server.key /etc/openvpn

相反,证书请求必须发送到证书颁发机构计算机以进行签名。我们可以使用 scp 命令来传输文件:

$ scp pki/reqs/server.req egdoc@camachine:/home/egdoc/

让我们回到 camachine 并授权证书。

步骤 3 – 使用 CA 签署服务器证书

在证书颁发机构计算机上,我们应该在用户的 $HOME 目录中找到我们在上一步中复制的文件:

$ ls ~
certificate_authority  server.req

我们要做的第一件事是导入证书请求。为了完成该任务,我们使用 easyrsa 脚本的 import-req 操作。其语法如下:

import-req <request_file_path> <short_basename>

在我们的例子中,这意味着:

$ ./easyrsa import-req ~/server.req server

该命令将生成以下输出:

Note: using Easy-RSA configuration from: ./vars

Using SSL: openssl OpenSSL 1.1.1d  10 Sep 2019

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.

为了签署请求,我们使用 sing-req 操作,该操作将请求的类型作为第一个参数(在本例中为服务器),以及我们使用的 short_basename在上一个命令(服务器)中。我们跑:

$ ./easyrsa sign-req server server

我们将被要求确认我们想要签署证书并提供我们用于证书颁发机构密钥的密码。如果一切按预期进行,将创建证书:

Note: using Easy-RSA configuration from: ./vars

Using SSL: openssl OpenSSL 1.1.1d  10 Sep 2019


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 1080 days:

subject=
    commonName                = server


Type the word 'yes' to continue, or any other input to abort.
  Confirm request details: yes
Using configuration from /home/egdoc/certificate_authority/pki/safessl-easyrsa.cnf
Enter pass phrase for /home/egdoc/certificate_authority/pki/private/ca.key:
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName            :ASN.1 12:'server'
Certificate is to be certified until Mar 20 02:12:08 2023 GMT (1080 days)

Write out database with 1 new entries
Data Base Updated

Certificate created at: /home/egdoc/certificate_authority/pki/issued/server.crt

现在,我们可以删除之前从 openvpnmachine 传输的请求文件。并将生成的证书与 CA 公共证书一起复制回我们的 OpenVPN 服务器:

$ rm ~/server.req
$ scp pki/{ca.crt,issued/server.crt} egdoc@openvpnmachine:/home/egdoc

回到 openvpnmachine ,我们应该在主目录中找到这些文件。我们现在可以将它们移动到 /etc/openvpn:

$ sudo mv ~/{ca.crt,server.crt} /etc/openvpn

步骤 4 – Diffie-Hellman 参数生成

下一步是生成Diffie-Hellman参数。 Diffie-Hellman 密钥交换是用于通过公共、不安全的通道传输加密密钥的方法。生成密钥的命令如下(可能需要一段时间才能完成):

$ ./easyrsa gen-dh

密钥将在 pki 目录中生成为 dh.pem。让我们将其移动到 /etc/openvpn 作为 dh2048.pem:

$ sudo mv pki/dh.pem /etc/openvpn/dh2048.pem

步骤 5 – 生成 tls-auth 密钥 (ta.key)

为了提高安全性,OpenVPN 实现了 tls-auth。引用官方文档:

tls-auth 指令向所有 SSL/TLS 握手数据包添加额外的 HMAC 签名以进行完整性验证。任何不带有正确 HMAC 签名的 UDP 数据包都可以被丢弃,无需进一步处理。 tls-auth HMAC 签名提供了比 SSL/TLS 提供的更高级别的安全性。它可以防止: – OpenVPN UDP 端口上的 DoS 攻击或端口泛洪。 – 端口扫描以确定哪些服务器 UDP 端口处于侦听状态。 – SSL/TLS 实现中的缓冲区溢出漏洞。 – 来自未经授权的机器的 SSL/TLS 握手启动(虽然此类握手最终将无法进行身份验证,但 tls-auth 可以在更早的时间点将其切断)。

要生成 tls_auth 密钥,我们可以运行以下命令:

$ openvpn --genkey --secret ta.key

生成后,我们将 ta.key 文件移动到 /etc/openvpn:

$ sudo mv ta.key /etc/openvpn

我们的服务器密钥设置现已完成。我们可以继续进行实际的服务器配置。

第 6 步 – OpenVPN 配置

默认情况下,/etc/openvpn 中不存在 OpenVPN 配置文件。为了生成它,我们使用 openvpn 包附带的模板。让我们运行这个命令:

$ zcat \
  /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz \
  | sudo tee /etc/openvpn/server.conf > /dev/null

我们现在可以编辑 /etc/openvpn/server.conf 文件。相关部分如下所示。我们要做的第一件事是验证引用的密钥和证书的名称是否与我们生成的相对应。如果您遵循了本教程,那么情况肯定是这样的(78-80 和 85 行):

ca ca.crt
cert server.crt
key server.key  # This file should be kept secret
dh dh2048.pem

我们想让 OpenVPN 守护进程以低权限运行,即 nobody 用户和 nogroup 组。配置文件的相关部分位于 274 和 275 行。我们只需要删除开头的 ;:

user nobody
group nogroup

我们要删除注释的另一行是 192。这将导致所有客户端通过 VPN 重定向其默认网关:

push "redirect-gateway def1 bypass-dhcp"

200 和 201 行也可用于启用服务器将特定 DNS 服务器推送给客户端。配置文件中的内容是opendns.com提供的:

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

此时 /etc/openvpn 目录应包含我们生成的这些文件:

/etc/openvpn
├── ca.crt
├── dh2048.pem
├── server.conf
├── server.crt
├── server.key
└── ta.key

让我们确保它们都归 root 所有:

$ sudo chown -R root:root /etc/openvpn

我们可以继续下一步:配置网络选项。

第 7 步 – 设置网络和 ufw

为了使我们的 VPN 正常工作,我们需要在我们的服务器上启用IP 转发。为此,我们只需从 /etc/sysctl.conf 文件中取消注释行 28 即可:

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

要重新加载设置:

$ sudo sysctl -p

我们还需要允许数据包在 ufw 防火墙中转发,修改 /etc/default/ufw 文件,并将 DEFAULT_FORWARD_POLICY 从 DROP 更改为 <代码>接受(第19行):

# Set the default forward policy to ACCEPT, DROP or REJECT.  Please note that
# if you change this you will most likely want to adjust your rules
DEFAULT_FORWARD_POLICY="ACCEPT"

我们现在需要将以下规则添加到 /etc/ufw/before.rules 文件的开头。这里我们假设用于连接的接口是 eth0:

*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.8.0.0/8 -o eth0 -j MASQUERADE
COMMIT

最后,我们必须在 ufw 防火墙管理器中允许 openvpn 服务的传入流量:

$ sudo ufw allow openvpn

此时我们可以重新启动 ufw 以使更改生效。如果此时您的防火墙尚未启用,请确保始终允许 ssh 服务,否则如果您正在远程工作,您可能会被排除在外。

$ sudo ufw disable && sudo ufw enable

我们现在可以在启动时启动并启用 openvpn.service:

$ sudo systemctl restart openvpn && sudo systemctl enable openvpn

步骤 8 – 生成客户端密钥和证书请求

我们的服务器设置现已完成。下一步包括生成客户端密钥和证书请求。该过程与我们用于服务器的过程相同:我们只是使用“client”作为名称而不是“sever”,生成密钥和证书请求,然后将后者传递到 CA 机器进行签名。

$ ./easyrsa gen-req client nopass

和以前一样,我们将被要求输入一个通用名称。将生成以下文件:

  • /home/egdoc/openvpnserver/pki/reqs/client.req

  • /home/egdoc/openvpnserver/pki/private/client.key

让我们将 client.req 复制到 CA 计算机:

$ scp pki/reqs/client.req egdoc@camachine:/home/egdoc

复制文件后,我们在 camachine 上导入请求:

$ ./easyrsa import-req ~/client.req client

然后,我们签署证书:

$ ./easyrsa sign-req client client

输入 CA 密码后,证书将创建为 pki/issued/client.crt。让我们删除请求文件并将签名的证书复制回 VPN 服务器:

$ rm ~/client.req
$ scp pki/issued/client.crt egdoc@openvpnmachine:/home/egdoc

为了方便起见,我们创建一个目录来保存所有客户端相关的内容,并将客户端密钥和证书移到其中:

$ mkdir ~/client
$ mv ~/client.crt pki/private/client.key ~/client

很好,我们快到了。现在,我们必须将客户端配置模板 /usr/share/doc/openvpn/examples/sample-config-files/client.conf 复制到 ~/client 中目录并修改它以满足我们的需要:

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

这是我们需要在文件中更改的行。在 42 行,将实际的服务器 IP 或主机名替换为 my-server-1:

remote my-server-1 1194

在 61 和 62 行中,删除前导 ; 字符以在初始化后降级权限:

user nobody
group nogroup

在第 88 到 90 和 108 行中,我们可以看到引用了 CA 证书、客户端证书、客户端密钥和 tls-auth 密钥。我们想要注释这些行,因为我们将把文件的实际内容放在一对专用“标签”之间:

  • 用于 CA 证书

  • 用于客户端证书

  • 为客户端密钥

  • 用于 tls-auth 密钥

注释完这些行后,我们将以下内容附加到文件底部:

<ca>
# Here goes the content of the ca.crt file
</ca>

<cert>
# Here goes the content of the client.crt file
</cert>

<key>
# Here goes the content of the client.key file
</key>

key-direction 1
<tls-auth>
# Here goes the content of the ta.key file
</tls-auth>

完成文件编辑后,我们将其重命名为 .ovpn 后缀:

$ mv ~/client/client.conf ~/client/client.ovpn

剩下要做的就是将文件导入到我们的客户端应用程序中,以使其连接到我们的 VPN。例如,如果我们使用 GNOME 桌面环境,我们可以从控制面板的网络部分导入文件。在 VPN 部分中,只需单击 + 按钮,然后单击“从文件导入”以选择并导入您之前传输到客户端计算机的“.ovpn”文件。

用于导入 .ovpn 文件的 GNOME 界面

结论

在本教程中,我们了解了如何创建有效的 OpenVPN 设置。我们生成了一个证书颁发机构,并用于对我们生成的服务器和客户端证书以及相应的密钥进行签名。我们了解了如何配置服务器以及如何设置网络、允许数据包转发以及对 ufw 防火墙配置进行所需的修改。最后,我们了解了如何生成客户端 .ovpn 文件,该文件可以从客户端应用程序导入,以便轻松连接到我们的 VPN。享受!

©2015-2025 Norria support@alaica.com