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

OpenVPN是一种功能齐全的开放源代码安全套接字层(SSL)VPN解决方案,适用于各种配置。在本教程中,您将在Ubuntu 18.04服务器上设置OpenVPN服务器,然后配置Windows,OS X,iOS和/或Android设备对其的访问。本教程将尽可能简化每个设置的安装和配置步骤。

本教程的以前版本由Justin Ellingwood编写

介绍

想要在连接到不受信任的网络(例如酒店或咖啡店的WiFi)时,从智能手机或笔记本电脑安全,安全地访问互联网? 虚拟专用网络 (VPN)允许您私密安全地穿越不受信任的网络,就好像您在专用网络中一样。 流量从VPN服务器出现并继续前往目的地。

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

OpenVPN是一种功能齐全的开放源代码安全套接字层(SSL)VPN解决方案,适用于各种配置。 在本教程中,您将在Ubuntu 18.04服务器上设置OpenVPN服务器,然后配置从Windows,MacOS,iOS和/或Android访问它。 本教程将尽可能简化每个设置的安装和配置步骤。

先决条件

要完成本教程,您需要访问Ubuntu 18.04服务器来托管您的OpenVPN服务。 在开始本指南之前,您需要使用sudo权限配置非root用户。 您可以按照我们的Ubuntu 18.04初始服务器设置指南设置具有适当权限的用户。 链接的教程还将设置一个防火墙 ,假设这个防火墙贯穿整个指南。

此外,您将需要一台单独的机器充当您的认证中心(CA)。 尽管在技术上可以使用OpenVPN服务器或本地计算机作为您的CA,但不建议这样做,因为它会打开您的VPN以应对某些安全漏洞。 根据官方的OpenVPN文档 ,您应该将您的CA放置在专用于导入和签署证书请求的独立机器上。 出于这个原因,本指南假设您的CA位于单独的Ubuntu 18.04服务器上,该服务器也具有非root用户,并且具有sudo权限和基本防火墙。

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

当你有这些先决条件时,你可以转到本教程的第1步。

第1步 - 安装OpenVPN和EasyRSA

首先,更新您的VPN服务器的包索引并安装OpenVPN。 OpenVPN在Ubuntu的默认存储库中可用,因此您可以使用apt进行安装:

sudo apt update
sudo apt install openvpn

OpenVPN是一个TLS / SSL VPN。 这意味着它利用证书来加密服务器和客户端之间的流量。 要颁发可信证书,您将设置您自己的简单证书颁发机构(CA)。 为此,我们将从项目的官方GitHub存储库下载最新版本的EasyRSA,我们将用它来构建我们的CA公钥基础结构(PKI)。

正如先决条件中所述,我们将在独立服务器上构建CA. 这种方法的原因是,如果攻击者能够渗透您的服务器,他们将能够访问您的CA私钥并使用它来签署新证书,从而使他们能够访问您的VPN。 因此,从独立机器管理CA有助于防止未经授权的用户访问您的VPN。 另外请注意,建议您在不使用签名密钥作为进一步的预防措施时关闭CA服务器。

要开始构建CA和PKI基础架构,请使用以下命令从CA机器和OpenVPN服务器上的官方GitHub项目安装最新版本的EasyRSA:

wget -P ~/ https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.4/EasyRSA-3.0.4.tgz

然后提取tarball:

cd ~
tar xvf EasyRSA-3.0.4.tgz

您已成功在服务器和CA机器上安装了所有必需的软件。 继续配置EasyRSA使用的变量并设置一个CA目录,从中您可以生成服务器和客户端访问VPN所需的密钥和证书。

第2步 - 配置EasyRSA变量并构建CA

EasyRSA附带一个配置文件,您可以编辑该文件以为您的CA定义多个变量。

在您的CA机器上 ,导航到EasyRSA目录:

cd ~/EasyRSA-3.0.4/

在这个目录下有一个名为vars.example的文件。 制作此文件的副本,并命名没有文件扩展名的副本vars

cp vars.example vars

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

nano vars

找到为新证书设置字段默认值的设置。 它看起来像这样:

〜/ EasyRSA-3.0.4 /瓦尔
. . .

