如何在Debian 9上设置OpenVPN服务器

介绍

想要在连接到不受信任的网络(例如酒店的WiFi或咖啡店)时,通过智能手机或笔记本电脑安全可靠地访问互联网?一个虚拟专用网络(VPN)允许,如果你是在专用网络上你私下和安全地穿越不受信任的网络。流量从VPN服务器出现并继续前往目的地。

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

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

先决条件

要完成本教程,您需要访问Debian 9服务器来托管您的OpenVPN服务。在开始本指南之前,您需要配置具有sudo权限的非root用户。您可以按照我们的Debian 9初始服务器设置指南来设置具有适当权限的用户。链接的教程还将设置一个防火墙,假设该防火墙在本指南中已经到位。

此外,您还需要一台单独的计算机作为证书颁发机构(CA)。虽然技术上可以将您的OpenVPN服务器或本地计算机用作您的CA,但不建议这样做,因为它会将您的VPN打开到某些安全漏洞。根据官方OpenVPN文档,您应将CA放在专用于导入和签署证书请求的独立计算机上。因此,本指南假定您的CA位于单独的Debian 9服务器上,该服务器还具有具有权限的非root用户sudo和基本防火墙。

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

当您具备这些先决条件后,您可以继续本教程的第1步。

第1步 - 安装OpenVPN和EasyRSA

首先,更新VPN服务器的软件包索引并安装OpenVPN。OpenVPN在Debian的默认存储库中可用,因此您可以将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基础设施,从安装最新版本的EasyRSA的官方GitHub的项目将CA机用下面的命令你的OpenVPN服务器:

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

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

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

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

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

在此之后,再次调用easyrsa脚本,然后使用该build-ca选项。这将构建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/

再次使用该脚本server.req,按照文件路径及其通用名称导入easyrsa文件:

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

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

./easyrsa sign-req server server

在输出中,系统会要求您验证请求是否来自可信来源。键入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完整性验证功能:

sudo 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/client1.crt sammy@your_server_ip:/tmp

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

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

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

sudo 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”:

tls-auth ta.key 0 # This file is secret
key-direction 0

接下来,通过查找注释掉的cipher行找到有关加密密码的部分。该AES-256-CBC密码提供了加密一个良好的水平,并得到良好支撑。同样,这一行应该已经取消注释,但如果不是,那么只需删除它前面的“ ; ”:

cipher AES-256-CBC

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

auth SHA256

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

dh dh.pem

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

user nobody
group nogroup

到目前为止,您对server.conf示例文件所做的更改对于OpenVPN的运行是必要的。下面列出的更改是可选的,但许多常见用例也需要它们。

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

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

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

push "redirect-gateway def1 bypass-dhcp"

在此下方,找到该dhcp-option部分。再次,从两行前面删除“ ; ”以取消注释:

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是一种流行的选择,因为它通常允许通过防火墙规则。

# Optional!
port 443

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

# Optional!
proto tcp

如果你切换协议TCP,你将需要将explicit-exit-notify指令的值从1改为0,因为这个指令仅用于UDP。使用TCP时未能执行此操作将导致启动OpenVPN服务时出错:

# Optional!
explicit-exit-notify 0

如果您不需要使用其他端口和协议,则最好将这两个设置保留为默认值。

(可选)指向非默认凭据

如果您在之前执行./build-key-server指令的期间选择了不同的名称,那你可以修改certkey行来指向适当的.crt.key文件。如果您使用默认名称“server”,则已正确设置:

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.的注释行。从行的开头删除“ ”字符以取消注释此设置:

net.ipv4.ip_forward=1

完成后保存并关闭文件。

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

sudo sysctl -p
net.ipv4.ip_forward = 1

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

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

ip route | grep default

您的公共接口是此命令输出中的字符串“dev”后面的字符串。例如,此结果显示名为eth0的接口,在下面突出显示:

default via 203.0.113.1 dev eth0 onlink

如果您具有与默认路由关联的接口,请打开该/etc/ufw/before.rules文件以添加相关配置:

