如何在 Debian 9 上设置 OpenVPN 服务器如何在 Debian 9 上设置 OpenVPN 服务器如何在 Debian 9 上设置 OpenVPN 服务器如何在 Debian 9 上设置 OpenVPN 服务器
  • 文章
  • 正则表达式
    • 工具
  • 登录
找到的结果: {phrase} (显示: {results_count} 共: {results_count_total})
显示: {results_count} 共: {results_count_total}

加载更多搜索结果...

搜索范围
模糊匹配
搜索标题
搜索内容
发表 admin at 2025年2月28日
类别
  • 未分类
标签

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

介绍

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

当与 HTTPS 连接结合使用时,此设置允许您保护无线登录和交易。您可以规避地理限制和审查制度,并保护您的位置和任何未加密的 HTTP 流量免受不受信任的网络的影响。

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

注意:如果您计划在 DigitalOcean Droplet 上设置 OpenVPN 服务器,请注意我们与许多托管服务提供商一样,对带宽超额收费。因此,请注意您的服务器正在处理的流量。

有关详细信息,请参阅此页面。

先决条件

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

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

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

满足这些先决条件后,您可以继续执行本教程的第 1 步。

第 1 步 — 安装 OpenVPN 和 EasyRSA

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

  1. sudo apt update
  2. sudo apt install openvpn

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

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

要开始构建 CA 和 PKI 基础设施,请使用 wget 在您的 CA 机器和 OpenVPN 服务器上下载最新版本的 EasyRSA。要获取最新版本,请转到官方 EasyRSA GitHub 项目的发布页面,复制以 .tgz 结尾的文件的下载链接,然后将其粘贴到以下命令中:

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

然后提取压缩包:

  1. cd ~
  2. tar xvf EasyRSA-3.0.4.tgz

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

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

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

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

  1. cd ~/EasyRSA-3.0.4/

此目录中有一个名为 vars.example 的文件。制作此文件的副本,并将副本命名为 vars,不带文件扩展名:

  1. cp vars.example vars

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

  1. 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 服务器上启动公钥基础结构:

  1. ./easyrsa init-pki
Output
. . . 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.crt 和 ca.key — 它们构成了 SSL 证书的公共和私有端。

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

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

  1. ./easyrsa build-ca nopass

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

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

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

这样,您的 CA 就位并准备好开始签署证书请求。

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

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

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

  1. cd EasyRSA-3.0.4/

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

  1. ./easyrsa init-pki

然后再次调用 easyrsa 脚本,这次使用 gen-req 选项,后跟机器的通用名称。同样,这可以是您喜欢的任何内容,但使其具有描述性会有所帮助。在本教程中,OpenVPN 服务器的通用名称将简单地称为“服务器”。确保还包括 nopass 选项。否则将使用密码保护请求文件,这可能会导致权限稍后的问题:

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

  1. ./easyrsa gen-req server nopass

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

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

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

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

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

  1. cd EasyRSA-3.0.4/

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

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

然后通过运行带有 sign-req 选项的 easyrsa 脚本来签署请求,后跟请求类型 和通用名称。请求类型可以是client也可以是server,所以对于OpenVPN服务器的证书请求,一定要使用server请求类型:

  1. ./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 服务器:

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

在退出您的 CA 机器之前,将 ca.crt 文件也传输到您的服务器:

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

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

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

然后导航到您的 EasyRSA 目录:

  1. cd EasyRSA-3.0.4/

从那里,通过键入以下内容创建一个强 Diffie-Hellman 密钥以在密钥交换期间使用:

  1. ./easyrsa gen-dh

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

  1. sudo openvpn --genkey --secret ta.key

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

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

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

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

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

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

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

  1. mkdir -p ~/client-configs/keys

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

  1. chmod -R 700 ~/client-configs

接下来,导航回 EasyRSA 目录并运行带有 gen-req 和 nopass 选项的 easyrsa 脚本,以及通用名称客户:

  1. cd ~/EasyRSA-3.0.4/
  2. ./easyrsa gen-req client1 nopass

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

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

接下来,使用安全方法将 client1.req 文件传输到您的 CA 机器:

  1. scp pki/reqs/client1.req sammy@your_CA_ip:/tmp

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

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

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

  1. ./easyrsa sign-req client client1

在提示符下,输入 yes 以确认您打算签署证书请求并且它来自受信任的来源:

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

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

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

  1. scp pki/issued/client1.crt sammy@your_server_ip:/tmp

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

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

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

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

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

第 5 步 — 配置 OpenVPN 服务

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

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

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

在您喜欢的文本编辑器中打开服务器配置文件:

  1. sudo nano /etc/openvpn/server.conf

通过查找 tls-auth 指令找到 HMAC 部分。此行应该已经取消注释,但如果没有,则删除 \;取消注释:

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

接下来,通过查找注释掉的 cipher 行找到有关密码的部分。 AES-256-CBC 密码提供了良好的加密级别并得到了很好的支持。同样,这一行应该已经取消注释,但如果不是,则只需删除 \;在它之前:

cipher AES-256-CBC

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

auth SHA256

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

dh dh.pem

最后,找到user和group设置,去掉\;在每行的开头取消注释这些行:

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 命令中选择了不同的名称,请将您看到的 cert 和 key 行修改为指向到适当的 .crt 和 .key 文件。如果您使用默认名称 \server,这已经正确设置:

cert server.crt
key server.key

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

在完成并根据您的特定用例对服务器的 OpenVPN 配置进行任何更改后,您可以开始对服务器的网络进行一些更改。

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

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

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

  1. sudo nano /etc/sysctl.conf

