介绍
当您连接到不可信的网络(例如酒店或咖啡馆的 WiFi)时,您是否希望从智能手机或笔记本电脑安全地访问互联网?幸运的是,有一种方法可以满足您的愿望。您可以使用以下工具安全地连接到不可信的网络,就像在私有网络中一样:虚拟专用网络 (VPN).
什么是 VPN?
VPN 代表虚拟专用网络。它提供了向可信服务器开辟安全通道的可能性。然后,所有请求都通过该服务器发送和接收。其优势在于,当使用酒店免费 WiFi 等公共网络时,可以确保您的访问和交易安全。
通过 VPN,所有数据都会被加密并通过服务器进行处理。介于中间的设备(如第三方路由器等)无法将流量重定向到不希望的目标。此外,一旦连接成功建立,您就成为了服务器的网络的一部分。通常只能在服务器的本地网络中访问的其他服务器、计算机或设备(如打印机),现在也可以通过 VPN 隧道进行访问。然而,由于并非所有数据都必须通过加密隧道发送,因此可以配置 VPN 客户端,使其仅将特定部分的请求通过 VPN 隧道发送。其余流量则通过互联网正常处理。
在本教程中,我们将引导您完成在 Ubuntu 18.04 上设置 OpenVPN 服务器的步骤。
要求
您需要访问一台 Ubuntu 18.04 服务器来托管您的 OpenVPN 服务以完成本教程。在开始本指南之前,您还需要配置一个具有 sudo 权限的非 root 用户。您可以按照我们的 关于设置 Ubuntu 服务器的教程.
此外,您还需要一台独立的计算机来充当 证书颁发机构 (CA)。从技术上讲,您可以使用您的 OpenVPN 服务器 或本地计算机作为证书颁发机构。但是,我们不推荐这样做,因为这会使您的 VPN 暴露在安全漏洞中。根据 OpenVPN 官方文档,您应该将证书颁发机构放置在专门用于导入和签署证书请求的独立计算机上。因此,我们假设您的证书颁发机构位于一台独立的 Ubuntu 18.04 服务器上,该服务器也拥有一个具有 sudo 权限的非 root 用户和基本防火墙。在整个指南中,每个安装的所有安装和配置步骤都将尽可能简单。您也可以看看我们的 关于如何在 Docker 下设置 Open VPN 服务器的教程.
步骤 1 – 安装 OpenVPN 和 EasyRSA
首先,更新您的 VPN 服务器的软件包索引并安装 OpenVPN。您可以使用 apt 安装 OpenVPN,因为它在默认的 Ubuntu 软件源中可用:
|
1 2 |
sudo apt update sudo apt install openvpn |
步骤 2:创建证书颁发机构
创建一个简单的证书颁发机构 (CA) 以便为 OpenVPN 服务器颁发受信任的证书。为此,请使用 wget 在您的 CA 机器和 OpenVPN 服务器上下载最新版本的 EasyRSA。要获取最新版本,请访问官方 EasyRSA GitHub 项目 的 Releases 页面,复制以 .tgz 结尾的文件的下载链接,并将其粘贴到以下命令中:
|
1 |
wget -P ~/ https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.4/EasyRSA-3.0.4.tgz <span class="s1">--no-check-certificate</span> |
然后,解压 tar 包:
|
1 2 |
cd ~ tar xvf EasyRSA-3.0.4.tgz |

