随机
Enter 搜索 ↑↓ 切换 Esc 清空

openvpn

命令

OpenVPN 服务端与客户端配置指南

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)

  1. 下载安装 OpenVPN Community Client
  2. .ovpn 文件放入 C:\Users\<用户名>\OpenVPN\config\
  3. 右键系统托盘图标 → 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。

手机端


八、管理操作

吊销客户端证书

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 变化

参考链接