sudo nano /etc/ufw/before.rules

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

#
# 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文件:

sudo nano /etc/default/ufw

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

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更改为您选择的端口:

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

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

proto udp

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

# Downgrade privileges after initialization (non-Windows only)
user nobody
group nogroup

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

# 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设置:

cipher AES-256-CBC
auth SHA256

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

key-direction 1

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

# 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

在里面,添加以下内容,确保更改sammy为服务器的非root用户帐户的内容:

#!/bin/bash
​
# First argument: Client identifier
​
KEY_DIR=/home/sammy/client-configs/keys
OUTPUT_DIR=/home/sammy/client-configs/files
BASE_CONFIG=/home/sammy/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步 - 生成客户端配置

如果与导向跟着一起,在第四步中分别创建一个名为client1.crt客户端证书和名为client1.key的密钥:您可以通过移动到~/client-configs目录并运行在先前结束的所做的脚本,来生成这些凭证的配置文件:

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

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

ls ~/client-configs/files
client1.ovpn

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

虽然用于完成此传输的确切应用程序将取决于您的设备的操作系统和您的个人偏好,但可靠且安全的方法是在后端使用SFTP(SSH文件传输协议)或SCP(安全复制)。这将通过加密连接传输客户端的VPN身份验证文件。

以下是使用您可以从本地计算机(macOS或Linux)运行的client1.ovpn示例的示例SFTP命令。它将.ovpn文件放在您的主目录中:

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

步骤10 - 安装客户端配置

本节介绍如何在Windows,macOS,Linux,iOS和Android上安装客户端VPN配置文件。这些客户端指令都不依赖于彼此,因此请随意跳到适用于您的设备的任何一个。

OpenVPN连接将与您命名为.ovpn文件的名称相同。关于本教程,这意味着连接已命名client1.ovpn,与您生成的第一个客户端文件对齐。

视窗

安装

OpenVPN的下载页面下载适用于Windows的OpenVPN客户端应用程序。为您的Windows版本选择适当的安装程序版本。

注意:OpenVPN需要管理权限才能安装。

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

C:\Program Files\OpenVPN\config

当您启动OpenVPN时,它将自动查看配置文件并使其可用。

您必须在每次使用OpenAdN时以管理员身份运行OpenVPN,即使是管理帐户也是如此。要在不必右键单击并选择每次使用VPN时以管理员身份运行”的情况下执行此操作,必须从管理帐户进行预设。这也意味着标准用户需要输入管理员密码才能使用OpenVPN。另一方面,除非客户端上的OpenVPN应用程序具有管理员权限,否则标准用户无法正确连接到服务器,因此需要提升权限。

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

每次启动OpenVPN GUI时,Windows都会询问您是否允许程序对您的计算机进行更改。单击。启动OpenVPN客户端应用程序只会将applet放入系统托盘中,以便您可以根据需要连接和断开VPN; 它实际上并没有建立VPN连接。

启动OpenVPN后,通过进入系统托盘小程序并右键单击OpenVPN小程序图标来启动连接。这将打开上下文菜单。选择菜单顶部的client1(这是您的client1.ovpn个人资料),然后选择Connect

将建立一个状态窗口,显示连接建立时的日志输出,并在客户端连接后显示一条消息。

以相同方式断开与VPN的连接:进入系统托盘小程序,右键单击OpenVPN小程序图标,选择客户端配置文件,然后单击“ 断开连接”

苹果系统

安装

Tunnelblick是一个免费的开源OpenVPN客户端,用于macOS。您可以从Tunnelblick下载页面下载最新的磁盘映像。双击下载的.dmg文件,然后按照提示进行安装。

在安装过程即将结束时,Tunnelblick会询问您是否有任何配置文件。为简单起见,回答“ 否”并让Tunnelblick完成。打开Finder窗口并双击client1.ovpn。Tunnelblick将安装客户端配置文件。需要管理权限。

连接

