介绍
虚拟专用网络 (VPN) 允许您像在专用网络上一样穿越不受信任的网络。 当您连接到不受信任的网络(如酒店或咖啡店的 WiFi)时,它让您可以自由地从智能手机或笔记本电脑安全地访问互联网。
当与 HTTPS 连接 结合使用时,此设置可让您保护您的无线登录和交易。 您可以规避地理限制和审查制度,并将您的位置和任何未加密的 HTTP 流量从不受信任的网络中屏蔽。
OpenVPN 是一个功能齐全的开源安全套接字层 (SSL) VPN 解决方案,可适应各种配置。 在本教程中,您将在 CentOS 7 服务器上设置 OpenVPN,然后将其配置为可从客户端计算机访问。
注意: 如果您计划在 DigitalOcean Droplet 上设置 OpenVPN 服务器,请注意,我们与许多托管服务提供商一样,会对带宽超额收费。 因此,请注意您的服务器正在处理多少流量。
有关详细信息,请参阅 本页。
先决条件
要遵循本教程,您将需要:
- 一台具有 sudo 非 root 用户的 CentOS 7 服务器和使用 firewalld 设置的防火墙,您可以通过我们的 CentOS 7 初始服务器设置指南和 新 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)的连接问题:
/etc/openvpn/server.conf
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 地址来设置:
/etc/openvpn/server.conf
push "dhcp-option DNS 8.8.8.8" push "dhcp-option DNS 8.8.4.4"
我们希望 OpenVPN 一旦启动就可以在没有特权的情况下运行,所以我们需要告诉它使用 nobody 的用户和组运行。 要启用此功能,请取消注释 user nobody
和 group nobody
行:
/etc/openvpn/server.conf
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
:
/etc/openvpn/server.conf
topology subnet
还建议您将以下行添加到服务器配置文件中。 这会仔细检查任何传入的客户端证书是否真正来自客户端,从而强化我们将在后续步骤中建立的安全参数:
/etc/openvpn/server.conf
remote-cert-eku "TLS Web Client Authentication"
最后,OpenVPN 强烈建议用户启用 TLS 身份验证,这是一种确保通过计算机网络进行安全通信的加密协议。 为此,您需要生成一个静态加密密钥(在我们的示例中命名为 myvpn.tlsauth
,尽管您可以选择任何您喜欢的名称)。 在创建此密钥之前,请在配置文件中包含 tls-auth ta.key 0
的行前加分号来注释它。 然后,将 tls-crypt myvpn.tlsauth
添加到它下面的行:
/etc/openvpn/server.conf
;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
。 如果您输入其他内容,您还必须更新引用server.key
和server.crt
的配置文件。
此文件中您可能要更改的其他变量是:
KEY_COUNTRY
:对于这个变量,输入您居住的国家的两个字母的缩写。KEY_PROVINCE
:这应该是您所在州的名称或缩写。KEY_CITY
:在这里,输入您居住的城市的名称。KEY_ORG
:这应该是您的组织或公司的名称。KEY_EMAIL
:输入您要连接到安全证书的电子邮件地址。KEY_OU
:这应该是您所属的“组织单位”的名称,通常是您的部门或团队的名称。
在特定用例之外,可以安全地忽略其余变量。 进行更改后,文件应如下所示:
/etc/openvpn/easy-rsa/vars
. . . # 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 提供任何有关从客户端发送传入 Web 流量的说明。 您可以通过建立一些防火墙规则和路由配置来规定服务器应如何处理客户端流量。
假设您在本教程开始时遵循了先决条件,您应该已经在您的服务器上安装并运行了 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
然后在文件顶部添加以下行:
/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
文件中的行,或者默认情况下已经在其中的行:
客户端.ovpn
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\OpenVPN\config
,然后在 GUI 中单击 Connect。 Windows 上的 OpenVPN GUI 必须以管理权限执行。
苹果系统:
在 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 自定义,您应该查阅 官方 OpenVPN 文档 。 如果您对可以在 Internet 上保护自己和机器的其他方式感兴趣,请查看我们关于 7 保护服务器的安全措施 的文章。