O 条件
1.一台Ubuntu服务器用来搭建OpenVPN服务
2.一台Windows用来安装OpenVPN客户端
O 搭建
1.安装 OpenVPN 和 Easy-RSA
第一步是安装 OpenVPN 和 Easy-RSA。 Easy-RSA 是一种公钥基础设施 (PKI) 管理工具,用于在OpenVPN 服务器上生成证书请求。然后在 CA 服务器上验证和签名。在这里我们的 OpenVPN 服务器和CA服务器为同一个 Ubuntu 服务器
首先,更新 OpenVPN 服务器的包索引并安装 OpenVPN 和 Easy-RSA。 这两个包都在 Ubuntu 的默认存储库中可用,可以使用 apt 进行安装:
-
sudo apt update
-
sudo apt install openvpn easy-rsa

openvpn安装完毕后,我们来查看openvpn的版本:
openvpn --version
安装完 easy-rsa 之后我们就可以开始创建 OpenVPN 服务所需要的秘钥了。
2.制作相关证书
OpenVPN 的证书分为三部分:CA证书、Server端证书、Client端证书。下面我们通过easy-rsa分别对其进行制作。
2.1制作CA证书
进入 /usr/share/easy-rsa 目录
首先将 vars.example 拷贝一份出来

然后编辑 vars 文件
修改下面部分的内容

为

在最后一行添加 KEY_NAME,可以是任何你喜欢的名字,但是请记住,后面制作服务端证书时会用到

对于不同版本的easy-rsa,使用方法可能不一样,具体可以参考安装文档的描述
cat /usr/share/doc/easy-rsa/README.Debian

然后使用以下命令:
sudo ./easyrsa init-pki

会发现多了个pki目录出来
然后再执行第二条命令

查看pki目录会发现有一个 ca.crt,这就是CA端证书,ca.crt 包含 CA 的公钥,用于验证服务器和客户端证书的有效性。客户端会使用此证书来验证服务器的身份。

至此CA端证书制作好了
2.2制作服务端证书
然后用以下命令制作Server端证书(注意改命令中的server要换成前面vars文件中设置的KEY_NAME):
sudo ./easyrsa build-server-full server nopass

修改pki目录权限并进入

查看服务器的证书和私钥:
-
sudo ls issued
-
sudo ls private

至此服务端的证书制作完毕
2.3制作客户端证书
Server端证书制作完成后,开始制作Client端证书,步骤和制作服务端证书类似,注意命令中的client,是客户端的名称,可以换成任意你喜欢的,不要和服务端证书一样就行
sudo ./easyrsa build-client-full client nopass
先制作一个用于给我windows电脑用的

再次查看 pki/issued/ 和 pki/private/ ,会发现多了windows11的证书和私钥出来

至此客户端的证书制作完毕
2.4创建迪菲·赫尔曼密钥
使用以下命令创建,会生成dh.pem文件
sudo ./easyrsa gen-dh

3.配置服务器端配置文件
3.1拷贝相关文件
首先复制一份服务器端配置文件模板 server.conf 到 /etc/openvpn/
-
sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
-
cd /etc/openvpn/
-
sudo gzip -d server.conf.gz

然后把刚刚创建好的CA证书、dh.pem、服务端证书/私钥、客户端证书/私钥复制过来,CA证书和dh.pem放在/etc/openvpn目录下,服务端证书/私钥放在server目录下,客户端证书/私钥放在client目录下。

3.2编辑server.conf
sudo vim server.conf
配置文件详细说明可以参考这篇:
OpenVPN server端配置文件详细说明-腾讯云开发者社区-腾讯云
我主要做了如下修改:
端口号依然使用1194,传输协议用tcp,注释掉原本的udp

修改证书和dh密钥路径

修改VPN的IP地址段,也可以不修改,我没做修改

打开下面选项,让VPN 重定向客户端所有流量

修改下面选项可以使客户端在连接OpenVPN时DNS服务器按照以下设置

开启后多个客户端可以同时使用一个证书和私钥

关闭TLS认证

启用 LZO 压缩算法,以减小通过OpenVPN通道传输的数据量,从而提高性能

在之前的日志内容后进行追加

关闭“服务器重启,客户端自动重新连接”

