2026-04-09 01:28:15 +08:00

575 lines
13 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# OpenVPN 实战指南
> 企业级开源 VPN 解决方案,实现安全远程访问。
---
## 1. OpenVPN 简介
### 1.1 什么是 VPN
**VPN**Virtual Private Network虚拟专用网络
- 在公共网络上建立的安全加密通道
- 实现远程安全访问公司内网资源
- 保证数据传输的机密性和完整性
### 1.2 OpenVPN 特点
| 特点 | 说明 |
|------|------|
| 开源免费 | GPL 协议,源码开放 |
| 跨平台 | Windows/Linux/macOS/Android/iOS |
| 安全性高 | 支持 AES、BF-CBC 等加密算法 |
| 简单易用 | 配置简洁,客户端友好 |
| 协议优势 | 基于 TLS/SSL |
| 多种认证 | 支持证书、用户名密码、双因子 |
### 1.3 OpenVPN 与其他 VPN 对比
| VPN 方案 | 协议 | 安全性 | 复杂度 | 适用场景 |
|----------|------|--------|--------|----------|
| **OpenVPN** | SSL/TLS | 高 | 中 | 通用远程访问 |
| IPSec | IKEv2 | 高 | 高 | 企业级 |
| PPTP | PPP | 低 | 低 | 简单场景(已废弃) |
| L2TP/IPSec | L2TP | 高 | 中 | 兼容性好 |
| WireGuard | WireGuard | 高 | 低 | 现代方案 |
### 1.4 原理架构
```
┌──────────────────────────────────────────────┐
│ Internet │
│ (公网/不安全的网络) │
└──────────────────┬───────────────────────────┘
┌──────────────────▼───────────────────────────┐
│ OpenVPN Server │
│ ┌─────────────┐ ┌─────────────────────┐ │
│ │ TLS/SSL │ │ 虚拟网卡 tun/tap │ │
│ │ 加密通道 │ │ 10.8.0.0/24 │ │
│ └─────────────┘ └─────────────────────┘ │
└──────────────────┬───────────────────────────┘
┌──────────────────▼───────────────────────────┐
│ 内网(安全网络) │
│ 192.168.1.0/24 │
│ 文件服务器/数据库/内部系统 │
└──────────────────────────────────────────┘
```
### 1.5 工作流程
```
客户端 服务端
│ │
│ 发起连接请求 │
│ ─────────────────────>│
│ │
│ 返回证书 │
│ <─────────────────────│
│ │
│ 验证证书 + 配置IP │
│ ─────────────────────>│
│ │
│ 建立 TLS 通道 │
│ <─────────────────────│
│ │
│ 启用虚拟网卡 │
│ <─────────────────────│
│ │
│ 数据加密传输 │
│◄─────────────────────►│
```
---
## 2. OpenVPN 部署
### 2.1 环境准备
```bash
# 系统要求
CentOS 7/8 / Ubuntu 20.04+
内存512MB+
CPU1核+
# 关闭 SELinux如需要
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
# 关闭防火墙(或放行)
systemctl stop firewalld
systemctl disable firewalld
# 放行端口
firewall-cmd --permanent --add-port=1194/udp
firewall-cmd --reload
```
### 2.2 安装 OpenVPN
```bash
# CentOS/RHEL
yum install -y openvpn easy-rsa
# Ubuntu/Debian
apt update
apt install -y openvpn easy-rsa
# 检查版本
openvpn --version
```
### 2.3 配置证书环境
```bash
# 复制证书工具
cp -r /usr/share/easy-rsa /etc/openvpn/easy-rsa
cd /etc/openvpn/easy-rsa
# 初始化 PKI
./easyrsa init-pki
# 创建 CA
./easyrsa build-ca nopass
# 创建服务端证书
./easyrsa build-server-full server nopass
# 创建客户端证书
./easyrsa build-client client1 nopass
# 生成 Diffie-Hellman 参数
./easyrsa gen-dh
# 生成 TLS Auth 密钥(防止 DoS 攻击)
openvpn --genkey secret /etc/openvpn/easy-rsa/ta.key
```
> 证书文件说明:
> - `pki/ca.crt`CA 证书(客户端和服务端都需要)
> - `pki/issued/server.crt`:服务端证书
> - `pki/private/server.key`:服务端私钥
> - `pki/issued/client1.crt`:客户端证书
> - `pki/private/client1.key`:客户端私钥
> - `pki/dh.pem`DH 参数
> - `ta.key`TLS Auth 密钥
### 2.4 服务端配置
```bash
# 创建配置文件
cat > /etc/openvpn/server.conf << 'EOF'
# 端口和协议
port 1194
proto udp
dev tun
# 证书和密钥
ca /etc/openvpn/easy-rsa/pki/ca.crt
cert /etc/openvpn/easy-rsa/pki/issued/server.crt
key /etc/openvpn/easy-rsa/pki/private/server.key
dh /etc/openvpn/easy-rsa/pki/dh.pem
tls-auth /etc/openvpn/easy-rsa/ta.key 0
# 加密算法
cipher AES-256-GCM
auth SHA256
# 网络配置
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist /etc/openvpn/ipp.txt
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
# 客户端可以访问内网
client-config-dir /etc/openvpn/ccd
route 192.168.1.0 255.255.255.0
# 权限和日志
keepalive 10 120
persist-key
persist-tun
status /etc/openvpn/openvpn-status.log
log /etc/openvpn/openvpn.log
verb 3
# 压缩(可选,兼容老客户端)
compress lz4-v2
push "compress lz4-v2"
EOF
```
### 2.5 客户端配置(生成配置)
```bash
# 创建客户端配置目录
mkdir -p /etc/openvpn/ccd
# 创建客户端配置
cat > /etc/openvpn/ccd/client1 << 'EOF'
# 为客户端分配固定 IP
ifconfig-push 10.8.0.10 10.8.0.9
EOF
```
### 2.6 启动服务
```bash
# 启动服务
systemctl start openvpn@server
systemctl enable openvpn@server
# 检查状态
systemctl status openvpn@server
ip addr show tun0
```
### 2.7 路由和转发配置
```bash
# 开启 IP 转发
echo 1 > /proc/sys/net/ipv4/ip_forward
# 永久生效
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p
# 配置 NAT如果需要访问内网
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
# 永久保存
iptables-save > /etc/sysconfig/iptables
```
### 2.8 客户端配置Linux
```bash
# 安装客户端
apt install -y openvpn
# 复制配置文件
# 方法1从服务端拉取
scp root@server:/etc/openvpn/easy-rsa/pki/issued/client1.crt /etc/openvpn/client.crt
scp root@server:/etc/openvpn/easy-rsa/pki/private/client1.key /etc/openvpn/client.key
scp root@server:/etc/openvpn/easy-rsa/pki/ca.crt /etc/openvpn/ca.crt
# 创建客户端配置
cat > /etc/openvpn/client.conf << 'EOF'
client
dev tun
proto udp
remote your-server-ip 1194
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
cipher AES-256-GCM
auth SHA256
# 证书
ca /etc/openvpn/ca.crt
cert /etc/openvpn/client.crt
key /etc/openvpn/client.key
# TLS Auth
tls-auth /etc/openvpn/ta.key 1
verb 3
EOF
# 复制 TLS Auth
scp root@server:/etc/openvpn/easy-rsa/ta.key /etc/openvpn/ta.key
# 启动连接
openvpn --config /etc/openvpn/client.conf
# 或使用 systemd
systemctl start openvpn@client
```
### 2.9 客户端配置Windows
1. 从服务端下载证书文件:
- `ca.crt`
- `client1.crt`
- `client1.key`
- `ta.key`(可选)
2. 下载 OpenVPN 客户端:
- https://openvpn.net/community-downloads/
3. 创建客户端配置 `client.ovpn`
```ovpn
client
dev tun
proto udp
remote your-server-ip 1194
resolv-retry infinite
nobind
remote-cert-tls server
cipher AES-256-GCM
auth SHA256
ca ca.crt
cert client1.crt
key client1.key
tls-auth ta.key 1
verb 3
```
4. 导入配置:
- 将证书和配置放入 `C:\Program Files\OpenVPN\config\`
- 右键托盘图标 → 连接
### 2.10 客户端配置macOS
```bash
# 使用 Homebrew 安装
brew install openvpn
# 或下载 Tunnelblickhttps://tunnelblick.net/
# 导入配置文件(.ovpn
open -a Tunnelblick client.ovpn
```
### 2.11 客户端配置iOS/Android
1. **iOS**:下载 OpenVPN Connect 应用,导入 `.ovpn` 配置
2. **Android**:下载 OpenVPN for Android 或 OpenVPN Connect
---
## 3. OpenVPN 管理
### 3.1 日常管理命令
```bash
# 查看连接状态
systemctl status openvpn@server
# 重启服务
systemctl restart openvpn@server
# 查看日志
tail -f /etc/openvpn/openvpn.log
# 查看连接的用户
cat /etc/openvpn/openvpn-status.log
```
### 3.2 查看连接用户
```bash
# 方法1查看状态文件
cat /etc/openvpn/openvpn-status.log
# 方法2通过管理接口
echo "status" | nc localhost 1194
# 方法3检查虚拟网卡
ip addr show tun0
```
### 3.3 日志分析
```bash
# 实时查看日志
tail -f /etc/openvpn/openvpn.log
# 查看错误日志
grep -i error /etc/openvpn/openvpn.log
# 查看连接日志
grep -i "client connect" /etc/openvpn/openvpn.log
```
### 3.4 添加新用户
```bash
cd /etc/openvpn/easy-rsa
# 生成新客户端证书
./easyrsa build-client newuser nopass
# 导出证书
# /etc/openvpn/easy-rsa/pki/issued/newuser.crt
# /etc/openvpn/easy-rsa/pki/private/newuser.key
# /etc/openvpn/easy-rsa/pki/ca.crt
```
### 3.5 撤销用户
```bash
cd /etc/openvpn/easy-rsa
# 撤销证书
./easyrsa revoke newuser
# 生成新的 CRL
./easyrsa gen-crl
# 重启服务
systemctl restart openvpn@server
```
### 3.6 配置文件优化
```bash
# 调整日志级别
verb 3 # 详细(生产环境建议 3
# 调整 MTU
tun-mtu 1500
# 调整 keepalive
keepalive 10 120 # 每 10 秒检测120 秒超时
# 压缩设置
compress lz4-v2 # 启用压缩
```
### 3.7 性能优化
```bash
# 调整缓冲区大小
sndbuf 393216
rcvbuf 393216
# 多线程(如果 CPU 多核)
multihome
# 连接数限制
max-clients 100
```
### 3.8 安全加固
```bash
# 限制客户端 IP
# 在 ccd 目录中配置
cat > /etc/openvpn/ccd/client1 << 'EOF'
ifconfig-push 10.8.0.10 10.8.0.9
# 绑定特定 IP
iroute 192.168.10.0 255.255.255.0
EOF
# 启用 LZO 压缩
compress lz4-v2
# 使用强加密算法
cipher AES-256-GCM
auth SHA256
# 定期更换证书
# 每年更换一次 CA 和服务端证书
```
### 3.9 常见问题处理
| 问题 | 原因 | 解决方案 |
|------|------|----------|
| 连接失败 | 端口被阻 | 检查防火墙/放行 1194 端口 |
| 连接成功但无法访问内网 | 未开启 IP 转发 | 开启 `net.ipv4.ip_forward` |
| 连接后无法解析 DNS | 未推送 DNS | 配置 `push "dhcp-option DNS"` |
| 证书过期 | 证书过期 | 重新签发证书 |
| 速度慢 | MTU 问题 | 调整 `tun-mtu` |
### 3.10 配置文件示例
```bash
# 生产环境配置
cat > /etc/openvpn/server.conf << 'EOF'
port 1194
proto udp
dev tun
dev-type tun
# 证书
ca ca.crt
cert server.crt
key server.key
dh dh.pem
tls-auth ta.key 0
# 加密
cipher AES-256-GCM
auth SHA256
# 网络
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 223.5.5.5"
push "dhcp-option DNS 119.29.29.29"
# 客户端配置目录
client-config-dir ccd
# 路由
route 192.168.1.0 255.255.255.0
# 权限
keepalive 10 120
persist-key
persist-tun
user nobody
group nobody
# 日志
status openvpn-status.log
log-append openvpn.log
verb 3
compress lz4-v2
push "compress lz4-v2"
EOF
```
---
## 4. 常用命令速查
### 4.1 服务端
| 场景 | 命令 |
|------|------|
| 启动 | `systemctl start openvpn@server` |
| 停止 | `systemctl stop openvpn@server` |
| 重启 | `systemctl restart openvpn@server` |
| 查看状态 | `systemctl status openvpn@server` |
| 查看日志 | `tail -f /etc/openvpn/openvpn.log` |
### 4.2 客户端
| 场景 | 命令 |
|------|------|
| 启动连接 | `openvpn --config client.conf` |
| 后台运行 | `openvpn --config client.conf --daemon` |
| 测试配置 | `openvpn --config client.conf --test-crypto` |
| 查看连接 | `cat /etc/openvpn/openvpn-status.log` |
### 4.3 证书操作
| 场景 | 命令 |
|------|------|
| 生成客户端证书 | `./easyrsa build-client name nopass` |
| 撤销证书 | `./easyrsa revoke name` |
| 生成 CRL | `./easyrsa gen-crl` |
| 查看证书 | `./easyrsa show cert name` |
---
## 5. 小结
| 类别 | 关键点 |
|------|--------|
| 协议 | UDP推荐/TCP |
| 端口 | 1194 |
| 加密 | AES-256-GCM + SHA256 |
| 网络 | 10.8.0.0/24 |
| 认证 | 证书 + TLS |
| 客户端 | Windows/macOS/Linux/Android/iOS |
> 生产环境建议:使用 UDP 协议、配置证书 + 密码双因子认证、定期更换证书。