#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"

. . .

取消注释这些行并将突出显示的值更新为任何您喜欢的值,但不要将它们留空:

〜/ EasyRSA-3.0.4 /瓦尔
. . .

set_var EASYRSA_REQ_COUNTRY    "US"
set_var EASYRSA_REQ_PROVINCE   "NewYork"
set_var EASYRSA_REQ_CITY       "New York City"
set_var EASYRSA_REQ_ORG        "DigitalOcean"
set_var EASYRSA_REQ_EMAIL      "admin@example.com"
set_var EASYRSA_REQ_OU         "Community"

. . .

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

在EasyRSA目录内有一个名为easyrsa的脚本,它被称为执行涉及构建和管理CA的各种任务。 使用init-pki选项运行此脚本以在CA服务器上启动公钥基础结构:

./easyrsa init-pki
. . .
init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /home/sammy/EasyRSA-3.0.4/pki

在此之后,再次使用build-ca选项调用easyrsa脚本。 这将构建CA并创建两个重要文件 - ca.crtca.key - 构成SSL证书的公共和私有方面。

  • ca.crt是CA的公共证书文件,在OpenVPN上下文中,服务器和客户端用于通知对方他们是同一信任信任网络的一部分,而不是某人正在进行中间人攻击。 因此,您的服务器和您的所有客户端都需要ca.crt文件的副本。
  • ca.key是CA机器用于为服务器和客户端签名密钥和证书的私钥。 如果攻击者获得对CA的访问权,进而获得对ca.key文件的访问权限,则他们将能够签署证书请求并访问您的VPN,从而阻碍其安全。 这就是为什么您的ca.key文件应该存在于您的CA机器上,并且理想情况下,您的CA机器在未签署证书请求作为额外安全措施时应保持脱机状态。

如果您不希望在每次与CA交互时提示输入密码,则可以使用nopass选项运行build-ca命令,如下所示:

./easyrsa build-ca nopass

在输出中,系统会要求您确认您的CA的通用名称

. . .
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:

通用名称是用于在证书颁发机构上下文中引用本机的名称。 您可以为CA的通用名称输入任何字符串,但为了简单起见,请按ENTER接受默认名称。

由此,您的CA已准备就绪,并且已准备好开始签署证书请求。

第3步 - 创建服务器证书,密钥和加密文件

现在您已经准备好了CA,您可以从服务器生成私钥和证书请求,然后将请求传输到您的CA进行签名,从而创建所需的证书。 您也可以自由创建一些在加密过程中使用的附加文件。

首先导航到OpenVPN服务器上的EasyRSA目录:

cd EasyRSA-3.0.4/

从那里运行带有init-pki选项的easyrsa脚本。 尽管您已经在CA机器上运行了此命令,但仍需要在此处运行它,因为您的服务器和CA将具有单独的PKI目录:

./easyrsa init-pki

然后再次调用easyrsa脚本,这次使用gen-req选项,然后是机器的通用名称。 再次,这可能是你喜欢的任何东西,但它可以有助于使其具有描述性。 在本教程中,OpenVPN服务器的通用名称将仅仅是“服务器”。 一定要包括nopass选项。 如果不这样做,将密码保护请求文件,这可能会导致稍后出现权限问题:

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

./easyrsa gen-req server nopass

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

sudo cp ~/EasyRSA-3.0.4/pki/private/server.key /etc/openvpn/

使用安全的方法(如下面的示例中的SCP),将server.req文件传输到CA机器:

scp ~/EasyRSA-3.0.4/pki/reqs/server.req sammy@your_CA_ip:/tmp

接下来,在您的CA机器上 ,导航到EasyRSA目录:

cd EasyRSA-3.0.4/

再次使用easyrsa脚本,导入server.req文件,并使用其公用名称的文件路径:

./easyrsa import-req /tmp/server.req server

然后通过使用sign-req选项运行easyrsa脚本,然后签署请求类型和公用名称来sign-req 请求 请求类型可以是clientserver ,因此对于OpenVPN服务器的证书请求,请确保使用server请求类型:

./easyrsa sign-req server server

