Skip to content

OpenVPN

步骤1 -安装OpenVPN和Easy-RSA

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

首先,更新OpenVPN服务器的软件包索引并安装OpenVPN和Easy-RSA。这两个包都可以在Ubuntu的默认仓库中找到,所以你可以使用apt来安装:

sh
$ sudo apt update
$ sudo apt install openvpn easy-rsa

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

sh
$ mkdir ~/easy-rsa

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

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

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

步骤2 -为OpenVPN创建PKI(公钥基础设施)

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

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

sh
$ cd ~/easy-rsa
$ nano vars

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

conf
set_var EASYRSA_ALGO "ec"
set_var EASYRSA_DIGEST "sha512"

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

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

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

sh
$ ./easyrsa init-pki

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

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

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

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

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

sh
$ cd ~/easy-rsa

现在,您将使用easyrsa选项调用gen-req,后跟计算机的通用名称(CN)。CN可以是你喜欢的任何东西,但它可以是有帮助的,使它成为描述性的东西。在本教程中,OpenVPN服务器的CN将是server。请确保包含nopass选项。如果不这样做,将对请求文件进行密码保护,这可能会导致以后的权限问题。

sh
$ ./easyrsa gen-req server nopass
...
Common Name (eg: your user, host, or server name) [server]:

Keypair and certificate request completed. Your files are:
req: /root/easy-rsa/pki/reqs/server.req
key: /root/easy-rsa/pki/private/server.key

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

sh
$ sudo cp /root/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服务器进行签名:

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

如果您遵循了如何在Ubuntu 22.04上设置和配置证书颁发机构(CA)的先决条件教程,下一步是以您创建的用于管理CA的非root用户身份登录CA服务器。您将cd转到创建PK的~/easy-rsa目录,然后使用easyrsa脚本导入证书请求:

sh
$ cd ~/easy-rsa
$ ./easyrsa import-req /root/easy-rsa/pki/reqs/server.req server

本机作为CA服务器

要为证书颁发机构创建根公钥和私钥对,请再次运行./easy-rsa命令,这次使用build-ca选项:

sh
$ cd ~/easy-rsa
$ ./easyrsa build-ca
...
Enter New CA Key Passphrase:
Re-Enter New CA Key Passphrase:
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:
/root/easy-rsa/pki/ca.crt

在输出中,您将看到一些关于OpenSSL版本的行,并将提示您输入密钥对的密码。一定要选择一个强有力的密码,并把它记在安全的地方。您需要在任何时候与CA交互时输入密码,例如签署或撤销证书。

系统还将要求您确认CA的通用名称(CN)。CN是用于在证书颁发机构的上下文中引用此计算机的名称。您可以为CA的公用名称输入任何字符串,但为简单起见,请按ENTER键接受默认名称。

注意事项:如果您不希望每次与CA交互时都提示您输入密码,则可以运行带有build-ca选项的nopass命令,如下所示:

sh
$ ./easyrsa build-ca nopass

您现在有两个重要的文件- ~/easy-rsa/pki/ca.crt~/easy-rsa/pki/private/ca.key -它们构成了证书颁发机构的公共和私有组件。

  • ca.crt是CA的公共证书文件。用户、服务器和客户端将使用此证书来验证它们是否属于同一信任网络。使用CA的每个用户和服务器都需要拥有此文件的副本。所有各方都将依赖公共证书来确保不会有人冒充系统并执行中间人攻击。

  • ca.key是CA用于为服务器和客户端签署证书的私钥。如果攻击者获得了对您的CA以及您的ca.key文件的访问权限,您将需要销毁您的CA。这就是为什么你的ca.key文件应该只在你的CA机器上,理想情况下,你的CA机器应该保持离线时,不签署证书请求作为一个额外的安全措施。

这样,您的CA就就位了,可以用来签署证书请求和撤销证书。

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

sh
$ ./easyrsa sign-req server server

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

sh
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: /root/easy-rsa/pki/issued/server.crt

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

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

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

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

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

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

本机作为CA服务器

server.crtca.crt文件复制到/etc/openvpn/server

sh
$ cp /root/easy-rsa/pki/issued/server.crt /etc/openvpn/server
$ cp /root/easy-rsa/pki/ca.crt /etc/openvpn/server

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

步骤5 -配置OpenVPN加密材料

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

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

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

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

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

sh
$ sudo cp ta.key /etc/openvpn/server

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

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

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

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

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

sh
$ mkdir -p ~/client-configs/keys

接下来,导航回EasyRSA目录,并运行带有easyrsagen-req选项的nopass脚本,沿着客户端的通用名称:

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

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

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

接下来,以与上一步中对服务器所做的相同方式对请求进行签名。不过,这一次请确保指定client请求类型:

sh
$ ./easyrsa sign-req client client1

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

这将创建一个名为client1.crt的客户端证书文件。将客户端证书复制到~/client-configs/keys/目录:

