类别:Linux / 日期:2021-03-10 / 浏览:164 / 评论:0

第1步-安装OpenVPN和Easy-RSA

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

但是,CentOS 8默认不提供OpenVPN和Easy-RSA,因此您将需要启用企业Linux附加软件包(EPEL)存储库。EPEL由Fedora项目管理,包含用于Fedora,CentOS和其他使用RPM软件包格式的Linux发行版的非标准但流行的软件包。以您在初始设置步骤中创建的非root sudo用户身份登录到OpenVPN Server,然后运行以下命令:

sudo dnf install epel-releasesudo dnf install openvpn easy-rsa
 

接下来,您将需要以非root用户身份在OpenVPN Server上创建一个新目录~/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-rsachmod 700 ~/easy-rsa
 

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

第2步-为OpenVPN创建PKI

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

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

CentOS 8随附的默认文本编辑器是vivi是一个功能非常强大的文本编辑器,但对于缺乏使用经验的用户而言,它可能会有些迟钝。您可能需要安装更加用户友好的编辑器,例如nano以便于在CentOS 8服务器上编辑配置文件:

sudo dnf install nano
 

当提示您安装时nano,请输入y以继续安装步骤。现在您可以编辑vars文件了:

cd ~/easy-rsanano vars
 

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

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

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

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

背景:客户端连接到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 Server上的目录:

cd ~/easy-rsa
 

现在,您将调用easyrsa带有gen-req选项的,后跟机器的通用名称(CN)。CN可以是您喜欢的任何东西,但使其具有描述性可能会有所帮助。在本教程中,OpenVPN Server的CN将为server确保也包括该nopass选项。否则,将对请求文件进行密码保护,这可能会在以后导致权限问题。

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

./easyrsa gen-req server nopass
 
OutputCommon 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.reqkey: /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创建PKI目录的非root用户身份登录到CA服务器使用以下easyrsa脚本导入证书请求

cd ~/easy-rsa./easyrsa import-req /tmp/server.req server
 
Output. . .The request has been successfully imported with a short name of: serverYou 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确认:

OutputYou are about to sign the following certificate.Please check over the details shown below for accuracy. Note that this requesthas not been cryptographically verified. Please be sure it came from a trustedsource 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 = serverType 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服务器时,他们也可以信任OpenVPN服务器。

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

scp pki/issued/server.crt sammy@your_vpn_server_ip:/tmpscp 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预共享密钥,请在~/easy-rsa目录的OpenVPN服务器上运行以下命令

cd ~/easy-rsaopenvpn --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 Server:

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

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

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

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

./easyrsa sign-req client client1
 

出现提示时,请输入yes以确认您打算对证书申请进行签名,并且该证书申请来自受信任的来源:

OutputType 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 secrettls-crypt ta.key
 

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

/etc/openvpn/server.conf
;cipher AES-256-CBCcipher 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.pemdh none
 

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

/etc/openvpn/server.conf
user nobodygroup nobody
 

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

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

首先,找到并取消注释包含的行push "redirect-gateway def1 bypass-dhcp"这样做将告诉您的客户端通过您的OpenVPN Server重定向其所有流量。请注意,启用此功能可能会导致与其他网络服务(如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.crtkey 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
 
Outputnet.ipv4.ip_forward = 1

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

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

第9步-防火墙配置

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

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

sudo firewall-cmd --get-active-zones
 
OutputpublicInterfaces: eth0

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

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

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

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

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

sudo firewall-cmd --reload
 

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

sudo firewall-cmd --list-services --zone=trusted
 
Outputopenvpn

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

使用以下命令添加化装舞会规则:

sudo firewall-cmd --add-masqueradesudo firewall-cmd --add-masquerade --permanent
 

您可以使用以下命令检查是否正确添加了化装舞会:

sudo firewall-cmd --query-masquerade
 
Outputyes

接下来,您只需要为您的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 serverLoaded: 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 agoDocs: man:openvpn(8)https://community.openvpn.net/openvpn/wiki/Openvpn24ManPagehttps://community.openvpn.net/openvpn/wiki/HOWTOMain PID: 15868 (openvpn)Status: "Initialization Sequence Completed"Tasks: 1 (limit: 5059)Memory: 1.2MCGroup: /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 Server。


打赏

感谢您的赞助~

打开支付宝扫一扫,即可进行扫码打赏哦~