在输出中,系统会要求您验证请求是否来自可信来源。 ENTER yes然后按ENTER确认:

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

如果您对CA密钥进行了加密,则此时系统会提示您输入密码。

接下来,使用安全方法将签名证书传输回您的VPN服务器:

scp pki/issued/server.crt sammy@your_server_ip:/tmp

在注销CA机器之前,还要将ca.crt文件传输到您的服务器:

scp pki/ca.crt sammy@your_server_ip:/tmp

接下来,重新登录到您的OpenVPN服务器,并将server.crtca.crt文件复制到您的/etc/openvpn/目录中:

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

然后导航到您的EasyRSA目录:

cd EasyRSA-3.0.4/

从那里创建一个强大的Diffie-Hellman密钥,以便在密钥交换期间使用,方法是键入以下内容:

./easyrsa gen-dh

这可能需要几分钟才能完成。 一旦完成,生成一个HMAC签名以加强服务器的TLS完整性验证功能:

openvpn --genkey --secret ta.key

命令完成后,将这两个新文件复制到/etc/openvpn/目录中:

sudo cp ~/EasyRSA-3.0.4/ta.key /etc/openvpn/
sudo cp ~/EasyRSA-3.0.4/pki/dh.pem /etc/openvpn/

由此,您的服务器所需的所有证书和密钥文件都已生成。 您已准备好创建客户端计算机将用来访问OpenVPN服务器的相应证书和密钥。

第4步 - 生成客户端证书和密钥对

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

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

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

mkdir -p ~/client-configs/keys

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

chmod -R 700 ~/client-configs

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

cd ~/EasyRSA-3.0.4/
./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_ip:/tmp

登录到您的CA机器,导航到EasyRSA目录并导入证书请求:

ssh sammy@your_CA_IP
cd EasyRSA-3.0.4/
./easyrsa import-req /tmp/client1.req client1

然后像上一步中对服务器所做的那样对请求进行签名。 不过,这次请务必指定client请求类型:

./easyrsa sign-req client client1

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

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

同样,如果您对CA密钥进行了加密,则系统会提示您输入密码。

这将创建一个名为client1.crt的客户端证书文件。 将该文件传回服务器:

scp pki/issued/client.crt sammy@your_server_ip:/tmp

SSH回到您的OpenVPN服务器并将客户端证书复制到/client-configs/keys/目录中:

cp /tmp/client1.crt ~/client-configs/keys/

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

cp EasyRSA-3.0.4/ta.key ~/client-configs/keys/
sudo cp /etc/openvpn/ca.crt ~/client-configs/keys/

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

第5步 - 配置OpenVPN服务

现在您的客户端和服务器的证书和密钥都已生成,您可以开始配置OpenVPN服务以使用这些凭证。

首先将示例OpenVPN配置文件复制到配置目录中,然后解压缩以作为安装的基础:

sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
sudo gzip -d /etc/openvpn/server.conf.gz

在首选文本编辑器中打开服务器配置文件:

sudo nano /etc/openvpn/server.conf

通过查找tls-auth指令来查找HMAC部分。 此行应该已被取消注释,但如果不是,则删除“ ; ”以取消注释。 在该行下方,添加key-direction参数,设置为“0”:

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

接下来,通过查找注释掉的cipher行来查找加密密码部分。 AES-256-CBC密码提供了良好的加密级别,并得到很好的支持。 再一次,这条线应该已经被取消注释了,但是如果不是,那就删除它之前的“ ; ”:

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

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

/etc/openvpn/server.conf
auth SHA256

接下来,找到包含定义Diffie-Hellman参数的dh指令的行。 由于最近对EasyRSA所做的一些更改,Diffie-Hellman密钥的文件名可能与示例服务器配置文件中列出的文件名不同。 如有必要,请通过删除2048来更改此处列出的文件名,使其与上一步中生成的密钥对齐:

/etc/openvpn/server.conf
dh dh.pem

最后,找到usergroup设置,并在每个开始处删除“ ; ”以取消注释这些行:

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

为了使OpenVPN正常工作,您对示例server.conf文件所做的更改server.conf 下面概述的变化是可选的,尽管它们在许多常见用例中也是需要的。

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