sh
$ cp pki/issued/client1.crt ~/client-configs/keys/

接下来,将ca.crtta.key文件也复制到~/client-configs/keys/目录:

sh
$ cp ~/easy-rsa/ta.key ~/client-configs/keys/
$ cp /etc/openvpn/server/ca.crt ~/client-configs/keys/

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

步骤7 -配置OpenVPN

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

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

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

找不到示例server.conf文件的解决方法

server.conf

复制到/etc/openvpn/server/目录下。

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

sh
$ sudo nano /etc/openvpn/server/server.conf

您需要更改此文件中的几行。首先,通过搜索HMAC指令找到配置的tls-auth部分。默认情况下将启用此行。通过在行首添加;来注释它。然后在它后面添加一个新行,只包含值tls-crypt ta.key

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值:

conf
;cipher AES-256-CBC
cipher AES-256-GCM

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

conf
auth SHA256

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

conf
;dh dh2048.pem
dh none

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

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

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

conf
push "redirect-gateway def1 bypass-dhcp"

就在这条线下面,找到dhcp-option部分。同样,删除两行开头的;以取消注释:

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文件并编辑port行,使端口为443:

conf
port 443

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

conf
proto tcp

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

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

conf
explicit-exit-notify 0

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

(可选)指向非默认凭据

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

conf
cert server.crt
key server.key

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

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

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

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

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

sh
$ sudo nano /etc/sysctl.conf

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

conf
net.ipv4.ip_forward = 1

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

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

sh
$ sudo sysctl -p

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

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

步骤9 -防火墙配置

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

假设您遵循了本教程开始时的先决条件,您应该已经在服务器上安装并运行了ufw。

sh
$ sudo apt update
$ sudo apt install ufw -y
$ sudo ufw status
$ sudo ufw enable
$ sudo ufw allow 80
$ sudo ufw app list
$ sudo systemctl enable ufw
$ sudo systemctl restart ufw
$ sudo systemctl status ufw

要允许OpenVPN通过防火墙,您需要启用伪装,这是一个iptables概念,提供动态网络地址转换(NAT)以正确路由客户端连接。

在打开防火墙配置文件以添加伪装规则之前,必须首先找到计算机的公共网络接口。要执行此操作,请键入:

sh
$ ip route list default

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

conf
Output
default via 159.65.160.1 dev eth0 proto static

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

sh
$ sudo nano /etc/ufw/before.rules

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

conf
#
# rules.before
#
# Rules that should be run before the ufw command line added rules. Custom
# rules should be added to one of these chains:
#   ufw-before-input
#   ufw-before-output
#   ufw-before-forward
#
 
# START OPENVPN RULES
# NAT table rules
*nat
:POSTROUTING ACCEPT [0:0]
# Allow traffic from OpenVPN client to eth0 (change to the interface you discovered!)
-A POSTROUTING -s 10.8.0.0/8 -o eth0 -j MASQUERADE
COMMIT
# END OPENVPN RULES
 
# Don't delete these required lines, otherwise there will be errors
*filter
. . .

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

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

sh
$ sudo nano /etc/default/ufw

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

conf
DEFAULT_FORWARD_POLICY="ACCEPT"

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

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

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

sh
$ sudo ufw allow 443/tcp
$ sudo ufw allow OpenSSH

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

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

sh
$ sudo ufw disable
$ sudo ufw enable

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

步骤10 -启动OpenVPN

OpenVPN作为systemd服务运行,因此您可以使用systemctl来管理它。您将配置OpenVPN在靴子时启动,以便只要您的服务器正在运行,您就可以随时连接到VPN。要做到这一点,通过将其添加到systemctl来启用OpenVPN服务:

sh
$ sudo systemctl -f enable [email protected]

然后启动OpenVPN服务:

sh
$ sudo systemctl start [email protected]

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

sh
$ sudo systemctl status [email protected]

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

步骤11 -创建客户端配置基础结构

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

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

sh
$ mkdir -p ~/client-configs/files

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

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

找不到示例client.conf文件的解决方法

client.conf

复制到~/client-configs/目录下并重命名为base.conf

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

sh
$ nano ~/client-configs/base.conf

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

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
. . .

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

conf
proto udp

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

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):

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

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

conf
cipher AES-256-GCM
auth SHA256

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

conf
key-direction 1

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

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

sh
$ nano ~/client-configs/make_config.sh

在内部,添加以下内容:

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}/${1}.crt \
    <(echo -e '</cert>\n<key>') \
    ${KEY_DIR}/${1}.key \
    <(echo -e '</key>\n<tls-crypt>') \
    ${KEY_DIR}/ta.key \
    <(echo -e '</tls-crypt>') \
    > ${OUTPUT_DIR}/${1}.ovpn

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

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

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

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

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

步骤12 -生成客户端配置文件

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

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

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

sh
$ ls ~/client-configs/files
client1.ovpn

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

Released under the MIT License.