自学内容网 自学内容网

如何在 CentOS 7 上设置和配置 OpenVPN 服务器

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站

简介

虚拟专用网络(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.88.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 nobodygroup 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 - XY,然后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.keyserver.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="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

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 openvpn@server.service

然后启动 OpenVPN 服务:

sudo systemctl start openvpn@server.service

使用以下命令再次检查 OpenVPN 服务是否处于活动状态。您应该在输出中看到 active (running)

sudo systemctl status openvpn@server.service

● 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 —— 配置客户端

无论您的客户端机器使用的是什么操作系统,它都需要在 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种保护服务器的安全措施》。


原文地址:https://blog.csdn.net/rubys007/article/details/143496668

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!