上面的设置将创建两台机器之间的VPN连接,但不会强制任何连接使用隧道。 如果您希望使用VPN路由所有流量,您可能需要将DNS设置推送到客户端计算机。

server.conf文件中有一些指令,您必须更改该指令才能启用此功能。 找到redirect-gateway部分并从redirect-gateway行的开头删除分号“ ; ”以取消注释:

/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"

这将有助于客户重新配置其DNS设置,以将VPN隧道用作默认网关。

(可选)调整端口和协议

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

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

协议通常也仅限于该端口。 如果是这样,请proto从UDP更改为TCP:

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

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

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

如果您不需要使用不同的端口和协议,最好将这两个设置作为默认设置。

(可选)指向非默认凭证

如果您之前在./build-key-server命令中选择了其他名称,请修改您看到的certkey行以指向相应的.crt.key文件。 如果您使用默认名称“server”,则该名称已正确设置:

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

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

在完成对服务器的OpenVPN配置进行的任何更改后,您需要针对您的特定用例进行修改,然后才能对服务器的网络进行一些更改。

第6步 - 调整服务器网络配置

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

通过修改/etc/sysctl.conf文件来调整服务器的默认IP转发设置:

sudo nano /etc/sysctl.conf

在里面,找到设置net.ipv4.ip_forward的注释行。 从行首删除“ ”字符以取消注释该设置:

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

完成后保存并关闭文件。

要读取文件并调整当前会话的值,请键入:

sudo sysctl -p
net.ipv4.ip_forward = 1

如果您遵循了先决条件中列出的Ubuntu 18.04初始服务器设置指南,则应该有UFW防火墙。 无论您是否使用防火墙阻止不必要的流量(您几乎总是应该这样做),对于本指南,您需要防火墙来操纵进入服务器的一些流量。 一些防火墙规则必须修改以启用伪装,iptables概念提供动态网络地址转换(NAT)以正确路由客户端连接。

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

ip route | grep default

您的公共接口是在该命令的输出中找到的字符串,后面跟着“dev”一词。 例如,此结果显示名为wlp11s0的界面,其突出显示如下:

default via 203.0.113.1 dev wlp11s0 proto static

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

sudo nano /etc/ufw/before.rules

通常使用ufw命令添加UFW规则。 然而,在before.rules文件中列出的规则在加载传统的UFW规则之前被读取和放置。 朝文件顶部添加下面突出显示的行。 这将为nat表中的POSTROUTING链设置默认策略,并伪装来自VPN的任何流量。 请记住用以上命令中找到的界面替换wlp11s0-A POSTROUTING行中的wlp11s0

/etc/ufw/before.rules
#
# 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 wlp11s0 (change to the interface you discovered!)
-A POSTROUTING -s 10.8.0.0/8 -o wlp11s0 -j MASQUERADE
COMMIT
# END OPENVPN RULES

# Don't delete these required lines, otherwise there will be errors
*filter
. . .

完成后保存并关闭文件。

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

sudo nano /etc/default/ufw

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

在/ etc /默认/ UFW
DEFAULT_FORWARD_POLICY="ACCEPT"

完成后保存并关闭文件。

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

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

sudo ufw allow 1194/udp
sudo ufw allow OpenSSH

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

sudo ufw disable
sudo ufw enable

您的服务器现在配置为正确处理OpenVPN流量。

第7步 - 启动并启用OpenVPN服务

你终于准备好在你的服务器上启动OpenVPN服务了。 这是使用systemd实用程序systemctl

通过在systemd单元文件名后指定配置文件名作为实例变量来启动OpenVPN服务器。 您的服务器的配置文件称为/etc/openvpn/ server .conf ,因此在调用它时将@server添加到单元文件的末尾:

sudo systemctl start openvpn@server

输入以下内容,仔细检查服务是否已成功启动:

sudo systemctl status openvpn@server

如果一切顺利,你的输出将如下所示:

