为什么选择 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 端口,避开防火墙对 1194 的限制
            - "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. 启动服务

1
docker compose up -d

首次启动会自动生成:

  • 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
docker restart openvpn

三、客户端配置

1. 获取配置文件

1
2
# 查看生成的客户端配置
cat openvpn-data/clients/client.ovpn

将文件下载到本地,导入 OpenVPN 客户端即可使用。

2. 修改服务器地址

1
2
3
# 改为你的服务器 IP 和端口
remote 你的服务器IP 443

3. Windows 客户端使用

  1. 下载安装 OpenVPN GUI
  2. .ovpn 文件放入 C:\Program Files\OpenVPN\config\
  3. 右键托盘图标 → 连接

4. 连接测试

1
2
3
4
5
6

# 测试 VPN 内网可达性
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/

建议定期备份,包含:

  • CA 证书
  • 服务端证书
  • 所有客户端证书
  • 配置文件

六、常见问题

Q1: 连接超时

原因: 防火墙封禁 UDP 端口
解决:

  1. 确认云服务商安全组开放 443/UDP
  2. 或改用 TCP 模式:
    1
    proto tcp
1
2
ports:
    - "443:443/tcp"

Q2: 能连接但无法上网

原因: 没有配置路由或 NAT
解决:

1
2
3
4
5
6
# 检查 IP 转发
docker exec openvpn sysctl net.ipv4.ip_forward
# 应该返回 1
# 检查 NAT 规则(容器内)
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: 客户端时间不同步

原因: 证书有效期校验失败
解决: 同步客户端时间

1
2
3
4
# Linux
ntpdate pool.ntp.org
# Windows:设置 → 时间 → 同步

七、安全建议

建议 说明
定期更新镜像 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 虽然配置稍复杂,但胜在稳定可靠、企业认可度高。掌握这些运维技能,足以应对大多数生产场景。