至此,所有必需的软件已成功安装在您的 CA 计算机和服务器上。
步骤 3 – 配置 EasyRSA 变量并构建 CA
EasyRSA 附带一个配置文件,您可以使用此命令对其进行编辑,以为您的 CA 定义一些变量:
|
1 |
cd ~/EasyRSA-3.0.4/ |
该目录下有一个名为 vars.example 的文件。复制该文件,并将副本命名为 vars(不带文件扩展名):
|
1 |
cp vars.example vars |
使用您偏好的文本编辑器打开这个新文件:
|
1 |
nano vars |
接下来,找到为新证书设置字段默认值的设置。它将类似于以下内容:
|
1 2 3 4 5 6 |
#set_var EASYRSA_REQ_COUNTRY "US" #set_var EASYRSA_REQ_PROVINCE "California" #set_var EASYRSA_REQ_CITY "San Francisco" #set_var EASYRSA_REQ_ORG "Copyleft Certificate Co" #set_var EASYRSA_REQ_EMAIL "me@example.net" #set_var EASYRSA_REQ_OU "My Organizational Unit" |
将这些变量更新为您喜欢的任何值,如下所示:
|
1 2 3 4 5 6 |
set_var EASYRSA_REQ_COUNTRY "SL" set_var EASYRSA_REQ_PROVINCE "Zurich" set_var EASYRSA_REQ_CITY "Zurich City" set_var EASYRSA_REQ_ORG "CloudSigma" set_var EASYRSA_REQ_EMAIL "admin@example.com" set_var EASYRSA_REQ_OU "Community" |
准备就绪后,保存并关闭文件。下一步是调用 easyrsa 脚本并使用 init-pki 选项运行它,以在 CA 服务器上初始化公钥基础设施:
|
1 |
./easyrsa init-pki |

接下来,运行带有 nopass 选项的 build-ca 命令,这样您在每次与 CA 交互时就无需输入密码:
|
1 |
./easyrsa build-ca nopass |
在输出中,您将被要求确认 CA 的通用名称:

至此,您的 CA 已准备就绪,可以开始对证书请求进行签名了。
步骤 4 – 生成服务器证书、密钥和加密文件
CA 准备就绪后,您可以从服务器生成私钥和证书请求,然后将其发送到 CA 进行签名以创建所需的证书。首先,导航到 OpenVPN 服务器上的 EasyRSA 目录:
|
1 |
cd EasyRSA-3.0.4 |
在此处,运行带有 init-pki 选项的 easyrsa 脚本。虽然您已经在 CA 计算机上运行过此命令,但在此处也必须运行该命令。这是因为服务器和 CA 的 PKI 目录是不同的:
|
1 |
./easyrsa init-pki |
然后再次调用 easyrsa 脚本,这次使用 gen-req 选项,后面跟上计算机’的通用名称:
|
1 |
./easyrsa gen-req server nopass |
这将为服务器创建一个私钥和一个名为 server.req 的证书请求文件。将服务器密钥复制到 /etc/openvpn/ 目录中:
|
1 |
sudo cp ~/EasyRSA-3.0.4/pki/private/server.key /etc/openvpn/ |
使用安全的方法(例如以下示例中的 SCP)将 server.req 文件传输到您的 CA 计算机:
|
1 |
scp ~/EasyRSA-3.0.4/pki/reqs/server.req cloudsigma@your_CA_ip:/tmp |
接下来,导航到 CA 计算机上的 EasyRSA 目录:
|
1 |
cd EasyRSA-3.0.4/ |
再次使用 easyrsa 脚本导入 server.req 文件,并在文件路径后添加其通用名称:
|
1 |
./easyrsa import-req /tmp/server.req server |
然后,通过运行带有 sign-req 选项的 easyrsa 脚本,后跟请求类型和通用名称来对请求进行签名。对于 OpenVPN 服务器的证书请求,请确保使用 server 请求类型:
|
1 |
./easyrsa sign-req server server |
输出会提示您验证该请求是否来自受信任的来源。输入 yes 并按 Enter 键确认。请检查下面显示的详细信息以确保准确性。请注意,此请求尚未经过密码验证。
请求主题并将其签发为有效期 3650 天的服务器证书:

