OpenVPN 是一款开源的虚拟私人网络(VPN)软件,基于 SSL/TLS 协议实现安全的点对点或站点对站点连接。它广泛应用于远程访问、数据加密传输、绕过网络限制等场景。对于 Linux 用户而言,掌握 OpenVPN 的安装与配置不仅能提升网络安全性,还能灵活应对多样化的网络需求。

安装 OpenVPN 服务端

1
2
3
4
5
# Ubuntu/Debian
sudo apt install openvpn -y

# CentOS/RHEL
sudo dnf install openvpn -y

生成加密证书与密钥(使用 EasyRSA)

下载 EasyRSA

1
2
3
4
5
6
7
# 安装 git(若未安装)
sudo apt install git -y # Ubuntu/Debian
# 或 sudo dnf install git -y # CentOS/RHEL

# 克隆 EasyRSA 仓库(使用 3.x 版本,兼容 OpenVPN 2.4+)
git clone --depth 1 https://github.com/OpenVPN/easy-rsa.git /etc/openvpn/easy-rsa
cd /etc/openvpn/easy-rsa/easyrsa3

初始化 PKI(公钥基础设施)

1
sudo ./easyrsa init-pki  # 初始化 PKI 目录(生成 /tmp/easy-rsa/easyrsa3/pki/)

生成 CA 根证书

1
2
sudo ./easyrsa build-ca nopass  # "nopass" 表示 CA 私钥不加密(服务端自动启动需此设置)
# 提示输入 CA 名称(如 "MyOpenVPN-CA"),直接回车默认即可

生成 Diffie-Hellman 参数(DH)

DH 参数用于密钥交换,增强前向安全性:

1
sudo ./easyrsa gen-dh  # 生成 pki/dh.pem,耗时可能较长(1-5 分钟,取决于服务器性能)

生成 TLS 加密密钥

用于加密 TLS 握手过程,防止中间人攻击:

1
./easyrsa gen-tls-crypt-key

启用 证书吊销列表(CRL)

通过吊销客户端证书实现禁止指定客户端访问

1
2
3
4
5
# 生成crl
./easyrsa gen-crl

# 吊销指定客户端
# ./easyrsa revoke client1

生成服务端证书与密钥

1
2
# 生成服务端证书请求(CSR)和私钥,名称为 "server"(可自定义)
sudo ./easyrsa build-server-full server nopass # "nopass" 表示服务端私钥不加密

生成客户端证书与密钥

假设客户端名为 client1,每个客户端都需要生成

1
sudo ./easyrsa build-client-full client1 nopass  # 客户端私钥同样不加密(便于自动连接)

生成后,客户端证书位于 pki/issued/client1.crt ,私钥位于 pki/private/client1.key ,还有个集成了所有证书的配置,可以直接复制到客户端的 ovpn 配置文件中:pki/inline/private/client1.inline

复制证书/密钥到服务端目录

1
2
3
4
5
6
7
8
sudo mkdir -p /etc/openvpn/server/keys
sudo cp pki/ca.crt /etc/openvpn/server/keys/
sudo cp pki/issued/server.crt /etc/openvpn/server/keys/
sudo cp pki/private/server.key /etc/openvpn/server/keys/
sudo cp pki/dh.pem /etc/openvpn/server/keys/
sudo cp pki/private/easyrsa-tls.key /etc/openvpn/server/keys/ta.key
sudo cp pki/crl.pem /etc/openvpn/server/keys/crl.pem
sudo chmod -R 600 /etc/openvpn/server/keys/ # 权限设为 600,仅 root 可访问

配置服务端参数

创建服务端配置文件 /etc/openvpn/server/server.conf ,以下为推荐配置(关键参数已标注):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# 基本设置
port 1194 # 监听端口(UDP 速度快,TCP 可用于端口封锁场景)
proto udp # 传输协议(推荐 UDP,TCP 可选)
dev tun # 使用 TUN 设备(路由模式,适合远程访问;TAP 为桥接模式)

# 证书/密钥路径
ca keys/ca.crt
cert keys/server.crt
key keys/server.key # 服务端私钥(需保密)
dh keys/dh.pem
tls-crypt keys/ta.key # 启用 tls-crypt

# 加密与认证(安全关键)
cipher AES-256-GCM # 数据加密算法(GCM 模式带认证,推荐 AES-256-GCM)
tls-version-min 1.3 # 最低 TLS 版本(强制 TLS 1.3,禁用不安全的 TLS 1.0/1.1)
tls-cert-profile preferred # 使用推荐的证书配置文件

# 网络设置
server 10.8.0.0 255.255.255.0 # 客户端分配的子网(如 10.8.0.0/24)
ifconfig-pool-persist ipp.txt # 记录客户端 IP 分配(重启后保持固定 IP)

# push "route 192.168.1.0 255.255.255.0" # 推送内网路由(如允许客户端访问服务端所在内网 192.168.1.0/24)
push "redirect-gateway def1 bypass-dhcp" # 推送所有流量到openvpn

