# 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+ CPU:1核+ # 关闭 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 # 或下载 Tunnelblick:https://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 协议、配置证书 + 密码双因子认证、定期更换证书。