如果您对 CA 密钥进行了加密,此时系统会要求您输入密码。接下来,使用安全的方法将已签名的证书传回您的 VPN 服务器:
|
1 |
scp pki/issued/server.crt siigma@your_server_ip:/tmp |
在退出 CA 计算机之前,将 ca.rt 文件传输到服务器:
|
1 |
scp pki/ca.crt siigma@our_server_ip:/tmp |
接下来,再次登录您的 OpenVPN 服务器,并将 server.crt 和 ca.crt 文件复制到您的 /etc/openvpn/ 目录中:
|
1 |
sudo cp /tmp/{server.crt,ca.crt} /etc/openvpn/ |
然后,导航到您的 EasyRSA 目录:
|
1 |
cd ~/EasyRSA-3.0.4/ |
输入以下代码以创建一个强大的 Diffie-Hellman 密钥,您可以在密钥交换期间使用它:
|
1 |
./easyrsa gen-dh |
完成后,生成 HMAC 签名以提高服务器的 TLS 健康检查功能:
|
1 |
openvpn --genkey --secret ta.key |
命令完成后,将这两个新文件复制到 /etc/openvpn/ 目录中:
|
1 2 |
sudo cp ~/EasyRSA-3.0.4/ta.key /etc/openvpn/ sudo cp ~/EasyRSA-3.0.4/pki/dh.pem /etc/openvpn/ |
通过这种方式,生成了服务器所需的所有证书和密钥文件。现在,您可以创建客户端计算机用于访问 OpenVPN 服务器的相应证书和密钥。
步骤 4 – 生成客户端证书和密钥对
接下来,我们将创建一个客户端密钥 and 几个证书。如果您有多个客户端,可以为每个客户端重复此过程。但请注意,您必须为每个客户端向脚本传递一个唯一的名称值。在本教程中,我们将第一个证书/密钥对命名为 client1。首先,在您的家目录中创建一个目录结构来存储客户端证书和密钥文件:
|
1 |
mkdir -p ~/client-configs/keys |
出于安全原因,由于您在此目录中保存了证书/密钥对和客户端的配置文件,您现在应该撤销权限:
|
1 |
chmod -R 700 ~/client-configs |
然后导航回 EasyRSA 目录,并使用 gen-req 和 nopass 选项以及客户端的通用名称运行 easyrsa 脚本:
|
1 2 |
cd ~/EasyRSA-3.0.4/ ./easyrsa gen-req client1 nopass |
按 Enter 键确认通用名称。之后,将 client1.key 文件复制到之前创建的 /client-configs/keys/ 目录中:
|
1 |
cp pki/private/client1.key ~/client-configs/keys/ |
接下来,使用安全的方法将 client1.req 文件传输到您的 CA 计算机:
|
1 |
scp pki/reqs/client1.req sigma@your_CA_ip:/tmp |
登录您的 CA 计算机,导航到 EasyRSA 目录并导入证书请求:
|
1 2 3 |
ssh siigma@your_CA_ip cd EasyRSA-3.0.4/ ./easyrsa import-req /tmp/client1.req client1 |

然后,与上一步一样,在服务器上对请求进行签名。但这次您需要指定客户端请求类型:
|
1 |
./easyrsa sign-req client client1 |
在提示符下,输入 yes 以确认您要对证书请求进行签名,并且该证书请求来自受信任的来源。请输入单词“yes”以继续,或输入其他任何内容以放弃:
|
1 |
确认 请求 详细信息: Yes |