在里面,寻找设置 net.ipv4.ip_forward 的注释行。从行的开头删除 \# 字符以取消注释此设置:

net.ipv4.ip_forward=1

完成后保存并关闭文件。

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

  1. sudo sysctl -p
Output
net.ipv4.ip_forward = 1

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

在打开防火墙配置文件添加伪装规则之前,首先要找到自己机器的公网接口。为此,请键入:

  1. ip route | grep default

您的公共接口是在此命令的输出中找到的字符串,跟在单词 \dev 之后。例如,此结果显示名为 eth0 的接口,它在下面突出显示:

Output
default via 203.0.113.1 dev eth0 onlink

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

  1. sudo nano /etc/ufw/before.rules

UFW 规则通常使用 ufw 命令添加。但是,before.rules 文件中列出的规则会在加载常规 UFW 规则之前读取并落实到位。在文件顶部,添加下面突出显示的行。这将为 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 文件:

  1. sudo nano /etc/default/ufw

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

DEFAULT_FORWARD_POLICY="ACCEPT"

完成后保存并关闭文件。

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

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

  1. sudo ufw allow 1194/udp
  2. sudo ufw allow OpenSSH

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

  1. sudo ufw disable
  2. sudo ufw enable

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

第 7 步 — 启动和启用 OpenVPN 服务

您终于可以在您的服务器上启动 OpenVPN 服务了。这是使用 systemd 实用程序 systemctl 完成的。

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

  1. sudo systemctl start openvpn@server

通过键入以下内容仔细检查服务是否已成功启动:

  1. sudo systemctl status openvpn@server

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

Output
● 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 接口是否可用:

  1. ip addr show tun0

这将输出配置的界面:

Output
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

启动该服务后,启用它,使其在开机时自动启动:

  1. sudo systemctl enable openvpn@server

您的 OpenVPN 服务现已启动并运行。但是,在您开始使用它之前,您必须首先为客户端计算机创建一个配置文件。本教程已经讨论了如何为客户端创建证书/密钥对,在下一步中我们将演示如何创建一个可以轻松生成客户端配置文件的基础设施。

第 8 步 — 创建客户端配置基础设施

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

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

  1. mkdir -p ~/client-configs/files

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

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

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

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

接下来,通过删除 \; 取消注释 user 和 group 指令在每一行的开头:

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

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

# 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 直接添加到客户端配置文件中:

# 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.conf 文件中设置的 cipher 和 auth 设置:

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 的新文件:

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

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

#!/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

完成后保存并关闭文件。

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

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

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

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

第 9 步 — 生成客户端配置

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

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

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

  1. ls ~/client-configs/files
Output
client1.ovpn

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

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

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

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

以下是将文件从服务器安全传输到本地计算机的几种工具和教程:

  • WinSCP
  • 如何使用 SFTP 与远程服务器安全地传输文件
  • 如何使用 Filezilla 在您的 VPS 上安全地传输和管理文件

第 10 步 — 安装客户端配置

本节介绍如何在 Windows、macOS、Linux、iOS 和 Android 上安装客户端 VPN 配置文件。这些客户端说明均不相互依赖,因此请随意跳至适用于您的设备的说明。

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

视窗

安装中

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

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

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

C:\Program Files\OpenVPN\config

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

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

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

连接中

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

OpenVPN 启动后,通过进入系统托盘小程序并右键单击 OpenVPN 小程序图标来启动连接。这将打开上下文菜单。选择菜单顶部的 client1(即您的 client1.ovpn 配置文件)并选择“连接”。

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

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

苹果系统

安装中

Tunnelblick 下载页面。双击下载的.dmg文件,按照提示进行安装。

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

连接中

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

Linux

安装中

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

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

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

  1. sudo apt update
  2. sudo apt install openvpn

在 CentOS 上,您可以启用 EPEL 存储库,然后通过键入以下内容来安装它:

  1. sudo yum install epel-release
  2. sudo yum install openvpn

配置

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

  1. ls /etc/openvpn
Output
update-resolv-conf

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

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

  1. sudo openvpn --config client1.ovpn

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

iOS

安装中

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

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

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

连接中

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

设置下的VPN开关不能用来连接VPN。如果您尝试,您将收到一条通知,要求您仅使用 OpenVPN 应用程序进行连接。

安卓

安装中

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

您可以通过 USB 将 Android 设备连接到计算机并复制文件来传输 .ovpn 配置文件。或者,如果您有 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 目录:

  1. cd EasyRSA-3.0.4/

接下来,运行带有 revoke 选项的 easyrsa 脚本,后跟要撤销的客户端名称:

  1. ./easyrsa revoke client2

这将要求您通过输入 yes 来确认撤销:

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

  1. ./easyrsa gen-crl

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

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

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

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

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

  1. sudo nano /etc/openvpn/server.conf

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

crl-verify crl.pem

保存并关闭文件。

最后重启OpenVPN实现证书吊销:

  1. sudo systemctl restart openvpn@server

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

要撤销其他客户端,请遵循以下过程:

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

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

结论

您现在可以安全地浏览互联网,保护您的身份、位置和流量免受窥探者和审查者的侵害。如果此时您不再需要颁发证书,建议您关闭 CA 机器或以其他方式断开它与互联网的连接,直到您需要添加或撤销证书。这将有助于防止攻击者访问您的 VPN。

要配置更多客户端,您只需为每个额外的设备执行步骤 4 和 9-11。要撤销对客户端的访问权限,只需执行第 12 步即可。

©2015-2025 艾丽卡 support@alaica.com