双击Applications文件夹中的Tunnelblick启动Tunnelblick 。启动Tunnelblick后,屏幕右上角的菜单栏中将出现一个Tunnelblick图标,用于控制连接。单击图标,然后单击“ 连接”菜单项以启动VPN连接。选择client1连接。

Linux版本

安装

如果您使用的是Linux,则可以使用各种工具,具体取决于您的发行版。您的桌面环境或窗口管理器也可能包含连接实用程序。

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

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

sudo apt update
sudo apt install openvpn

在CentOS上,您可以启用EPEL存储库,然后键入以下内容进行安装:

sudo yum install epel-release
sudo yum install openvpn

配置

检查您的发行版是否包含/etc/openvpn/update-resolv-conf脚本:

ls /etc/openvpn
update-resolv-conf

接下来,编辑您传输的OpenVPN客户端配置文件:

nano client1.ovpn

如果您能够找到update-resolv-conf文件,请取消注释添加的三行以调整DNS设置:

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

如果您使用的是CentOS,请将group指令从nogroup更改为nobody为匹配分发的可用组:

group nobody

保存并关闭文件。

现在,只需将openvpn命令指向客户端配置文件即可连接到VPN :

sudo openvpn --config client1.ovpn

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

iOS版

安装

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

此处概述了使用iTunes完成传输的过程。在计算机上打开iTunes,然后单击iPhone > apps。向下滚动到文件共享部分的底部,然后单击OpenVPN应用程序。右侧的空白窗口OpenVPN文档用于共享文件。将.ovpn文件拖到OpenVPN文档窗口。

现在在iPhone上启动OpenVPN应用程序。您将收到一条通知,表明新配置文件已准备好导入。点按绿色加号以将其导入。

连接

OpenVPN现在可以使用新的配置文件了。通过将“ 连接”按钮滑动到“ 打开”位置来启动连接。通过将相同按钮滑动到关闭来断开连接。

注意

设置 下的VPN交换机不能用于连接VPN。如果您尝试,您将收到通知,仅使用OpenVPN应用程序进行连接。

Android的

安装

打开Google Play商店。搜索并安装官方Android OpenVPN客户端应用程序Android OpenVPN Connect

您可以.ovpn通过USB将Android设备连接到计算机并复制文件来传输配置文件。或者,如果您有SD卡读卡器,则可以移除设备的SD卡,将配置文件复制到其上,然后将卡重新插入Android设备。

启动OpenVPN应用程序并点击菜单以导入配置文件。

然后导航到保存的配置文件的位置(屏幕截图使用/sdcard/Download/)并选择文件。该应用程序将记下该配置文件已导入。

要进行连接,只需点击“ 连接”按钮。系统会询问您是否信任OpenVPN应用程序。选择确定以启动连接。要断开与VPN的连接,请返回OpenVPN应用程序并选择断开连接

步骤11 - 测试VPN连接(可选)

注意:只有在步骤5中选择通过VPN路由所有流量时,此方法才能测试VPN连接。

安装完所有内容后,只需进行简单检查即可确认一切正常。如果未启用VPN连接,请打开浏览器并转至DNSLeakTest

该网站将返回您的互联网服务提供商分配的IP地址,以及您在世界其他地方看到的IP地址。要通过同一网站检查DNS设置,请单击“ 扩展测试”,它将告诉您正在使用的DNS服务器。

现在将OpenVPN客户端连接到服务器的VPN并刷新浏览器。现在应该出现一个完全不同的IP地址(您的VPN服务器的IP地址),这就是您向世界展示的方式。同样,DNSLeakTest的 扩展测试将检查您的DNS设置并确认您现在正在使用VPN推送的DNS解析器。

第12步 - 撤销客户端证书

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

为此,请导航到CA计算机上的EasyRSA目录:

cd EasyRSA-3.0.4/

接下来,使用revoke选项运行easyrsa脚本,然后运行要撤消的客户端名称:

./easyrsa revoke client2

这将要求您输入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

