介绍
虚拟专用网络(VPN)允许您像在专用网络上一样穿越不受信任的网络。当您的智能手机或笔记本电脑连接到不受信任的网络(如酒店或咖啡店的WiFi)时,它可以让您自由安全地访问互联网。当与HTTPS连接结合使用时,此设置允许您保护您的无线登录和交易。您可以规避地理限制和审查,保护您的位置和任何未加密的HTTP流量不受不可信网络的影响。OpenVPN是一个全功能、开源的安全套接字层(SSL) VPN解决方案,支持多种配置。在本教程中,您将在CentOS 7服务器上设置OpenVPN,然后将其配置为可从客户端机器访问。
前提
要学习本教程,您需要:
一台CentOS 7服务器,一个sudo非root用户,一个用firewalld设置的防火墙,您可以通过我们的CentOS 7服务器初始设置指南和新CentOS 7服务器的其他建议步骤来实现。
解析到您的服务器并可用于证书的域或子域。要进行设置,您首先需要注册一个域名,然后通过DigitalOcean控制面板添加一个DNS记录。注意,只要添加一条A记录就可以满足本教程的要求。
您将用来连接到OpenVPN服务器的客户机。出于本教程的目的,建议您使用本地机器作为OpenVPN客户端。
步骤1 —安装OpenVPN
首先,我们将在服务器上安装OpenVPN。我们还将安装Easy RSA,这是一个公钥基础设施管理工具,它将帮助我们建立一个内部证书颁发机构(CA ),用于我们的VPN。稍后,我们还将使用Easy RSA来生成SSL密钥对,以保护VPN连接。
以非根sudo用户的身份登录到服务器,并更新包列表以确保您拥有所有最新版本。
sudo yum update -y
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,下载简易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
然后将目录的所有者更改为您的非根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 de f1 bypass-DHCP”的行。这样做将告诉您的客户端通过您的OpenVPN服务器重定向其所有流量。请注意,启用此功能可能会导致与其他网络服务(如SSH)的连接问题:
因为您的客户端将无法使用ISP提供的默认DNS服务器(因为它的流量将被重新路由),所以您需要告诉它可以使用哪些DNS服务器连接到OpenVPN。你可以选择不同的DNS服务器,但这里我们将使用谷歌的公共DNS服务器,它们拥有8.8.8.8和8.8.4.4的IP地址。
通过取消对“dhcp-option DNS ...”的注释来进行设置线路和更新IP地址:
我们希望OpenVPN在启动后运行时没有特权,所以我们需要告诉它使用一个用户和一组nobody来运行。为此,取消对user nobody和group nobody行的注释:
接下来,取消对拓扑子网行的注释。这与它下面的server 10.8.0.0 255.255.255.0行一起,将您的OpenVPN安装配置为作为子网运行,并告诉客户机应该使用哪个IP地址。在这种情况下,服务器将变成10.8.0.1,第一个客户机将变成10.8.0.2:
还建议您将下面一行添加到服务器配置文件中。这双重检查任何传入的客户端证书是否确实来自客户端,强化了我们将在后面的步骤中建立的安全参数:
最后,OpenVPN强烈建议用户启用TLS认证,这是一种确保计算机网络安全通信的加密协议。为此,您将需要生成一个静态加密密钥(在我们的示例中命名为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:这应该是您所属的“组织单位”的名称,通常是您的部门或团队的名称。
除了特定的用例之外,其余的变量可以安全地忽略。完成更改后,文件应该如下所示:
保存并关闭文件。
要开始生成密钥和证书,请转到easy-rsa目录,并在vars文件中设置新变量:
cd /etc/openvpn/easy-rsasource ./vars
运行Easy RSA的全部清除脚本,删除文件夹中已有的任何密钥和证书,并生成证书颁发机构:
./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/keyssudo cp dh2048.pem ca.crt server.crt server.key /etc/openvpn
每个客户端还需要一个证书,以便OpenVPN服务器对其进行认证。这些密钥和证书将在服务器上创建,然后您必须将它们复制到您的客户端,这将在后面的步骤中完成。建议您为打算连接到VPN的每个客户端生成单独的密钥和证书。
因为我们在这里只设置一个客户端,所以我们称它为客户端,但是如果您愿意,您可以将其更改为更具描述性的名称:
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通过防火墙,您需要知道您的活动防火墙区域是什么。使用以下命令找到它:
sudo firewall-cmd --get-active-zones
接下来,将openvpn服务添加到活动区域内firewalld允许的服务列表中,然后通过再次运行该命令并添加- permanent选项来使该设置永久化:
sudo firewall-cmd --zone=trusted --add-service openvpnsudo firewall-cmd --zone=trusted --add-service openvpn --permanent
您可以使用以下命令检查服务是否已正确添加:
sudo firewall-cmd --list-services --zone=trusted
接下来,将伪装添加到当前运行时实例,然后使用- permanent选项再次添加它,以将伪装添加到所有未来的实例:
sudo firewall-cmd --add-masqueradesudo firewall-cmd --permanent --add-masquerade
您可以使用以下命令检查伪装是否已正确添加:
sudo firewall-cmd --query-masquerade
接下来,将路由转发到您的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
然后在文件顶部添加以下行:
最后,重新启动网络服务,使IP转发生效:
sudo systemctl restart network.service
有了路由和防火墙规则,我们就可以在服务器上启动OpenVPN服务了。
步骤5 —启动OpenVPN
使用systemctl将OpenVPN作为systemd服务进行管理。我们将配置OpenVPN在启动时启动,这样只要您的服务器在运行,您就可以随时连接到您的VPN。为此,通过将OpenVPN服务器添加到systemctl:
sudo systemctl -f enable openvpn@server.service
然后启动OpenVPN服务:
sudo systemctl start openvpn@server.service
使用以下命令仔细检查OpenVPN服务是否处于活动状态。您应该在输出中看到active(正在运行):
sudo systemctl status openvpn@server.service
我们现在已经完成了OpenVPN的服务器端配置。接下来,您将配置您的客户机并连接到OpenVPN服务器。
步骤6 —配置客户端
不管您的客户端机器的操作系统是什么,它都需要CA证书和在步骤3中生成的客户端密钥和证书的本地保存副本,以及您在步骤2结束时生成的静态加密密钥。
在您的服务器上找到下列文件。如果您生成了多个具有唯一的描述性名称的客户端密钥,那么密钥和证书名称将会不同。在本文中,我们使用客户端。
将这些文件复制到您的客户机上。你可以使用SFTP或你喜欢的方法。您甚至可以在文本编辑器中打开文件,将内容复制并粘贴到客户机上的新文件中。无论您使用哪种方法,请务必记下保存这些文件的位置。
接下来,在客户机上创建一个名为client.ovpn的文件。这是一个OpenVPN客户端的配置文件,告诉它如何连接到服务器:
sudo nano client.ovpn
然后将以下行添加到client.ovpn中。请注意,这些行中的许多行反映了我们取消注释或添加到server.conf文件中的行,或者默认情况下已经存在的行:
添加这些行时,请注意以下几点:
您需要更改第一行,以反映您在密钥和证书中提供给客户端的名称;在我们的例子中,这只是client您还需要将ip地址从your_server_ip更新为您的服务器的IP地址;端口1194可以保持不变确保您的密钥和证书文件的路径是正确的
现在,任何OpenVPN客户端都可以使用该文件连接到您的服务器。以下是有关如何连接客户端的特定于操作系统的说明:
Windows:在Windows上,您将需要官方的OpenVPN社区版二进制文件,它带有一个GUI。把你的.ovpn配置文件放到正确的目录C:/Program Files/OpenVPN/config中,然后在GUI中单击Connect。Windows上的OpenVPN GUI必须以管理权限执行。macOS:在macOS上,开源应用Tunnelblick提供了一个类似于Windows上的OpenVPN GUI的界面,并附带了OpenVPN和所需的TUN/TAP驱动程序。与Windows一样,唯一需要的步骤是将您的.ovpn配置文件放到~/Library/Application Support/Tunnelblick/configuration s目录中。或者,您可以双击您的.ovpn文件。Linux:在Linux上,您应该从发行版的官方存储库中安装OpenVPN。然后,您可以通过执行以下命令来调用OpenVPN:sudo openvpn --config ~/path/to/client.ovpn在您成功建立客户端连接之后,您可以通过检查Google显示您的公共IP来验证您的流量是通过VPN路由的。