至此服务端配置文件修改完成。
4.运行OpenVPN Server
使用以下命令运行并查看OpenVPN Server
-
sudo systemctl start openvpn@server
-
sudo systemctl status openvpn@server

使用以下命令查看日志
sudo tail -f /var/log/openvpn/openvpn.log

5.设置防火墙
开启1194和SSH端口并重启ufw防火墙
-
sudo ufw allow 1194
-
sudo ufw allow OpenSSH
-
sudo ufw disable
-
sudo ufw enable
6.Windows客户端配置
下载openvpn客户端v2.4.8:OpenVPN v2.4.8
下载好以后点击运行,然后在右下角状态栏里找到OpenVPN的图标,右键点击,选中选项,在高级里面修改配置文件文件夹路径为 C:\Program Files\OpenVPN\config
然后先在Ubuntu服务器上用chown命令将ca.crt, windows11.crt, windows11.key 的所有者权限改成自己
sudo chown wt ca.crt client/windows11{.crt,.key}
由于我在本地电脑上没有安装ssh服务端,所以无法直接在Ubuntu服务器上使用scp将这三个文件传输到本地电脑,所以在本地电脑执行以下命令将这三个文件远程传输到C:\Program Files\OpenVPN\config,该目录为openvpn客户端的配置文件所在目录
scp -r wt@114.212.122.48:/etc/openvpn/{ca.crt,client/windows11{.crt,.key}} ./

然后在客户端机器上打开C:\Program Files\OpenVPN\config文件夹,新建一个windows11.ovpn文件,在里面添加如下内容
-
client
-
-
dev tun
-
-
proto tcp
-
-
remote 114.212.122.48 1194
-
-
resolv-retry infinite
-
-
nobind
-
-
persist-key
-
-
persist-tun
-
-
ca ca.crt
-
-
cert windows11.crt
-
-
key windows11.key
-
-
comp-lzo
-
-
verb 3
保存后关闭
然后连接VPN,显示成功

ping OpenVPN服务器的IP,可以ping通

7.调整 OpenVPN 服务器网络配置
此时已经能够使用OpenVPN的基本功能,但是由于之前我们设置过让VPN重定向客户端的所有流量,导致无法正常访问外部网络

7.3配置路由转发和防火墙
7.3.1配置路由转发
要调整 OpenVPN 服务器的默认 转发设置,修改/etc/sysctl.conf 文件
sudo vim /etc/sysctl.conf,然后在末尾添加以下行
net.ipv4.ip_forward = 1
修改完后保存并关闭文件,然后输入以下命令为当前会话加载新值
sudo sysctl -p
![]()
7.3.2修改防火墙配置
先输入以下命令查看服务器的公网接口
ip route list default
公网接口是输出中dev后面的字符串,在我的机器里为 eno1
![]()
有了默认路由关联的接口后,我们打开 /etc/ufw/before.rules 文件添加相关配置:
sudo vim /etc/ufw/before.rules
-
#
-
# rules.before
-
#
-
# Rules that should be run before the ufw command line added rules. Custom
-
# rules should be added to one of these chains:
-
# ufw-before-input
-
# ufw-before-output
-
# ufw-before-forward
-
#
-
-
# START OPENVPN RULES
-
# NAT table rules
-
*nat
-
:POSTROUTING ACCEPT [0:0]
-
# Allow traffic from OpenVPN client to eno1 (change to the interface you discovered!)
-
-A POSTROUTING -s 10.8.0.0/24 -o eno1 -j MASQUERADE
-
COMMIT
-
# END OPENVPN RULES
-
-
# Don’t delete these required lines, otherwise there will be errors
-
*filter
-
. . .
然后需要告诉 UFW 默认情况下也允许转发数据包, 打开并修改 /etc/default/ufw 文件:
sudo vim /etc/default/ufw
找到 DEFAULT_FORWARD_POLICY 指令并将值从 DROP 更改为 ACCEPT:

重启防火墙
然后重启服务器上的OpenVPN服务
-
sudo ufw disable
-
sudo ufw enable
-
sudo systemctl restart openvpn@server
此时客户端重新连接VPN,会发现可以正常上网了

跳转DNS leak test测试,发现IP已经变成OpenVPN服务器的IP
