跳至内容

OpenVPN

简介

OpenVPN 是一个免费且开源的虚拟专用网络 (VPN)。本文将指导您使用 X509 公钥基础设施 (PKI) 设置 OpenVPN。本指南需要一个具有公共 IP 地址的 Rocky Linux 系统,因为 OpenVPN 采用客户端/服务器模型。实现这一点的最简单方法是通过您选择的云提供商创建一个虚拟专用服务器 (VPS)。在撰写本文时,Google Cloud Platform 为其 e2-micro 实例提供免费套餐。如果您正在寻找一种最简单的 OpenVPN 设置,使用无需 PKI 的点对点 (p2p) VPN,请参考他们的 静态密钥简易指南

先决条件和假设

以下是此过程的最低要求

  • 能够以 root 用户身份运行命令或使用 sudo 提升权限
  • 一个具有公共可访问 IP 的 Rocky Linux 系统

安装 OpenVPN

安装企业 Linux 附加软件包 (EPEL) 存储库

sudo dnf install epel-release -y

安装 OpenVPN

sudo dnf install openvpn -y

设置证书颁发机构 (CA)

安装 easy-rsa

sudo dnf install easy-rsa -y

/etc/openvpn 中创建 easy-rsa 目录

sudo mkdir /etc/openvpn/easy-rsa

创建到 easy-rsa 文件的符号链接

sudo ln -s /usr/share/easy-rsa /etc/openvpn/easy-rsa

更改目录到 /etc/openvpn/easy-rsa

cd /etc/openvpn/easy-rsa

运行带 init-pki 参数的 easyrsa 脚本以初始化证书颁发机构的 PKI

sudo ./easy-rsa/3/easyrsa init-pki

运行带 build-canopass 参数的 easyrsa 脚本以在没有密码的情况下构建证书颁发机构

sudo ./easy-rsa/3/easyrsa build-ca nopass

创建证书

运行带 gen-reqnopass 参数的 easyrsa 脚本以在没有密码的情况下生成服务器证书

sudo ./easy-rsa/3/easyrsa gen-req server nopass

运行带 sign-reqserver 参数的 easyrsa 脚本以签名服务器证书

sudo ./easy-rsa/3/easyrsa sign-req server server

注意

您可以根据需要重复以下步骤来为其他客户端创建证书。

运行带 gen-reqnopass 参数的 easyrsa 脚本以在没有密码的情况下生成客户端证书

sudo ./easy-rsa/3/easyrsa gen-req client1 nopass

运行带 sign-reqclient 参数的 easyrsa 脚本以在没有密码的情况下签名客户端证书

sudo ./easy-rsa/3/easyrsa sign-req client client1

OpenVPN 需要 Diffie Hellman 参数。运行此命令生成它们

sudo ./easy-rsa/3/easyrsa gen-dh

配置 OpenVPN

PKI 创建完成后,就可以配置 OpenVPN 了。

server.conf 示例文件复制到 /etc/openvpn

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

使用您选择的编辑器打开并写入 server.conf

sudo vim /etc/openvpn/server.conf

接下来,您必须将证书颁发机构、服务器证书和服务器密钥的文件路径添加到 OpenVPN 服务器配置文件中。

复制并将密钥和证书的文件路径粘贴到第 78-80 行

注意

在 Vim 中,您可以使用 :set nu 命令为当前编辑添加行号

ca /etc/openvpn/easy-rsa/pki/ca.crt
cert /etc/openvpn/easy-rsa/pki/issued/server.crt
key /etc/openvpn/easy-rsa/pki/private/server.key  # This file should be kept secret

复制并将 Diffie Hellman 文件路径粘贴到示例文件 server.conf 的第 85 行

dh /etc/openvpn/easy-rsa/pki/dh.pem

OpenVPN 默认使用 SSL,但也可以选择使用 TLS。本指南使用 SSL。

注释掉第 244 行的 tls-auth ta.key 密钥对值

#tls-auth ta.key 0 # This file is secret

在关闭 server.conf 之前保存。

配置防火墙

OpenVPN 默认运行在 UDP 端口 1194。您将使用 firewalld 来允许 OpenVPN 流量进入服务器。

安装 firewalld

sudo dnf install firewalld -y

启用 firewalld

sudo systemctl enable --now firewalld

通过将 OpenVPN 添加为服务来允许防火墙通过

sudo firewall-cmd --add-service=openvpn --permanent

通过向防火墙添加伪装规则来启用网络地址转换 (NAT) 并隐藏客户端的公共 IP 地址

sudo firewall-cmd --add-masquerade --permanent

重新加载防火墙

sudo firewall-cmd --reload

配置路由

使用以下命令允许 IP 转发

sudo sysctl -w net.ipv4.ip_forward=1

启动 OpenVPN 服务器

根据 OpenVPN 文档,“最好先从命令行启动 OpenVPN 服务器”。

sudo openvpn /etc/openvpn/server.conf

启动 OpenVPN 后,按 Ctrl + Z,然后将作业发送到后台

bg

配置并启动客户端

除了服务器,您还需要在所有客户端上安装 OpenVPN 才能使其正常工作。如果您还没有,请在客户端上安装 OpenVPN。

sudo dnf install openvpn -y

创建新目录以存储客户端的密钥、证书和配置文件

sudo mkdir -p /etc/openvpn/pki`

现在使用安全的传输方式复制密钥和证书,并将它们放在 /etc/openvpn/pki。一些可能的方法是使用 SFTP 或 SCP 协议。有关设置 SSH 访问,请查阅 Rocky Linux 指南 SSH 公钥和私钥

以下是客户端配置所需的证书和密钥及其在服务器上的文件路径

  • ca.crt
  • client1.crt
  • client1.key

将必要的证书和密钥存储在 /etc/openvpn/pki 中后,将 client.conf 示例文件复制到 /etc/openvpn

sudo cp /usr/share/doc/openvpn/sample/sample-config-files/client.conf /etc/openvpn

使用您选择的编辑器打开 client.conf

sudo vim /etc/openvpn/client.conf`

将必要证书和密钥的文件路径映射到客户端配置文件。您可以通过将这些文本行复制并粘贴到示例文件的第 88-90 行来完成此操作。

ca /etc/openvpn/pki/ca.crt
cert /etc/openvpn/pki/client1.crt
key /etc/openvpn/pki/client1.key

您还需要设置服务器主机名或 IP。您可以保留默认的 UDP 端口 1194。在示例文件中,这位于第 42 行。

remote server 1194

在退出 client.conf 之前保存。

在客户端上启动 OpenVPN

sudo openvpn /etc/openvpn/client.conf

启动 OpenVPN 后,按 Ctrl + Z,然后将作业发送到后台

bg

运行以下命令查看在后台运行的作业

jobs

向服务器发送测试 ping。默认情况下,其私有地址是 10.8.0.1

ping 10.8.0.1

结论

您现在应该已经拥有了自己的 OpenVPN 服务器并已成功运行!通过这种基本配置,您已经为您的系统在互联网上安全地通信提供了一个私有隧道。然而,OpenVPN 是高度可定制的,本指南还有很大的探索空间。您可以通过访问他们的 网站来进一步探索 OpenVPN。您也可以通过在系统上运行 man openvpn 命令,使用 man 手册页来了解更多关于 OpenVPN 的信息。

作者:Joseph Brinkman

贡献者:Steven Spencer, Ganna Zhyrnova