push "dhcp-option DNS 8.8.8.8" # 推送 DNS 服务器(可选,如 Google DNS 8.8.8.8)
push "dhcp-option DNS 8.8.4.4"
keepalive 10 120 # 每 10 秒发送 ping,120 秒无响应则断开

# 其他设置
# user nobody # 降权运行(非 root 用户,增强安全性)
# group nogroup
persist-key
persist-tun
status openvpn-status.log # 状态日志(客户端连接信息)
log-append openvpn.log # 详细日志(调试用,verb 3 时记录关键信息)
verb 3 # 日志详细程度(1-9,3 为默认,调试时可设为 6-9)
crl-verify keys/crl.pem # 启用证书吊销列表

配置防火墙与端口转发

启用 IPv4 转发(服务端必须)

1
2
3
4
5
sudo tee -a /etc/sysctl.conf <<EOF
net.ipv4.ip_forward=1
EOF
# 生效配置
sudo sysctl -p

配置服务器防火墙

根据系统防火墙工具( ufwfirewalld )开放 OpenVPN 端口并允许转发。

1
2
sudo iptables -A INPUT -p udp --dport 1194 -j ACCEPT
sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
1
2
3
4
5
# 允许 OpenVPN 端口
sudo firewall-cmd --add-port=1194/udp --permanent
# 允许转发(临时生效,永久需修改 /etc/firewalld/firewalld.conf 中 ForwardPolicy=ACCEPT)
sudo firewall-cmd --add-masquerade --permanent # 启用地址伪装(NAT),允许客户端访问互联网
sudo firewall-cmd --reload
1
2
3
4
5
6
# 允许 OpenVPN 端口(UDP 1194)
sudo ufw allow 1194/udp
# 允许转发(关键:允许 VPN 子网 10.8.0.0/24 的流量)
sudo ufw default allow forward
# 重启 ufw
sudo ufw reload

启动服务端并验证状态

1
2
3
4
5
6
7
8
# 启动服务(服务名默认 openvpn-server@server,对应配置文件 /etc/openvpn/server/server.conf)
sudo systemctl start openvpn-server@server

# 查看状态(确认 active (running))
sudo systemctl status openvpn-server@server

# 设置开机自启
sudo systemctl enable openvpn-server@server

验证服务运行

1
2
3
4
5
6
# 查看监听端口(确认 1194/UDP 已被 openvpn 占用)
sudo ss -uln | grep 1194
# 输出示例:UNCONN 0 0 0.0.0.0:1194 0.0.0.0:* # 表示成功监听

# 查看日志(排查问题用)
sudo journalctl -u openvpn-server@server -f # -f 实时跟踪日志

生成客户端配置文件

客户端需使用服务端的 CA 证书、客户端证书/密钥,以及与服务端匹配的加密参数。以下为手动生成 client1.ovpn 的示例:

证书相关的配置,可以直接从 inline 文件复制。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
client
dev tun
proto udp
remote 146.56.243.106 1194
nobind
persist-key
persist-tun

remote-cert-tls server
cipher AES-256-GCM
tls-version-min 1.3
verb 3

# 内联证书/密钥(避免单独文件)
# ca ca.crt # CA 根证书(可内联或指定路径)
<ca>
-----BEGIN CERTIFICATE-----
# 粘贴 /etc/openvpn/server/keys/ca.crt 的内容
-----END CERTIFICATE-----
</ca>

# cert client.crt # 客户端证书(可内联)
<cert>
-----BEGIN CERTIFICATE-----
# 粘贴 /etc/openvpn/server/keys/client1.crt 的内容(客户端证书)
-----END CERTIFICATE-----
</cert>

# key client.key # 客户端私钥(可内联)
<key>
-----BEGIN PRIVATE KEY-----
# 粘贴 /etc/openvpn/server/keys/client1.key 的内容(客户端私钥)
-----END PRIVATE KEY-----
</key>

# tls-crypt /path/to/ta.key
<tls-crypt>
# 完整的 ta.key 内容
</tls-crypt>

1
sudo openvpn --config /etc/openvpn/client/client.ovpn --verb 6  # --verb 6 输出详细调试日志

常见问题

证书有效期查看

1
openssl x509 -in client1.crt -noout -dates

服务端日志提示“Cannot open TUN/TAP dev /dev/net/tun: No such file or directory”

  • 原因 :系统未加载 TUN 模块。
  • 解决 :手动加载模块: sudo modprobe tun ,并添加到开机加载: echo "tun" | sudo tee -a /etc/modules

可以连接,但是无法上网

检查 服务器 的 NAT 转发配置

如何吊销客户端

这里以吊销 client1 为例:

1
2
3
4
./easyrsa revoke client1
./easyrsa gen-crl
sudo cp pki/crl.pem /etc/openvpn/server/keys/crl.pem
sudo systemctl restart openvpn-server@server