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

介绍

虚拟私人网络(https://en.wikipedia.org/wiki/Virtual_private_network)(VPN)允许您穿过不受信任的网络,就像您在私人网络上一样。

当与 HTTPS 连接相结合时,此设置允许您保护无线登录和交易,您可以绕过地理限制和审查,并保护您的位置和未加密的 HTTP 流量免受不受信任的网络的影响。

OpenVPN是一个完整的,开源的Secure Socket Layer(SSL)VPN解决方案,可容纳广泛的配置. 在本教程中,您将在CentOS 7服务器上设置OpenVPN,然后将其配置为从客户端机器上访问。

<$>[注] 注: 如果您打算在DigitalOcean Droplet上设置一个OpenVPN服务器,请注意,像许多托管提供商一样,我们会收取带宽过期费用。

请参阅此页面(https://www.digitalocean.com/docs/accounts/billing/bandwidth/)以获取更多信息。

前提条件

要遵循本教程,您将需要:

有了这些前提条件,您可以开始在CentOS 7上设置和配置OpenVPN服务器。

步骤 1 – 安装 OpenVPN

首先,我们将在服务器上安装OpenVPN,我们还将安装Easy RSA,一个公共密钥基础设施管理工具,这将有助于我们设置内部证书授权机构(CA)用于使用我们的VPN,我们还将使用Easy RSA来生成我们的SSL密钥对,以确保VPN连接。

登录服务器作为非 root sudo 用户,并更新包列表,以确保您拥有所有最新版本。

1sudo yum update -y

用于企业 Linux 的 Extra Packages (EPEL) 存储库是一个由 Fedora 项目管理的额外存储库,包含非标准但受欢迎的软件包。

1sudo yum install epel-release -y

然后再更新您的包列表:

1sudo yum update -y

接下来,安装OpenVPN和wget,我们将使用它来安装Easy RSA:

1sudo yum install -y openvpn wget

使用「wget」,下載 Easy RSA. 為本教程的目的,我們建議使用 easy-rsa-2 因為這個版本有更多可用的文檔. 你可以在項目的 發行頁面上找到 easy-rsa-2 最新版本的下載鏈接:

1wget -O /tmp/easyrsa https://github.com/OpenVPN/easy-rsa-old/archive/2.3.3.tar.gz

接下来,用tar提取压缩文件:

1tar xfz /tmp/easyrsa

这将在您的服务器上创建一个名为easy-rsa-old-2.3.3的新目录,在/etc/openvpn下创建一个新的子目录,并将其命名为easy-rsa:

1sudo mkdir /etc/openvpn/easy-rsa

将提取的 Easy RSA 文件复制到新的目录:

1sudo cp -rf easy-rsa-old-2.3.3/easy-rsa/2.0/* /etc/openvpn/easy-rsa

然后将目录的所有者更改为您的非 root sudo 用户:

1sudo chown sammy /etc/openvpn/easy-rsa/

一旦这些程序被安装并移动到您的系统的正确位置,下一步是定制OpenVPN的服务器侧配置。

步骤 2 – 配置 OpenVPN

与许多其他广泛使用的开源工具一样,有数十种配置选项可供您使用. 在本节中,我们将提供有关如何设置基本的OpenVPN服务器配置的说明。

OpenVPN在其文档目录中有几个示例配置文件. 首先,复制示例 server.conf 文件作为您自己的配置文件的起点。

1sudo cp /usr/share/doc/openvpn-2.4.4/sample/sample-config-files/server.conf /etc/openvpn

我们将在我们的示例中使用nano,您可以通过yum install nano命令下载,如果您已经没有在服务器上:

1sudo nano /etc/openvpn/server.conf

我们需要在这个文件中更改几行,其中大多数只需要通过删除半栏, ;,在行开头删除评论,这些行的功能,以及本教程中没有提到的其他行,在上面的评论中详细解释。

要开始,请查找并删除包含‘推‘redirect-gateway def1 bypass-dhcp’的行。这样做会告诉您的客户端通过您的OpenVPN服务器重定向所有流量。请注意,启用此功能可能会导致其他网络服务(如SSH)的连接问题:

1[label /etc/openvpn/server.conf]
2push "redirect-gateway def1 bypass-dhcp"

由于您的客户端将无法使用您的ISP提供的默认DNS服务器(因为其流量将被重定向),您需要告诉客户端可以使用哪些DNS服务器连接到OpenVPN。

将此设置为dhcp-option DNS...``两行,并更新 IP 地址:

1[label /etc/openvpn/server.conf]
2push "dhcp-option DNS 8.8.8.8"
3push "dhcp-option DNS 8.8.4.4"

我们希望OpenVPN在启动后运行没有特权,所以我们需要告诉它与用户和组 nobody一起运行。

1[label /etc/openvpn/server.conf]
2user nobody
3group nobody

接下来,删除topology subnet行. 这与server 10.8.0.0 255.255.255.0行一起,将您的OpenVPN安装配置为子网络,并告诉客户端机器应该使用哪个IP地址。

1[label /etc/openvpn/server.conf]
2topology subnet

还建议您将下列行添加到您的服务器配置文件中,这双重检查到任何接入的客户端证书确实来自客户端,从而加强了我们将在以后的步骤中建立的安全参数:

1[label /etc/openvpn/server.conf]
2remote-cert-eku "TLS Web Client Authentication"

最后,OpenVPN强烈建议用户启用TLS身份验证,这是一种加密协议,可确保计算机网络上的安全通信。 要做到这一点,您需要生成一个静态加密密钥(在我们的例子中被命名为myvpn.tlsauth),尽管您可以选择您喜欢的任何名称)。 在创建此密钥之前,请在配置文件中含有tls-auth ta.key 0的行评论,然后用半色符号预先加到下面的行:

1[label /etc/openvpn/server.conf]
2;tls-auth ta.key 0
3tls-crypt myvpn.tlsauth

保存并退出OpenVPN服务器配置文件(用纳米语,按CTRL - X,Y,然后按ENTER来执行),然后用以下命令生成静态加密密钥:

1sudo openvpn --genkey --secret /etc/openvpn/myvpn.tlsauth

现在,您的服务器已配置,您可以继续设置所需的SSL密钥和证书,以安全连接到您的VPN连接。

步骤 3 – 生成密钥和证书

Easy RSA 使用一组与程序一起安装的脚本来生成密钥和证书. 为了避免每次需要生成证书时重新配置,您可以修改 Easy RSA 的配置,以定义其将用于证书字段的默认值,包括您的国家、城市和偏好电子邮件地址。

我们将通过创建一个目录开始我们生成密钥和证书的过程,Easy RSA将存储您生成的任何密钥和证书:

1sudo mkdir /etc/openvpn/easy-rsa/keys

默认证书变量设置在 vars 文件中 /etc/openvpn/easy-rsa,所以打开该文件进行编辑:

1sudo nano /etc/openvpn/easy-rsa/vars

滚动到文件的底部,并更改以「export KEY_」开始的值以匹配您的信息。

  • KEY_CN:在这里,输入解决到您的服务器的域或子域。
  • KEY_NAME:您应该在这里输入 server. 如果您输入了其他东西,您还需要更新引用 server.keyserver.crt 的配置文件。

您可能想要更改的文件中的其他变量是:

  • KEY_COUNTRY:对于这个变量,请输入您居住的国家的两个字母缩写。
  • KEY_PROVINCE:这应该是您居住的国家的名称或缩写。
  • KEY_CITY:在这里输入您居住的城市的名称。
  • KEY_ORG:这应该是您的组织或公司名称。

其他变量可以安全地忽略在特定用例之外,在您更改后,该文件应该看起来如下:

 1[label /etc/openvpn/easy-rsa/vars]
 2. . .
 3
 4# These are the default values for fields
 5# which will be placed in the certificate.
 6# Don't leave any of these fields blank.
 7export KEY_COUNTRY="US"
 8export KEY_PROVINCE="NY"
 9export KEY_CITY="New York"
10export KEY_ORG="DigitalOcean"
11export KEY_EMAIL="[email protected]"
12export KEY_EMAIL=sammy@example.com
13export KEY_CN=openvpn.example.com
14export KEY_NAME="server"
15export KEY_OU="Community"
16. . .

保存并关闭文件。

要开始生成密钥和证书,请进入easy-rsa目录和source在您在vars文件中设置的新变量中:

1cd /etc/openvpn/easy-rsa
2source ./vars

运行 Easy RSA 的清除所有脚本,删除文件夹中的任何密钥和证书,并生成证书权限:

1./clean-all

接下来,使用build-ca脚本构建证书权限,您将被要求为证书字段输入值,但如果您早些时候在vars文件中设置了变量,您的所有选项都将被设置为默认值。

1./build-ca

这个脚本会生成一个名为ca.key的文件,这是用于签署您的服务器和客户端证书的私钥,如果丢失,您将无法再信任该证书机构的任何证书,如果任何人能够访问该文件,他们可以签署新的证书,并在您不知情的情况下访问您的VPN,因此OpenVPN建议将ca.key存储在尽可能远离的位置,并且只有在创建新证书时才能激活。

接下来,使用build-key-server脚本为服务器创建一个密钥和证书:

1./build-key-server server

与构建 CA 一样,您将看到您已设置的值作为默认值,因此您可以在这些提示下按ENTER。 此外,您将被要求输入挑战密码和可选的公司名称。 如果您输入挑战密码,您将被要求在连接到您的客户端的 VPN 时。

创建服务器密钥和证书的最后一部分是生成一个Diffie-Hellman密钥交换文件。

1./build-dh

这可能需要几分钟才能完成。

一旦您的服务器完成了关键交换文件的生成,将服务器密钥和证书从‘keys’目录复制到‘openvpn’目录:

1cd /etc/openvpn/easy-rsa/keys
2sudo cp dh2048.pem ca.crt server.crt server.key /etc/openvpn

每个客户端还需要一个证书,以便OpenVPN服务器验证其身份. 这些密钥和证书将在服务器上创建,然后您将不得不将其复制到您的客户端,我们将在稍后的一步中完成。

因为我们只会在这里设置一个客户端,所以我们称之为客户端,但如果您喜欢的话,您可以更改这个名称以更为描述性:

1cd /etc/openvpn/easy-rsa
2./build-key client

最后,将版本的 OpenSSL 配置文件, openssl-1.0.0.cnf,复制到无版本的名称, openssl.cnf。

1cp /etc/openvpn/easy-rsa/openssl-1.0.0.cnf /etc/openvpn/easy-rsa/openssl.cnf

现在为您的服务器和客户端生成了所有必要的密钥和证书,您可以继续设置两台机器之间的路由。

步骤4:路线

到目前为止,您已经在您的服务器上安装了 OpenVPN,配置了它,并生成了客户端访问VPN所需的密钥和证书,但您尚未向OpenVPN提供有关从客户端发送入口网络流量的任何说明。

假设你在本教程开始时遵循了前提条件,你应该已经安装了 firewalld 并在你的服务器上运行。 要允许 OpenVPN 通过防火墙,你需要知道你的活跃防火墙区是什么。

1sudo firewall-cmd --get-active-zones
1[secondary_label Output]
2trusted
3  Interfaces: tun0

接下来,将openvpn服务添加到您的活跃区域内 firewalld 允许的服务列表中,然后通过再次运行命令而使该设置永久化,但添加了--永久选项:

1sudo firewall-cmd --zone=trusted --add-service openvpn
2sudo firewall-cmd --zone=trusted --add-service openvpn --permanent

您可以通过以下命令检查是否正确添加了服务:

1sudo firewall-cmd --list-services --zone=trusted
1[secondary_label Output]
2openvpn

接下来,向当前的运行时实例添加一个伪装,然后再用--永久选项添加它,将伪装添加到所有未来的实例中:

1sudo firewall-cmd --add-masquerade
2sudo firewall-cmd --permanent --add-masquerade

您可以通过此命令检查是否正确添加了面具:

1sudo firewall-cmd --query-masquerade
1[secondary_label Output]
2yes

您可以这样做,首先创建一个变量(‘SHARK’在我们的示例中),它将代表您的服务器使用的主要网络接口,然后使用该变量永久添加路由规则:

1SHARK=$(ip route get 8.8.8.8 | awk 'NR==1 {print $(NF-2)}')
2sudo firewall-cmd --permanent --direct --passthrough ipv4 -t nat -A POSTROUTING -s 10.8.0.0/24 -o $SHARK -j MASQUERADE

请确保通过重新加载 firewalld 将这些更改应用于您的防火墙规则:

1sudo firewall-cmd --reload

接下来,启用IP转发,这将将从您的客户端的所有网络流量路由到您的服务器的IP地址,并且您的客户端的公共IP地址将有效地隐藏。

打开sysctl.conf来编辑:

1sudo nano /etc/sysctl.conf

然后在文件的顶部添加以下行:

1[label /etc/sysctl.conf]
2net.ipv4.ip_forward = 1

最后,重新启动网络服务,以便IP转发生效:

1sudo systemctl restart network.service

有了路由和防火墙规则,我们可以在服务器上启动OpenVPN服务。

步骤 5 – 启动 OpenVPN

OpenVPN 被管理为使用systemctl的 systemd 服务,我们会将 OpenVPN 配置为在启动时启动,以便在服务器运行时随时连接到您的 VPN。

1sudo systemctl -f enable [email protected]

然后启动OpenVPN服务:

1sudo systemctl start [email protected]

您应该在输出中看到活跃(运行):

1sudo systemctl status [email protected]
1[secondary_label Output]
2 openvpn@server.service - OpenVPN Robust And Highly Flexible Tunneling Application On server
3   Loaded: loaded (/usr/lib/systemd/system/openvpn@.service; enabled; vendor preset: disabled)
4   Active: **active (running)** since Wed 2018-03-14 15:20:11 EDT; 7s ago
5 Main PID: 2824 (openvpn)
6   Status: "Initialization Sequence Completed"
7   CGroup: /system.slice/system-openvpn.slice/openvpn@server.service
8           └─2824 /usr/sbin/openvpn --cd /etc/openvpn/ --config server.conf
9. . .

我们已经完成了OpenVPN的服务器侧配置,接下来,您将配置客户端机器并连接到OpenVPN服务器。

步骤 6 – 配置客户端

无论您的客户端机器的操作系统如何,它都需要一个本地保存的CA证书和第3步生成的客户端密钥和证书的副本,以及第2步结束时生成的静态加密密钥。

在您的服务器上找到以下文件 ** 如果您生成了多个具有独特的描述性名称的客户端密钥,那么密钥和证书名称将不同。

1/etc/openvpn/easy-rsa/keys/ca.crt
2/etc/openvpn/easy-rsa/keys/client.crt
3/etc/openvpn/easy-rsa/keys/client.key
4/etc/openvpn/myvpn.tlsauth

您可以使用 SFTP或您偏好的方法. 您甚至可以简单地在文本编辑器中打开文件,并将内容复制并粘贴到客户端机器上的新文件中。

接下来,在您的客户端机器上创建一个名为client.ovpn **的文件,这是一个OpenVPN客户端的配置文件,告诉它如何连接到服务器:

1[environment local]
2sudo nano client.ovpn

请注意,许多这些行反映了我们没有评论或添加到「server.conf」文件中的那些行,或者默认情况下已经在其中:

 1[label client.ovpn]
 2[environment local]
 3client
 4tls-client
 5ca /path/to/ca.crt
 6cert /path/to/client.crt
 7key /path/to/client.key
 8tls-crypt /path/to/myvpn.tlsauth
 9remote-cert-eku "TLS Web Client Authentication"
10proto udp
11remote your_server_ip 1194 udp
12dev tun
13topology subnet
14pull
15user nobody
16group nobody

添加这些行时,请注意以下几点:

  • 您需要更改第一行以反映您在密钥和证书中给客户端的名称;在我们的情况下,这只是客户端
  • 您还需要从your_server_ip更新IP地址到您的服务器的IP地址;端口1194可以保持相同
  • 确保您的密钥和证书文件的路径正确

此文件现在可以被任何OpenVPN客户端使用来连接到您的服务器。

维生素:**

在 Windows 上,您将需要官方的 OpenVPN Community Edition 二进制 附带 GUI. 将您的 .ovpn 配置文件放入适当的目录, C:\Program Files\OpenVPN\config,然后在 GUI 中点击 Connect

• macOS: *

在 macOS 上,开源应用程序 Tunnelblick提供类似于 Windows 上的 OpenVPN GUI 的接口,并配备了 OpenVPN 和所需的 TUN/TAP 驱动程序。 与 Windows 一样,所需的唯一步骤是将您的 .ovpn 配置文件放入 `~ / 图书馆 / 应用支持 / Tunnelblick / 配置的目录。

• Linux: *

在 Linux 上,您应该从发行版的官方存储库中安装 OpenVPN。

1[environment local]
2sudo openvpn --config ~/path/to/client.ovpn

建立成功的客户端连接后,您可以通过 检查 Google 揭示您的公共 IP来验证您的流量正在通过VPN进行路由。

结论

您现在应该有一个完全运行的虚拟私人网络在您的OpenVPN服务器上运行,您可以浏览网络和下载内容,而不必担心恶意行为者跟踪您的活动。

您可以采取若干步骤来进一步定制您的 OpenVPN 安装,例如将客户端配置为自动连接到 VPN 或配置客户端特定的规则和访问策略. 对于这些和其他 OpenVPN 定制,您应该参阅 官方 OpenVPN 文档

Published At
Categories with 技术
comments powered by Disqus