如果您对 CA 密钥进行了加密,系统也会在此处要求您输入密码。这将创建一个名为 client1.crt 的客户端证书文件。将此文件传回服务器:
|
1 |
scp pki/issued/client1.crt siigma@your_server_ip:/tmp |
通过 SSH 返回到您的 OpenVPN 服务器,并将客户端证书复制到 / client-configs / keys / 目录:
|
1 |
cp /tmp/client1.crt ~/client-configs/keys/ |
接下来,将 ca.crt 和 ta.key 文件复制到 / client-configs / keys / 目录中:
|
1 2 |
cp ~/EasyRSA-3.0.4/ta.key ~/client-configs/keys/ sudo cp /etc/openvpn/ca.crt ~/client-configs/keys/ |
至此,服务器和客户端的所有证书和密钥均已生成并保存在服务器上的相应目录中。现在您可以继续在服务器上设置 OpenVPN。
步骤 5 – 配置 OpenVPN 服务
生成客户端和服务器证书后,您可以配置 OpenVPN 服务以使用这些凭据。首先,将 OpenVPN 示例配置文件复制到您的配置目录中,然后将其解压以用作设置基础:
|
1 2 |
sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/ sudo gzip -d /etc/openvpn/server.conf.gz |
在您首选的文本编辑器中打开服务器配置文件:
|
1 |
sudo nano /etc/openvpn/server.conf |
然后,通过寻找 tls-auth 命令来找到 HMAC 部分:
|
1 |
tls-auth ta.key 0 # 此文件是机密的 |
通过寻找被注释掉的密码行来找到密码部分。AES-256-CBC 加密提供了良好的加密级别,并且得到了很好的支持。该行不应该被注释,但如果被注释了,请删除前面的 “;”:
|
1 |
cipher AES-256-CBC |
在此下方,添加一个 Auth 命令以选择 HMAC 消息摘要算法。SHA256 是一个不错的选择:
|
1 |
auth SHA256 |
接下来,找到带有定义 Diffie-Hellman 参数的 dh 语句的行。由于 EasyRSA 最近的一些更改,Diffie-Hellman 密钥文件名可能与示例服务器配置文件中列出的文件名不同。如有必要,通过删除 2048 来更改此处列出的文件名,使其与上一步的密钥保持一致:
|
1 |
dh dh.pem |
最后,找到 user 和 group 设置,并删除每行开头的 “;”:
|
1 2 |
user nobody group nogroup |
到目前为止,您对示例 server.conf 文件所做的更改应该可以让 OpenVPN 正常工作。
步骤 6 – 服务器网络配置
配置 IP 转发以通过 VPN 正确路由流量。这对于您的服务器提供的 VPN 功能至关重要:
|
1 |
sudo nano /etc/sysctl.conf |
寻找设置 net.ipv4.ip_forward 的被注释行。删除行首的 “#” 字符以取消注释此设置:
|
1 |
net.ipv4.ip_forward=1 |
保存并关闭文件。要读取文件并调整当前会话的值,请键入:
|
1 |
sudo sysctl -p |

接下来,添加您机器的公共网络接口:
|
1 |
ip route | grep default |
您的公共接口是此命令输出中紧跟在单词 “dev” 后面的字符串。例如,此结果显示名为 ens3 的接口。

打开 /etc/ufw/before.rules file 文件以添加相关配置:
|
1 |
$ sudo nano /etc/ufw/before.rules |
在文件顶部附近,添加下面突出显示的行,以设置 nat 表中 POSTROUTING 链的默认策略,并伪装来自 VPN 的任何流量。将下面 -A POSTROUTING 行中的 ens3 更改为您在上述命令中找到的接口:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# rules.before # 应该在 ufw 命令行添加的规则之前运行的规则。自定义 # 规则应该添加到以下链之一: # ufw-before-input # ufw-before-output # ufw-before-forward # 开始 OPENVPN 规则 # NAT 表规则 *nat :POSTROUTING ACCEPT [0:0] # 允许来自 OpenVPN 客户端到 wlp11s0 的流量(更改为您发现的接口!) -A POSTROUTING -s 10.8.0.0/8 -o ens3 -j MASQUERADE COMMIT # 结束 OPENVPN 规则 # 不要删除这些必需的行,否则会出现错误 . . . |
保存并关闭文件。接下来,您还需要告诉 UFW 默认允许转发的数据包。为此,请打开 /etc/default/ufw 文件:
|
1 |
sudo nano /etc/default/ufw |
在其中找到 DEFAULT_FORWARD_POLICY 指令,并将值从 DROP 更改为 ACCEPT:
|
1 |
DEFAULT_FORWARD_POLICY="ACCEPT" |
保存并关闭文件。接下来,调整防火墙以允许流量通过 OpenVPN。如果您没有更改 /etc/openvpn/server.conf 文件中的端口和协议,则需要开放到端口 1194 的 UDP 流量。如果您修改了端口和/或协议,请在此处替换为您选择的值。如果您在按照前置教程操作时忘记添加 SSH 端口,也请在此处添加:
|
1 2 |
sudo ufw allow 1194/udp sudo ufw allow OpenSSH |
添加这些规则后,禁用并重新启用 UFW 以重新启动它,并加载您修改的所有文件中的更改:
|
1 2 |
sudo ufw disable sudo ufw enable |

恭喜,您的服务器现在已配置为正确处理 OpenVPN 流量!
总结
如果您完整地学习了本教程,现在就可以安全地浏览互联网了。您将能够保护自己的身份、位置和流量免受窥探。
祝您使用愉快!
评论
暂无评论。发表第一条评论吧。