OpenVPN
简介¶
OpenVPN 是一个免费的开源虚拟专用网络 (VPN)。本文将指导您通过使用 X509 公钥基础设施 (PKI) 设置 OpenVPN。本指南需要一个具有公网 IP 地址的 Rocky Linux 系统,因为 OpenVPN 在客户端/服务器模型上运行。实现此目标的最简单方法是通过您选择的云提供商启动一个虚拟专用服务器 (VPS)。在撰写本文时,Google Cloud Platform 为其 e2-micro 实例提供免费层级。如果您正在寻找使用点到点 (p2p) VPN(不使用 PKI)的最直接的 OpenVPN 设置,请参阅他们的 静态密钥小型 HOWTO.
先决条件和假设¶
以下是此过程的最低要求
- 能够以 root 用户身份运行命令或使用
sudo
提升权限 - 一个具有公网访问权限的 Rocky Linux 系统
安装 OpenVPN¶
安装适用于企业版 Linux 的附加软件包 (EPEL) 存储库
sudo dnf install epel-release -y
安装 OpenVPN
sudo dnf install openvpn -y
设置证书颁发机构¶
安装 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-ca
和 nopass
参数运行 easyrsa
脚本以构建不带密码的证书颁发机构
sudo ./easy-rsa/3/easyrsa build-ca nopass
创建证书¶
使用 gen-req
和 nopass
参数运行 easyrsa
脚本以生成不带密码的服务器证书
sudo ./easy-rsa/3/easyrsa gen-req server nopass
使用 sign-req
和 server
参数运行 easyrsa
脚本以签署服务器证书
sudo ./easy-rsa/3/easyrsa sign-req server server
注意
您可以根据需要重复以下步骤以创建其他客户端。
使用 gen-req
和 nopass
参数运行 easyrsa
脚本以生成不带密码的客户端证书
sudo ./easy-rsa/3/easyrsa gen-req client1 nopass
使用 sign-req
和 client
参数运行 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
复制并粘贴示例文件 server.conf
第 85 行上的 Diffie Hellman 文件路径
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 协议来完成此操作。查看 Rocky Linux 指南 SSH 公钥和私钥 设置 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。您也可以在您的系统上阅读更多关于 OpenVPN 的信息 - man openvpn
- 通过使用手册页。
作者:Joseph Brinkman
贡献者:Steven Spencer, Ganna Zhyrnova