● openvpn@server.service - OpenVPN connection to server
   Loaded: loaded (/lib/systemd/system/openvpn@.service; disabled; vendor preset: enabled)
   Active: active (running) since Tue 2016-05-03 15:30:05 EDT; 47s ago
     Docs: man:openvpn(8)
           https://community.openvpn.net/openvpn/wiki/Openvpn23ManPage
           https://community.openvpn.net/openvpn/wiki/HOWTO
  Process: 5852 ExecStart=/usr/sbin/openvpn --daemon ovpn-%i --status /run/openvpn/%i.status 10 --cd /etc/openvpn --script-security 2 --config /etc/openvpn/%i.conf --writepid /run/openvpn/%i.pid (code=exited, sta
 Main PID: 5856 (openvpn)
    Tasks: 1 (limit: 512)
   CGroup: /system.slice/system-openvpn.slice/openvpn@server.service
           └─5856 /usr/sbin/openvpn --daemon ovpn-server --status /run/openvpn/server.status 10 --cd /etc/openvpn --script-security 2 --config /etc/openvpn/server.conf --writepid /run/openvpn/server.pid

您还可以通过键入以下命令来检查OpenVPN tun0接口是否可用:

ip addr show tun0

这将输出一个配置的接口:

4: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 100
    link/none 
    inet 10.8.0.1 peer 10.8.0.2/32 scope global tun0
       valid_lft forever preferred_lft forever

启动该服务后,启用该服务以便在启动时自动启动:

sudo systemctl enable openvpn@server

您的OpenVPN服务现已启动并正在运行。 但是,在开始使用它之前,您必须先为客户机创建一个配置文件。 本教程已经介绍了如何为客户端创建证书/密钥对,下一步我们将演示如何创建一个能够轻松生成客户端配置文件的基础架构。

第8步 - 创建客户端配置基础架构

为OpenVPN客户端创建配置文件可能会有所涉及,因为每个客户端都必须具有自己的配置,并且每个客户端都必须与服务器配置文件中列出的设置保持一致。 这个步骤不是写一个只能在一个客户端上使用的单个配置文件,而是构建一个客户端配置基础架构的过程,您可以使用这个基础架构即时生成配置文件。 您将首先创建一个“基本”配置文件,然后构建一个脚本,使您可以根据需要生成唯一的客户端配置文件,证书和密钥。

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

mkdir -p ~/client-configs/files

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

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

在文本编辑器中打开这个新文件:

nano ~/client-configs/base.conf

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

〜/客户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
. . .

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

〜/客户CONFIGS / base.conf
proto udp

接下来,通过删除每行开始处的“ ; ”来取消注释usergroup指令:

〜/客户CONFIGS / base.conf
# Downgrade privileges after initialization (non-Windows only)
user nobody
group nogroup

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

〜/客户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

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

〜/客户CONFIGS / base.conf
cipher AES-256-CBC
auth SHA256

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

〜/客户CONFIGS / base.conf
key-direction 1

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

〜/客户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目录中。 ~/client-configs目录中打开一个名为make_config.sh的新文件:

nano ~/client-configs/make_config.sh

在里面,添加以下内容:

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

完成后保存并关闭文件。

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

chmod 700 ~/client-configs/make_config.sh

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

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

第9步 - 生成客户端配置

如果您遵循指南,则在第4步中分别创建了一个名为client1.crtclient1.key的客户端证书和密钥。您可以通过移动到您的~/client-configs目录并为这些证书生成一个配置文件,然后运行您在上一步结束时创建的脚本:

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

这将在~/client-configs/files目录下创建一个名为client1.ovpn ~/client-configs/files

ls ~/client-configs/files
client1.ovpn

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

虽然用于完成此传输的确切应用程序将取决于您的设备的操作系统和您的个人偏好,但可靠且安全的方法是在后端使用SFTP(SSH文件传输协议)或SCP(安全复制)。 This will transport your client's VPN authentication files over an encrypted connection.

Here is an example SFTP command using the client1.ovpn example which you can run from your local computer (macOS or Linux). It places the .ovpn file in your home directory:

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

Here are several tools and tutorials for securely transferring files from the server to a local computer:

Step 10 — Installing the Client Configuration

This section covers how to install a client VPN profile on Windows, macOS, Linux, iOS, and Android. None of these client instructions are dependent on one another, so feel free to skip to whichever is applicable to your device.

The OpenVPN connection will have the same name as whatever you called the .ovpn file. In regards to this tutorial, this means that the connection is named client1.ovpn , aligning with the first client file you generated.

视窗

Installing

Download the OpenVPN client application for Windows from OpenVPN's Downloads page . Choose the appropriate installer version for your version of Windows.

Note
OpenVPN needs administrative privileges to install.

After installing OpenVPN, copy the .ovpn file to:

C:\Program Files\OpenVPN\config

When you launch OpenVPN, it will automatically see the profile and makes it available.

You must run OpenVPN as an administrator each time it's used, even by administrative accounts. To do this without having to right-click and select Run as administrator every time you use the VPN, you must preset this from an administrative account. This also means that standard users will need to enter the administrator's password to use OpenVPN. On the other hand, standard users can't properly connect to the server unless the OpenVPN application on the client has admin rights, so the elevated privileges are necessary.

To set the OpenVPN application to always run as an administrator, right-click on its shortcut icon and go to Properties . At the bottom of the Compatibility tab, click the button to Change settings for all users . In the new window, check Run this program as an administrator .

Connecting

Each time you launch the OpenVPN GUI, Windows will ask if you want to allow the program to make changes to your computer. Click Yes . Launching the OpenVPN client application only puts the applet in the system tray so that you can connect and disconnect the VPN as needed; it does not actually make the VPN connection.

Once OpenVPN is started, initiate a connection by going into the system tray applet and right-clicking on the OpenVPN applet icon. This opens the context menu. Select client1 at the top of the menu (that's your client1.ovpn profile) and choose Connect .

A status window will open showing the log output while the connection is established, and a message will show once the client is connected.

Disconnect from the VPN the same way: Go into the system tray applet, right-click the OpenVPN applet icon, select the client profile and click Disconnect .

苹果系统

Installing

Tunnelblick is a free, open source OpenVPN client for macOS. You can download the latest disk image from the Tunnelblick Downloads page . Double-click the downloaded .dmg file and follow the prompts to install.

Towards the end of the installation process, Tunnelblick will ask if you have any configuration files. For simplicity, answer No and let Tunnelblick finish. Open a Finder window and double-click client1.ovpn . Tunnelblick will install the client profile. Administrative privileges are required.

Connecting

Launch Tunnelblick by double-clicking Tunnelblick in the Applications folder. Once Tunnelblick has been launched, there will be a Tunnelblick icon in the menu bar at the top right of the screen for controlling connections. Click on the icon, and then the Connect menu item to initiate the VPN connection. Select the client1 connection.

Linux的

Installing

If you are using Linux, there are a variety of tools that you can use depending on your distribution. Your desktop environment or window manager might also include connection utilities.

The most universal way of connecting, however, is to just use the OpenVPN software.

On Ubuntu or Debian, you can install it just as you did on the server by typing:

sudo apt update
sudo apt install openvpn

On CentOS you can enable the EPEL repositories and then install it by typing:

sudo yum install epel-release
sudo yum install openvpn

Configuring

Check to see if your distribution includes an /etc/openvpn/update-resolv-conf script:

ls /etc/openvpn
update-resolv-conf

Next, edit the OpenVPN client configuration file you transfered:

nano client1.ovpn

If you were able to find an update-resolv-conf file, uncomment the three lines you added to adjust the DNS settings:

client1.ovpn
script-security 2
up /etc/openvpn/update-resolv-conf
down /etc/openvpn/update-resolv-conf

If you are using CentOS, change the group directive from nogroup to nobody to match the distribution's available groups:

client1.ovpn
group nobody

保存并关闭文件。

Now, you can connect to the VPN by just pointing the openvpn command to the client configuration file:

sudo openvpn --config client1.ovpn

This should connect you to your VPN.

iOS

Installing

From the iTunes App Store, search for and install OpenVPN Connect , the official iOS OpenVPN client application. To transfer your iOS client configuration onto the device, connect it directly to a computer.

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

Now launch the OpenVPN app on the iPhone. You will receive a notification that a new profile is ready to import. Tap the green plus sign to import it.

The OpenVPN iOS app showing new profile ready to import

Connecting

OpenVPN is now ready to use with the new profile. Start the connection by sliding the Connect button to the On position. Disconnect by sliding the same button to Off .

Note
The VPN switch under Settings cannot be used to connect to the VPN. If you try, you will receive a notice to only connect using the OpenVPN app.

The OpenVPN iOS app connected to the VPN

Android的

Installing

Open the Google Play Store. Search for and install Android OpenVPN Connect , the official Android OpenVPN client application.

You can transfer the .ovpn profile by connecting the Android device to your computer by USB and copying the file over. Alternatively, if you have an SD card reader, you can remove the device's SD card, copy the profile onto it and then insert the card back into the Android device.

Start the OpenVPN app and tap the menu to import the profile.

The OpenVPN Android app profile import menu selection

Then navigate to the location of the saved profile (the screenshot uses /sdcard/Download/ ) and select the file. The app will make a note that the profile was imported.

The OpenVPN Android app selecting VPN profile to import

Connecting

To connect, simply tap the Connect button. You'll be asked if you trust the OpenVPN application. Choose OK to initiate the connection. To disconnect from the VPN, go back to the OpenVPN app and choose Disconnect .

The OpenVPN Android app ready to connect to the VPN

Step 11 — Testing Your VPN Connection (Optional)

Note: This method for testing your VPN connection will only work if you opted to route all your traffic through the VPN in Step 5.

Once everything is installed, a simple check confirms everything is working properly. Without having a VPN connection enabled, open a browser and go to DNSLeakTest .

The site will return the IP address assigned by your internet service provider and as you appear to the rest of the world. To check your DNS settings through the same website, click on Extended Test and it will tell you which DNS servers you are using.

Now connect the OpenVPN client to your Droplet's VPN and refresh the browser. A completely different IP address (that of your VPN server) should now appear, and this is how you appear to the world. Again, DNSLeakTest's Extended Test will check your DNS settings and confirm you are now using the DNS resolvers pushed by your VPN.

Step 12 — Revoking Client Certificates

Occasionally, you may need to revoke a client certificate to prevent further access to the OpenVPN server.

To do so, navigate to the EasyRSA directory on your CA machine:

cd EasyRSA-3.0.4/

Next, run the easyrsa script with the revoke option, followed by the client name you wish to revoke:

./easyrsa revoke client2

This will ask you to confirm the revocation by entering yes :

Please confirm you wish to revoke the certificate with the following subject:

subject=
    commonName                = client2


Type the word 'yes' to continue, or any other input to abort.
  Continue with revocation: yes

After confirming the action, the CA will fully revoke the client's certificate. However, your OpenVPN server currently has no way to check whether any clients' certificates have been revoked and the client will still have access to the VPN. To correct this, create a certificate revocation list (CRL) on your CA machine:

./easyrsa gen-crl

This will generate a file called crl.pem . Securely transfer this file to your OpenVPN server:

scp ~/EasyRSA-3.0.4/pki/crl.pem sammy@your_server_ip:/tmp

On your OpenVPN server, copy this file into your /etc/openvpn/ directory:

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

Next, open the OpenVPN server configuration file:

sudo nano /etc/openvpn/server.conf

At the bottom of the file, add the crl-verify option, which will instruct the OpenVPN server to check the certificate revocation list that we've created each time a connection attempt is made:

/etc/openvpn/server.conf
crl-verify crl.pem

保存并关闭文件。

Finally, restart OpenVPN to implement the certificate revocation:

sudo systemctl restart openvpn@server

The client should no longer be able to successfully connect to the server using the old credential.

To revoke additional clients, follow this process:

  1. Revoke the certificate with the ./easyrsa revoke client_name command
  2. Generate a new CRL
  3. Transfer the new crl.pem file to your OpenVPN server and copy it to the /etc/openvpn directory to overwrite the old list.
  4. Restart the OpenVPN service.

You can use this process to revoke any certificates that you've previously issued for your server.

结论

You are now securely traversing the internet protecting your identity, location, and traffic from snoopers and censors.

To configure more clients, you only need to follow steps 4 and 9-11 for each additional device. To revoke access to clients, just follow step 12 .