前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。
简介
虚拟专用网络(VPN)允许您在不受信任的网络中穿行,就像您在私人网络上一样。它使您能够在连接到不受信任的网络(如酒店或咖啡店的WiFi)时,从智能手机或笔记本电脑安全地访问互联网。
与HTTPS连接结合使用时,此设置允许您保护无线登录和交易。您可以绕过地理限制和审查,并保护您的位置以及来自不受信任网络的任何未加密的HTTP流量。
OpenVPN是一个功能齐全的开源安全套接字层(SSL)VPN解决方案,适用于各种配置。在本教程中,您将在CentOS 7服务器上设置OpenVPN,然后配置它以便从客户机访问。
先决条件
要按照本教程操作,您需要:
- 一个安装了sudo非root用户和使用firewalld设置了防火墙的CentOS 7服务器,您可以通过我们的《在CentOS 7上进行初始服务器设置》和《新CentOS 7服务器的其他推荐步骤》来实现。
- 一个解析到您的服务器的域名或子域名,您可以用于证书。要设置这一点,您首先需要注册一个域名,然后通过DigitalOcean控制面板添加DNS记录。请注意,只添加A记录将满足本教程的要求。
- 一个客户机,您将使用它连接到您的OpenVPN服务器。出于本教程的目的,建议您使用本地机器作为OpenVPN客户端。
具备这些先决条件后,您就可以开始在CentOS 7上设置和配置OpenVPN服务器了。
步骤1 — 安装OpenVPN
首先,我们将在服务器上安装OpenVPN。我们还将安装Easy RSA,这是一个公钥基础设施管理工具,它将帮助我们为VPN设置一个内部证书颁发机构(CA)。我们稍后还将使用Easy RSA生成我们的SSL密钥对,以保护VPN连接。
以非root sudo用户身份登录服务器,并更新软件包列表,以确保您拥有所有最新版本。
sudo yum update -y
额外的企业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,因为该版本有更多的可用文档。您可以在项目的Releases页面上找到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在启动后不具备特权,因此我们需要告诉它以nobody用户和组运行。为此,请取消注释
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
现在,您的服务器已配置完成,可以继续设置SSL密钥和证书,以便安全连接到您的VPN连接。
步骤 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
:这应该是您所属的“组织单位”的名称,通常是您的部门或团队的名称。
除特定用例外,可以安全地忽略其他变量。完成更改后,文件应如下所示:
. . .
# 这些是将放置在证书中的字段的默认值。
# 不要留空这些字段。
export KEY_COUNTRY="US"
export KEY_PROVINCE="NY"
export KEY_CITY="New York"
export KEY_ORG="DigitalOcean"
export KEY_EMAIL="[email protected]"
export [email protected]
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
trusted
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
openvpn
接下来,在当前运行实例中添加伪装,并再次使用
--permanent
选项将伪装添加到所有未来实例中:
sudo firewall-cmd --add-masquerade
sudo firewall-cmd --permanent --add-masquerade
您可以使用以下命令检查伪装是否已正确添加:
sudo firewall-cmd --query-masquerade
yes
接下来,将路由转发到您的 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。为此,通过将其添加到
systemctl
来启用 OpenVPN 服务器:
sudo systemctl -f enable [email protected]
然后启动 OpenVPN 服务:
sudo systemctl start [email protected]
使用以下命令再次检查 OpenVPN 服务是否处于活动状态。您应该在输出中看到
active (running)
:
sudo systemctl status [email protected]
● [email protected] - OpenVPN Robust And Highly Flexible Tunneling Application On server
Loaded: loaded (/usr/lib/systemd/system/[email protected]; 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/[email protected]
└─2824 /usr/sbin/openvpn --cd /etc/openvpn/ --config server.conf
. . .
我们现在已经完成了 OpenVPN 的服务器端配置。接下来,您将配置您的客户端机器并连接到 OpenVPN 服务器。
步骤 6 —— 配置客户端
无论您的客户端机器使用的是什么操作系统,它都需要在 Step 3 生成的 CA 证书和客户端密钥和证书的本地副本,以及您在 Step 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 客户端的配置文件,告诉它如何连接到服务器:
[environment local]
sudo nano client.ovpn
然后将以下行添加到
client.ovpn
。请注意,其中许多行反映了我们在
server.conf
文件中取消注释或添加的行,或者默认情况下已经存在的行:
[environment local]
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:
在 Windows 上,您将需要官方的 OpenVPN Community Edition 二进制文件,它带有一个 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/Configurations
目录。或者,您可以双击您的
.ovpn
文件。
Linux:
在 Linux 上,您应该从您发行版的官方仓库中安装 OpenVPN。然后,您可以通过执行以下命令来调用 OpenVPN:
[environment local]
sudo openvpn --config ~/path/to/client.ovpn
建立成功的客户端连接后,您可以通过检查 Google 来验证您的流量是否通过 VPN 路由,以显示您的公共 IP。
结论
现在您应该已经在您的 OpenVPN 服务器上运行了一个完全可操作的虚拟专用网络。您可以浏览网页并下载内容,而不必担心恶意行为者跟踪您的活动。
您可以采取几个步骤来进一步定制您的 OpenVPN 安装,例如配置您的客户端以自动连接到 VPN,或配置客户端特定的规则和访问策略。对于这些和其他 OpenVPN 定制,您应该参考官方的 OpenVPN 文档。如果您对在互联网上保护自己和您的设备的其他方法感兴趣,请查看我们的文章《7种保护服务器的安全措施》。
版权归原作者 白如意i 所有, 如有侵权,请联系我们删除。