如何在 CentOS 7 上设置和配置 OpenVPN 服务器
介绍
虚拟专用网络 (VPN) 允许您像在专用网络上一样穿越不受信任的网络。当连接到不受信任的网络(例如酒店或咖啡店的 WiFi)时,它使您可以自由地从智能手机或笔记本电脑安全可靠地访问互联网。
当与 HTTPS 连接结合使用时,此设置允许您保护无线登录和交易。您可以规避地理限制和审查制度,并保护您的位置和任何未加密的 HTTP 流量免受不受信任的网络的影响。
OpenVPN 是一种功能齐全的开源安全套接字层 (SSL) VPN 解决方案,可适应各种配置。在本教程中,您将在 CentOS 7 服务器上设置 OpenVPN,然后将其配置为可从客户端计算机访问。
注意:如果您计划在 DigitalOcean Droplet 上设置 OpenVPN 服务器,请注意我们与许多托管服务提供商一样,对带宽超额收费。因此,请注意您的服务器正在处理的流量。
有关详细信息,请参阅此页面。
先决条件
要学习本教程,您需要:
- <李> 一台带有 sudo 非 root 用户的 CentOS 7 服务器和使用 firewalld 设置的防火墙,您可以通过我们针对新 CentOS 7 服务器的额外推荐步骤来实现。 <李> 解析为可用于证书的服务器的域或子域。要进行设置,您首先需要通过 DigitalOcean 控制面板添加 DNS 记录。请注意,只需添加一条 A 记录即可满足本教程的要求。 <李> 您将用于连接到您的 OpenVPN 服务器的客户端计算机。出于本教程的目的,建议您使用本地计算机作为 OpenVPN 客户端。
具备这些先决条件后,您就可以开始在 CentOS 7 上设置和配置 OpenVPN 服务器了。
第 1 步 — 安装 OpenVPN
首先,我们将在服务器上安装 OpenVPN。我们还将安装 Easy RSA,这是一种公钥基础设施管理工具,可帮助我们设置内部证书颁发机构 (CA) 以用于我们的 VPN。稍后我们还将使用 Easy RSA 生成 SSL 密钥对以保护 VPN 连接。
以非 root sudo 用户身份登录服务器,并更新包列表以确保您拥有所有最新版本。
- sudo yum update -y
Extra Packages for Enterprise Linux (EPEL) 存储库是由 Fedora 项目管理的附加存储库,其中包含非标准但流行的软件包。 OpenVPN 在默认的 CentOS 存储库中不可用,但在 EPEL 中可用,因此请安装 EPEL:
- sudo yum install epel-release -y
然后再次更新您的包列表:
- sudo yum update -y
接下来,安装 OpenVPN 和 wget
,我们将使用它们来安装 Easy RSA:
- sudo yum install -y openvpn wget
使用 wget
,下载 Easy RSA。出于本教程的目的,我们建议使用 easy-rsa-2,因为此版本有更多可用文档。您可以在项目的发布页面上找到最新版本的 easy-rsa-2 的下载链接:
- wget -O /tmp/easyrsa https://github.com/OpenVPN/easy-rsa-old/archive/2.3.3.tar.gz
接下来,使用 tar
提取压缩文件:
- tar xfz /tmp/easyrsa
这将在您的服务器上创建一个名为 easy-rsa-old-2.3.3
的新目录。在/etc/openvpn
下新建一个子目录,命名为easy-rsa
:
- sudo mkdir /etc/openvpn/easy-rsa
将提取的 Easy RSA 文件复制到新目录:
- sudo cp -rf easy-rsa-old-2.3.3/easy-rsa/2.0/* /etc/openvpn/easy-rsa
然后将目录的所有者更改为您的非 root sudo 用户:
sudo chown sammy /etc/openvpn/easy-rsa/
安装这些程序并将其移动到系统上的正确位置后,下一步就是自定义 OpenVPN 的服务器端配置。
第 2 步 — 配置 OpenVPN
与许多其他广泛使用的开源工具一样,有许多配置选项可供您使用。在本节中,我们将提供有关如何设置基本 OpenVPN 服务器配置的说明。
OpenVPN 在其文档目录中有几个示例配置文件。首先,复制示例 server.conf
文件作为您自己的配置文件的起点。
- sudo cp /usr/share/doc/openvpn-2.4.4/sample/sample-config-files/server.conf /etc/openvpn
使用您选择的文本编辑器打开新文件进行编辑。我们将在我们的示例中使用 nano,如果您的服务器上还没有它,您可以使用 yum install nano
命令下载它:
- sudo nano /etc/openvpn/server.conf
我们需要在此文件中更改几行,其中大部分只需通过删除行开头的分号 ;
来取消注释。这些行的功能,以及本教程中未提及的其他行,在每一行上方的评论中都有深入的解释。
首先,找到并取消注释包含 push redirect-gateway def1 bypass-dhcp
的行。这样做会告诉您的客户端通过您的 OpenVPN 服务器重定向其所有流量。请注意,启用此功能可能会导致与其他网络服务(如 SSH)的连接问题:
push "redirect-gateway def1 bypass-dhcp"
因为您的客户端将无法使用您的 ISP 提供的默认 DNS 服务器(因为它的流量将被重新路由),您需要告诉它可以使用哪些 DNS 服务器连接到 OpenVPN。您可以选择不同的 DNS 服务器,但这里我们将使用 Google 的公共 DNS 服务器,其 IP 地址为 8.8.8.8
和 8.8.4.4
。
通过取消注释 push dhcp-option DNS ...
行并更新 IP 地址来设置:
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
我们希望 OpenVPN 在启动后以无权限运行,因此我们需要告诉它以一个用户和无人组运行。要启用此功能,请取消注释 user nobody
和 group nobody
行:
user nobody
group nobody
接下来,取消注释 topology subnet
行。这连同其下方的 server 10.8.0.0 255.255.255.0
行将您的 OpenVPN 安装配置为作为子网运行,并告知客户端计算机应使用哪个 IP 地址。在这种情况下,服务器将变为 10.8.0.1
,第一个客户端将变为 10.8.0.2
:
topology subnet
还建议您将以下行添加到服务器配置文件中。这双重检查任何传入的客户端证书是否真正来自客户端,强化我们将在后续步骤中建立的安全参数:
remote-cert-eku "TLS Web Client Authentication"
最后,OpenVPN 强烈建议用户启用 TLS 身份验证,这是一种确保计算机网络安全通信的加密协议。为此,您需要生成一个静态加密密钥(在我们的示例中命名为 myvpn.tlsauth
,但您可以选择任何您喜欢的名称)。在创建此密钥之前,通过在其前面加上分号来注释配置文件中包含 tls-auth ta.key 0
的行。然后,将 tls-crypt myvpn.tlsauth
添加到它下面的行中:
;tls-auth ta.key 0
tls-crypt myvpn.tlsauth
保存并退出 OpenVPN 服务器配置文件(在 nano 中,按 CTRL - X
,Y
,然后 ENTER
这样做),然后生成使用以下命令的静态加密密钥:
- sudo openvpn --genkey --secret /etc/openvpn/myvpn.tlsauth
现在您的服务器已配置完毕,您可以继续设置安全连接到您的 VPN 连接所需的 SSL 密钥和证书。
第 3 步 — 生成密钥和证书
Easy RSA 使用随程序安装的一组脚本来生成密钥和证书。为了避免每次需要生成证书时都重新配置,您可以修改 Easy RSA 的配置以定义它将用于证书字段的默认值,包括您的国家、城市和首选电子邮件地址。
我们将通过创建一个目录来开始生成密钥和证书的过程,Easy RSA 将在该目录中存储您生成的任何密钥和证书:
- sudo mkdir /etc/openvpn/easy-rsa/keys
默认证书变量在 /etc/openvpn/easy-rsa
的 vars
文件中设置,因此打开该文件进行编辑:
- sudo nano /etc/openvpn/easy-rsa/vars
滚动到文件底部并更改以 export KEY_
开头的值以匹配您的信息。最重要的是:
KEY_CN
:在此处输入解析到您的服务器的域或子域。KEY_NAME
:您应该在此处输入服务器
。如果您输入其他内容,您还必须更新引用server.key
和server.crt
的配置文件。
您可能想要更改的此文件中的其他变量是:
KEY_COUNTRY
:对于此变量,输入您居住国家/地区的两个字母缩写。KEY_PROVINCE
:这应该是您居住所在州的名称或缩写。KEY_CITY
:在此处输入您居住的城市的名称。KEY_ORG
:这应该是您的组织或公司的名称。KEY_EMAIL
:输入您要连接到安全证书的电子邮件地址。KEY_OU
:这应该是您所属的“组织单位”的名称,通常是您所在部门或团队的名称。
在特定用例之外可以安全地忽略其余变量。进行更改后,文件应如下所示:
. . .
# These are the default values for fields
# which will be placed in the certificate.
# Don't leave any of these fields blank.
export KEY_COUNTRY="US"
export KEY_PROVINCE="NY"
export KEY_CITY="New York"
export KEY_ORG="DigitalOcean"
export KEY_EMAIL="sammy@example.com"
export KEY_EMAIL=sammy@example.com
export KEY_CN=openvpn.example.com
export KEY_NAME="server"
export KEY_OU="Community"
. . .
保存并关闭文件。
要开始生成密钥和证书,请移至 easy-rsa
目录和您在 vars
文件中设置的新变量中的 source
:
- cd /etc/openvpn/easy-rsa
- source ./vars
运行 Easy RSA 的 clean-all
脚本以删除文件夹中已有的任何密钥和证书并生成证书颁发机构:
- ./clean-all
接下来,使用 build-ca
脚本构建证书颁发机构。系统将提示您输入证书字段的值,但如果您之前在 vars
文件中设置了变量,则所有选项都已设置为默认值。您可以按 ENTER
接受每个默认值:
- ./build-ca
此脚本生成一个名为 ca.key
的文件。这是用于签署服务器和客户端证书的私钥。如果丢失,您将无法再信任来自该证书颁发机构的任何证书,并且如果任何人能够访问此文件,他们就可以在您不知情的情况下签署新证书并访问您的 VPN。为此,OpenVPN建议将ca.key
尽可能存放在可以离线的位置,并且只在创建新证书时激活。
接下来,使用 build-key-server
脚本为服务器创建密钥和证书:
- ./build-key-server server
与构建 CA 一样,您会看到已设置为默认值的值,因此您可以在出现这些提示时点击 ENTER
。此外,系统会提示您输入质询密码和可选的公司名称。如果您输入质询密码,当您从客户端连接到 VPN 时,系统会要求您输入密码。如果您不想设置挑战密码,只需将此行留空并按 ENTER
。最后,输入 Y
以提交更改。
创建服务器密钥和证书的最后一部分是生成 Diffie-Hellman 密钥交换文件。使用 build-dh
脚本来执行此操作:
- ./build-dh
这可能需要几分钟才能完成。
服务器生成密钥交换文件后,将服务器密钥和证书从 keys
目录复制到 openvpn
目录:
- cd /etc/openvpn/easy-rsa/keys
- sudo cp dh2048.pem ca.crt server.crt server.key /etc/openvpn
每个客户端还需要一个证书,以便 OpenVPN 服务器对其进行身份验证。这些密钥和证书将在服务器上创建,然后您必须将它们复制到您的客户端,我们将在稍后的步骤中执行此操作。建议您为要连接到 VPN 的每个客户端生成单独的密钥和证书。
因为我们只会在这里设置一个客户端,所以我们将其称为 client
,但如果您愿意,可以将其更改为更具描述性的名称:
- cd /etc/openvpn/easy-rsa
- ./build-key client
最后,将版本化的 OpenSSL 配置文件 openssl-1.0.0.cnf
复制到无版本名称 openssl.cnf
。如果不这样做可能会导致 OpenSSL 无法加载配置的错误,因为它无法检测到其版本:
- cp /etc/openvpn/easy-rsa/openssl-1.0.0.cnf /etc/openvpn/easy-rsa/openssl.cnf
现在已经为您的服务器和客户端生成了所有必需的密钥和证书,您可以继续设置两台机器之间的路由。
第 4 步 — 路由
到目前为止,您已经在服务器上安装了 OpenVPN,对其进行了配置,并生成了客户端访问 VPN 所需的密钥和证书。但是,您还没有向 OpenVPN 提供任何关于从客户端发送传入网络流量的说明。您可以通过建立一些防火墙规则和路由配置来规定服务器应如何处理客户端流量。
假设您遵循了本教程开头的先决条件,您应该已经在服务器上安装并运行了 firewalld。要允许 OpenVPN 通过防火墙,您需要知道您的活动 firewalld 区域是什么。使用以下命令找到它:
- sudo firewall-cmd --get-active-zones
Outputtrusted
Interfaces: tun0
接下来,将 openvpn
服务添加到活动区域中 firewalld 允许的服务列表中,然后通过再次运行命令使该设置永久生效,但使用 --permanent
添加选项:
- sudo firewall-cmd --zone=trusted --add-service openvpn
- sudo firewall-cmd --zone=trusted --add-service openvpn --permanent
您可以使用以下命令检查服务是否已正确添加:
- sudo firewall-cmd --list-services --zone=trusted
Outputopenvpn
接下来,将伪装添加到当前运行时实例,然后使用 --permanent
选项再次添加它以将伪装添加到所有未来实例:
- sudo firewall-cmd --add-masquerade
- sudo firewall-cmd --permanent --add-masquerade
您可以使用以下命令检查是否正确添加了伪装:
- sudo firewall-cmd --query-masquerade
Outputyes
接下来,将路由转发到您的 OpenVPN 子网。为此,您可以先创建一个变量(在我们的示例中为 SHARK
),该变量代表您的服务器使用的主要网络接口,然后使用该变量永久添加路由规则:
- SHARK=$(ip route get 8.8.8.8 | awk 'NR==1 {print $(NF-2)}')
- sudo firewall-cmd --permanent --direct --passthrough ipv4 -t nat -A POSTROUTING -s 10.8.0.0/24 -o $SHARK -j MASQUERADE
确保通过重新加载 firewalld 对防火墙规则实施这些更改:
- sudo firewall-cmd --reload
接下来,启用 IP 转发。这会将所有来自您客户端的网络流量路由到您服务器的 IP 地址,并且您客户端的公共 IP 地址将被有效隐藏。
打开 sysctl.conf
进行编辑:
- sudo nano /etc/sysctl.conf
然后在文件顶部添加以下行:
net.ipv4.ip_forward = 1
最后重启网络服务使IP转发生效:
- sudo systemctl restart network.service
路由和防火墙规则就位后,我们可以在服务器上启动 OpenVPN 服务。
第 5 步 — 启动 OpenVPN
OpenVPN 使用 systemctl
作为 systemd 服务进行管理。我们会将 OpenVPN 配置为在启动时启动,这样只要您的服务器正在运行,您就可以随时连接到您的 VPN。为此,通过将 OpenVPN 服务器添加到 systemctl
来启用它:
- sudo systemctl -f enable openvpn@server.service
然后启动OpenVPN服务:
- sudo systemctl start openvpn@server.service
使用以下命令仔细检查 OpenVPN 服务是否处于活动状态。您应该在输出中看到 active (running)
:
- sudo systemctl status openvpn@server.service
Output● openvpn@server.service - OpenVPN Robust And Highly Flexible Tunneling Application On server
Loaded: loaded (/usr/lib/systemd/system/openvpn@.service; enabled; vendor preset: disabled)
Active: **active (running)** since Wed 2018-03-14 15:20:11 EDT; 7s ago
Main PID: 2824 (openvpn)
Status: "Initialization Sequence Completed"
CGroup: /system.slice/system-openvpn.slice/openvpn@server.service
└─2824 /usr/sbin/openvpn --cd /etc/openvpn/ --config server.conf
. . .
我们现在已经完成了 OpenVPN 的服务器端配置。接下来,您将配置您的客户端计算机并连接到 OpenVPN 服务器。
第 6 步 — 配置客户端
无论您的客户端计算机使用何种操作系统,都需要在本地保存的 CA 证书副本和在第 3 步中生成的客户端密钥和证书,以及您在第 2 步结束时生成的静态加密密钥。
在您的服务器上找到以下文件。如果您生成了多个具有唯一的描述性名称的客户端密钥,则密钥和证书名称将不同。在这篇文章中,我们使用了client
。
/etc/openvpn/easy-rsa/keys/ca.crt
/etc/openvpn/easy-rsa/keys/client.crt
/etc/openvpn/easy-rsa/keys/client.key
/etc/openvpn/myvpn.tlsauth
将这些文件复制到您的客户端计算机。您可以使用 SFTP 或您喜欢的方法。您甚至可以只在文本编辑器中打开文件,然后将内容复制并粘贴到客户端计算机上的新文件中。无论您使用哪种方法,请务必记下这些文件的保存位置。
接下来,在您的客户端计算机上创建一个名为 client.ovpn
的文件。这是 OpenVPN 客户端的配置文件,告诉它如何连接到服务器:
- sudo nano client.ovpn
然后将以下行添加到 client.ovpn
。请注意,其中许多行反映了我们取消注释或添加到 server.conf
文件中的行,或者默认情况下已经存在于其中的行:
client
tls-client
ca /path/to/ca.crt
cert /path/to/client.crt
key /path/to/client.key
tls-crypt /path/to/myvpn.tlsauth
remote-cert-eku "TLS Web Client Authentication"
proto udp
remote your_server_ip 1194 udp
dev tun
topology subnet
pull
user nobody
group nobody
添加这些行时,请注意以下事项:
- 您需要更改第一行以反映您在密钥和证书中为客户提供的名称;在我们的例子中,这只是
client
- 您还需要将 IP 地址从
your_server_ip
更新为您服务器的 IP 地址;端口1194
可以保持不变 - 确保密钥和证书文件的路径正确
现在任何 OpenVPN 客户端都可以使用此文件连接到您的服务器。以下是有关如何连接客户端的特定于操作系统的说明:
视窗:
在 Windows 上,您需要带有 GUI 的官方 OpenVPN 社区版二进制文件。将您的 .ovpn
配置文件放入正确的目录,C:\Program Files\OpenVP
苹果系统:
在 macOS 上,开源应用程序 Tunnelblick 提供了一个类似于 Windows 上的 OpenVPN GUI 的界面,并附带了 OpenVPN 和所需的 TUN/TAP 驱动程序。对于 Windows,唯一需要的步骤是将 .ovpn
配置文件放入 ~/Library/Application Support/Tunnelblick/Configurations
目录。或者,您可以双击 .ovpn
文件。
Linux:
在 Linux 上,您应该从发行版的官方存储库安装 OpenVPN。然后,您可以通过执行以下命令来调用 OpenVPN:
- sudo openvpn --config ~/path/to/client.ovpn
成功建立客户端连接后,您可以通过检查 Google 以显示您的公共 IP 来验证您的流量是否通过 VPN 路由。
结论
您现在应该有一个在您的 OpenVPN 服务器上运行的完全可操作的虚拟专用网络。您可以浏览网页和下载内容,而不必担心恶意行为者跟踪您的活动。
您可以采取几个步骤来进一步自定义您的 OpenVPN 安装,例如配置您的客户端以自动连接到 VPN 或配置特定于客户端的规则和访问策略。对于这些和其他 OpenVPN 定制,您应该查阅 7 种安全措施来保护您的服务器。