openvpn
OpenVPN 服务端与客户端配置指南
补充说明
OpenVPN 是一款开源的 VPN 解决方案,基于 SSL/TLS 加密,支持灵活的认证方式和路由策略。适用于远程办公、站点互联、跨境访问等场景。
通用说明
- 推荐使用 TCP 443 或 UDP 1194 端口
- 服务端需开放对应端口防火墙
- 客户端配置文件分发时注意证书安全
一、安装
# Debian / Ubuntu
apt update && apt install openvpn easy-rsa -y
# RHEL / CentOS / Fedora
yum install epel-release -y && yum install openvpn easy-rsa -y
# Arch Linux
pacman -S openvpn easy-rsa
二、PKI 证书体系搭建
OpenVPN 使用证书认证(TLS),需要创建自己的证书颁发机构(CA)。
1. 初始化 PKI 环境
make-cadir ~/openvpn-ca
cd ~/openvpn-ca
2. 配置 CA 变量
编辑 ~/openvpn-ca/vars:
set_var EASYRSA_REQ_COUNTRY "CN"
set_var EASYRSA_REQ_PROVINCE "Beijing"
set_var EASYRSA_REQ_CITY "Beijing"
set_var EASYRSA_REQ_ORG "MyOrg"
set_var EASYRSA_REQ_EMAIL "admin@example.com"
set_var EASYRSA_REQ_OU "IT"
set_var EASYRSA_KEY_SIZE 2048
set_var EASYRSA_ALGO rsa
set_var EASYRSA_CA_EXPIRE 3650
set_var EASYRSA_CERT_EXPIRE 3650
3. 构建 CA 和证书
cd ~/openvpn-ca
# 初始化 PKI 目录
./easyrsa init-pki
# 创建 CA 证书(输入 PEM pass phrase,务必牢记)
./easyrsa build-ca
# 生成服务端证书和密钥
./easyrsa gen-req server nopass
./easyrsa sign-req server server
# 生成 Diffie-Hellman 参数
./easyrsa gen-dh
# 生成 TLS 认证密钥(增强安全性)
openvpn --genkey secret ta.key
4. 生成客户端证书
每台客户端需要独立的证书:
cd ~/openvpn-ca
# 创建客户端证书(无密码)
./easyrsa gen-req client1 nopass
./easyrsa sign-req client client1
# 如需密码保护私钥,去掉 nopass
# ./easyrsa gen-req client1
5. 整理证书文件
mkdir -p /etc/openvpn/server
cp pki/ca.crt /etc/openvpn/server/
cp pki/issued/server.crt /etc/openvpn/server/
cp pki/private/server.key /etc/openvpn/server/
cp pki/dh.pem /etc/openvpn/server/
cp ta.key /etc/openvpn/server/
三、服务端配置
创建 /etc/openvpn/server/server.conf:
port 1194
proto udp
dev tun
# 证书路径
ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/server.crt
key /etc/openvpn/server/server.key
dh /etc/openvpn/server/dh.pem
tls-crypt /etc/openvpn/server/ta.key
# 虚拟 IP 池
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist /etc/openvpn/server/ipp.txt
# 推送路由
push "route 192.168.1.0 255.255.255.0"
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 114.114.114.114"
push "block-outside-dns"
# 客户端间互通
client-to-client
# 保持连接
keepalive 10 120
# 加密
cipher AES-256-GCM
data-ciphers AES-256-GCM:AES-128-GCM:CHACHA20-POLY1305
data-ciphers-fallback AES-256-CBC
auth SHA256
# 安全加固
tls-version-min 1.2
tls-cipher TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384
ncp-ciphers AES-256-GCM:AES-128-GCM
reneg-sec 86400
# 日志
status /var/log/openvpn-status.log
log-append /var/log/openvpn.log
verb 3
explicit-exit-notify 1
# 用户权限
user nobody
group nogroup
persist-key
persist-tun
四、网络配置(路由转发)
1. 开启 IP 转发
echo "net.ipv4.ip_forward = 1" > /etc/sysctl.d/99-openvpn.conf
sysctl -p /etc/sysctl.d/99-openvpn.conf
2. 配置 NAT(iptables)
# 假设外网网卡为 eth0,根据实际情况修改
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
# 持久化规则
apt install iptables-persistent -y
netfilter-persistent save
3. 放行防火墙
# ufw
ufw allow 1194/udp
# firewalld
firewall-cmd --permanent --add-port=1194/udp
firewall-cmd --permanent --add-masquerade
firewall-cmd --reload
五、启动服务端
systemctl enable openvpn-server@server
systemctl start openvpn-server@server
systemctl status openvpn-server@server
验证:
# 查看虚拟网卡
ip addr show tun0
# 查看日志
journalctl -u openvpn-server@server -f
六、客户端配置
1. 生成客户端配置文件
创建 /etc/openvpn/client/client.ovpn(需分发给客户端):
client
dev tun
proto udp
remote your-server.com 1194
resolv-retry infinite
nobind
# 证书(嵌入方式,见下方打包脚本)
ca ca.crt
cert client1.crt
key client1.key
tls-crypt ta.key
cipher AES-256-GCM
data-ciphers AES-256-GCM:AES-128-GCM:CHACHA20-POLY1305
auth SHA256
key-direction 1
remote-cert-tls server
tls-version-min 1.2
verb 3
persist-key
persist-tun
# 推送的处理(Windows 路由)
route-method exe
route-delay 2
2. 打包为单文件 .ovpn(嵌入证书)
#!/bin/bash
# 打包脚本:make-client-config.sh
CLIENT=$1
if [ -z "$CLIENT" ]; then
echo "Usage: $0 client-name"
exit 1
fi
cd ~/openvpn-ca
# 复制基础配置
cat > /tmp/$CLIENT.ovpn << EOF
client
dev tun
proto udp
remote your-server.com 1194
resolv-retry infinite
nobind
cipher AES-256-GCM
data-ciphers AES-256-GCM:AES-128-GCM:CHACHA20-POLY1305
auth SHA256
key-direction 1
remote-cert-tls server
verb 3
persist-key
persist-tun
EOF
# 嵌入证书
echo "<ca>" >> /tmp/$CLIENT.ovpn
cat pki/ca.crt >> /tmp/$CLIENT.ovpn
echo "</ca>" >> /tmp/$CLIENT.ovpn
echo "<cert>" >> /tmp/$CLIENT.ovpn
cat pki/issued/$CLIENT.crt >> /tmp/$CLIENT.ovpn
echo "</cert>" >> /tmp/$CLIENT.ovpn
echo "<key>" >> /tmp/$CLIENT.ovpn
cat pki/private/$CLIENT.key >> /tmp/$CLIENT.ovpn
echo "</key>" >> /tmp/$CLIENT.ovpn
echo "<tls-crypt>" >> /tmp/$CLIENT.ovpn
cat ta.key >> /tmp/$CLIENT.ovpn
echo "</tls-crypt>" >> /tmp/$CLIENT.ovpn
echo "Config created: /tmp/$CLIENT.ovpn"
打包:
chmod +x make-client-config.sh
./make-client-config.sh client1
生成的 /tmp/client1.ovpn 单文件即可分发给客户端使用。
七、客户端连接
Windows(OpenVPN GUI)
- 下载安装 OpenVPN Community Client
- 将
.ovpn文件放入C:\Users\<用户名>\OpenVPN\config\ - 右键系统托盘图标 → Connect
Linux
# 安装客户端
apt install openvpn -y
# 连接
sudo openvpn --config client1.ovpn
# 或使用 systemd 管理
sudo mv client1.ovpn /etc/openvpn/client/client1.conf
sudo systemctl enable openvpn-client@client1
sudo systemctl start openvpn-client@client1
macOS
推荐使用 Tunnelblick(免费)或 Viscosity。
手机端
- iOS:官方 OpenVPN Connect
- Android:官方 OpenVPN Connect
- 导入
.ovpn文件即可连接
八、管理操作
吊销客户端证书
cd ~/openvpn-ca
# 吊销证书
./easyrsa revoke client1
# 生成证书吊销列表
./easyrsa gen-crl
# 复制到服务端
cp pki/crl.pem /etc/openvpn/server/
# 在 server.conf 中添加
# crl-verify /etc/openvpn/server/crl.pem
systemctl restart openvpn-server@server
查看在线客户端
cat /var/log/openvpn-status.log
九、性能调优
服务端配置优化
# 多线程(多核 CPU)
sndbuf 524288
rcvbuf 524288
push "sndbuf 524288"
push "rcvbuf 524288"
# 压缩(双方需一致)
push "compress lz4-v2"
compress lz4-v2
UDP vs TCP
| 协议 | 优点 | 缺点 |
|---|---|---|
| UDP 1194 | 性能好,延迟低 | 可能被 QoS 限速 |
| TCP 443 | 穿透性强,像 HTTPS | 性能略低(TCP over TCP) |
常见问题
客户端连接成功但无法上网
# 服务端检查 IP 转发
cat /proc/sys/net/ipv4/ip_forward
# 检查 NAT 规则
iptables -t nat -L POSTROUTING -v
# 确认 push redirect-gateway 已发送
journalctl -u openvpn-server@server | grep redirect
TLS 握手失败
# 检查服务端/客户端时间是否同步
date
# 检查证书是否匹配
openssl x509 -in server.crt -text -noout | grep "Subject:"
openssl x509 -in ca.crt -text -noout | grep "Subject:"
# 检查 ta.key 方向
# 服务端用 0(默认),客户端用 1
客户端连接断开
# 查看实时日志
journalctl -u openvpn-server@server -f
# 常见原因:
# - keepalive 超时
# - 防火墙超时无状态连接
# - 客户端 IP 变化