为什么选择 OpenVPN?
| 特性 |
OpenVPN |
WireGuard |
| 成熟度 |
20+ 年历史,久经考验 |
较新,生态还在完善 |
| 防火墙穿透 |
TCP 模式几乎 100% 穿透 |
UDP 可能被拦截 |
| 客户端支持 |
Windows/macOS/Linux/手机 |
同样支持 |
| 企业认可度 |
高,很多企业 IT 标配 |
新项目首选 |
本文聚焦 Docker 环境下的 OpenVPN 部署与日常运维。
一、快速部署
1. 目录结构
1 2 3 4 5 6
| service/openvpn/ ├── compose.yml # Docker Compose 配置 └── openvpn-data/ # OpenVPN 数据目录(自动生成) ├── server/ # 服务端配置 └── clients/ # 客户端配置文件
|
2. Docker Compose 配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| services: openvpn: image: hwdsl2/openvpn-server:latest container_name: openvpn restart: always ports: - "443:443/udp" volumes: - ./openvpn-data:/etc/openvpn cap_add: - NET_ADMIN devices: - /dev/net/tun sysctls: - net.ipv4.ip_forward=1 - net.ipv6.conf.all.forwarding=1
|
为什么要改端口?
很多网络环境下默认封禁 UDP 1194 端口。用 443 端口可以绕过这个限制,连接成功率更高。
3. 启动服务
首次启动会自动生成:
- CA 证书
- 服务端证书
- DH 参数
- 客户端配置文件
二、服务端配置
1. 修改端口
编辑 openvpn-data/server/server.conf:
1 2 3
| # 与 compose.yml 保持一致 port 443 proto udp
|
2. 路由配置
场景一:全局流量走 VPN
1
| push "redirect-gateway def1 bypass-dhcp"
|
场景二:只访问特定网段
1 2 3 4 5 6
| # 注释掉全局路由 # push "redirect-gateway def1 bypass-dhcp"
# 只推送需要的路由 push "route 172.17.85.0 255.255.255.0" push "route 172.17.0.0 255.255.255.0"
|
3. DNS 配置
使用客户端本地 DNS:
1 2 3 4
| # 注释掉 DNS 推送 # push "dhcp-option DNS 8.8.8.8" # push "dhcp-option DNS 8.8.4.4" # push "block-outside-dns"
|
4. 重启生效
三、客户端配置
1. 获取配置文件
1 2
| cat openvpn-data/clients/client.ovpn
|
将文件下载到本地,导入 OpenVPN 客户端即可使用。
2. 修改服务器地址
1 2 3
| # 改为你的服务器 IP 和端口 remote 你的服务器IP 443
|
3. Windows 客户端使用
- 下载安装 OpenVPN GUI
- 将
.ovpn 文件放入 C:\Program Files\OpenVPN\config\
- 右键托盘图标 → 连接
4. 连接测试
1 2 3 4 5 6
|
ping 10.8.0.1
ping 172.17.85.1
|
四、证书管理
1. 生成新客户端证书
1 2 3 4 5 6 7 8 9
| docker exec -it openvpn bash
ovpn_manage --addclient 客户端名称
exit
|
新配置文件在 openvpn-data/clients/ 目录。
2. 查看证书状态
1
| docker exec openvpn cat /etc/openvpn/server/pki/index.txt
|
输出示例:
1 2 3
| V 250101120000Z 241231120000Z 01 unknown /CN=server V 250101120000Z 241231120000Z 02 unknown /CN=zhangsan R 250101120000Z 241231120000Z 03 unknown /CN=lisi
|
| 标记 |
含义 |
| V |
Valid,有效 |
| R |
Revoked,已吊销 |
3. 吊销客户端证书
用户离职或证书泄露时:
1 2 3 4 5 6 7 8 9 10
|
docker exec -it openvpn bash
ovpn_manage --revokeclient 客户端名称 -y
exit docker restart openvpn
|
被吊销的客户端连接时会收到 certificate revoked 错误。
4. 确保吊销生效
检查 server.conf 是否有:
1 2 3
| crl-verify /etc/openvpn/server/crl.pem
|
五、日常运维
查看连接状态
1 2 3 4 5
| docker exec openvpn cat /var/log/openvpn/openvpn-status.log
docker logs -f openvpn
|
查看 OpenVPN 日志
1 2 3
| docker exec openvpn cat /var/log/openvpn/openvpn.log
|
备份数据
1 2 3 4
|
tar -czvf openvpn-backup.tar.gz openvpn-data/
|
建议定期备份,包含:
六、常见问题
Q1: 连接超时
原因: 防火墙封禁 UDP 端口
解决:
- 确认云服务商安全组开放 443/UDP
- 或改用 TCP 模式:
Q2: 能连接但无法上网
原因: 没有配置路由或 NAT
解决:
1 2 3 4 5 6
| docker exec openvpn sysctl net.ipv4.ip_forward
docker exec openvpn iptables -t nat -L POSTROUTING
|
Q3: DNS 解析异常
原因: 服务端推送了错误的 DNS
解决: 注释掉 DNS 推送,使用本地 DNS
1 2
| # push "dhcp-option DNS 8.8.8.8" # push "block-outside-dns"
|
Q4: 客户端时间不同步
原因: 证书有效期校验失败
解决: 同步客户端时间
七、安全建议
| 建议 |
说明 |
| 定期更新镜像 |
docker pull hwdsl2/openvpn-server:latest |
| 保护配置文件 |
.ovpn 文件相当于钥匙,妥善保管 |
| 及时吊销证书 |
用户离职时立即吊销,不要拖延 |
| 定期备份 |
至少每周备份一次数据目录 |
| 监控日志 |
查看是否有异常连接尝试 |
总结
| 步骤 |
命令 |
| 启动服务 |
docker compose up -d |
| 修改配置 |
编辑 server.conf |
| 重启生效 |
docker restart openvpn |
| 获取客户端配置 |
cat openvpn-data/clients/client.ovpn |
| 吊销证书 |
./easyrsa revoke 客户端名称 |
OpenVPN 虽然配置稍复杂,但胜在稳定可靠、企业认可度高。掌握这些运维技能,足以应对大多数生产场景。