确认操作后,CA将完全撤销客户的证书。但是,您的OpenVPN服务器当前无法检查是否已撤销任何客户端证书,并且客户端仍可访问VPN。要更正此问题,请在CA计算机上创建证书吊销列表(CRL):

./easyrsa gen-crl

这将生成一个名为crl.pem的文件。安全地将此文件传输到OpenVPN服务器:

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

在OpenVPN服务器上,将此文件复制到您的/etc/openvpn/目录中:

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

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

sudo nano /etc/openvpn/server.conf

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

crl-verify crl.pem

保存并关闭文件。

最后,重启OpenVPN以实现证书撤销:

sudo systemctl restart openvpn@server

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

要撤消其他客户端,请按照以下过程操作:

  1. 使用./easyrsa revoke client_name命令撤消证书
  2. 生成新的CRL
  3. 将新crl.pem文件传输到OpenVPN服务器并将其复制到/etc/openvpn目录以覆盖旧列表。
  4. 重启OpenVPN服务。

您可以使用此过程撤消先前为服务器颁发的任何证书。

结论

您现在可以安全地穿越互联网,保护您的身份,位置和来自窥探者和审查员的流量。如果此时您不再需要颁发证书,则建议您关闭CA计算机或以其他方式将其与Internet断开连接,直到您需要添加或撤消证书。这有助于防止攻击者获得对VPN的访问权限。

要配置更多客户端,您只需对每个其他设备执行步骤49-11。要撤消对客户端的访问权限,请执行步骤12

更多Debian教程请前往腾讯云+社区学习更多知识。


参考文献:《How To Set Up an OpenVPN Server on Debian 9》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏云计算教程系列

如何在CentOS 7上安装和配置ownCloud

ownCloud是一个文件共享服务器,允许您将个人内容(如文档和图片)集中存储在此位置,就像Dropbox一样。与ownCloud的不同之处在于它是免费的开源软...

6640
来自专栏Laoqi's Linux运维专列

设置grub密码

1283
来自专栏散尽浮华

Linux下部署SSH登录时的二次身份验证环境记录(利用Google Authenticator)

一般来说,使用ssh远程登录服务器,只需要输入账号和密码,显然这种方式不是很安全。为了安全着想,可以使用GoogleAuthenticator(谷歌身份验证器)...

5319
来自专栏Django Scrapy

python3 邮箱相关邮箱的服务

邮箱的服务 POP 协议 邮局协议(Post Office Protocol,简称POP),POP是第一个用于下载邮件的协议,POP 协议的最新版本是第三版,也...

37711
来自专栏农夫安全

【补充】任意密码重置姿势

跟第三个有点类似,只判断了接收端和验证码是否一致,未判断接收端是否和用户匹配,因此修改接收端可达到重置目的

1122
来自专栏云计算教程系列

使用Ubuntu 16.04进行初始服务器设置

当您第一次创建新的Ubuntu 16.04服务器时,您应该尽早采取一些配置步骤作为基本设置的一部分。这将提高服务器的安全性和可用性,并为后续操作奠定坚实的基础。

1350
来自专栏听Allen瞎扯淡

在公司内网如何更新IntelliJ的插件

最近小伙伴们更新IntelliJ后,发现没法安装或者更新插件了,每次尝试在线安装时总会提示SSL错误。特别是要玩Scala的小伙伴更是抓狂,因为本身Intell...

3132
来自专栏沈唁志

PHP中利用PHPMailer配合QQ邮箱实现发邮件

1912
来自专栏云计算教程系列

如何在FreeBSD上使用SSL来保护Nginx

腾讯云SSL是腾讯云的证书颁发服务,SSL证书(SSL Certificates)提供了安全套接层(SSL)证书的一站式服务,包括证书申请、管理及部署功能,与顶...

1201
来自专栏gaoqin31

linux挂载windows共享目录

3.  进入控制面板->网络和共享中心->更改高级共享设置->密码保护的共享->关闭密码保护共享

2862

扫码关注云+社区