openvpn
VPN open VPN
第一种方法
1.创建 OpenVPN 目录
mkdir -p ./openvpn
2.docker-compose.yaml
version: '3.8'
services:
openvpn:
image: kylemanna/openvpn:latest
container_name: openvpn
cap_add:
- NET_ADMIN # 必需的网络权限
ports:
#- "1194:1194/udp" # OpenVPN 默认端口(UDP)
- "1194:1194/tcp" # 改为TCP映射
volumes:
- ./openvpn-data:/etc/openvpn # 持久化配置和证书
restart: unless-stopped # 容器异常退出时自动重启
environment:
- TZ=Asia/Shanghai # 时区设置(可选)
3.初始化 OpenVPN 配置
# 生成默认配置文件(替换 YOUR_SERVER_IP 为公网 IP 或域名)
docker compose run --rm openvpn ovpn_genconfig -u tcp://YOUR_SERVER_IP
# 初始化 PKI(交互式输入 CA 名称和密码)
docker compose run --rm -it openvpn ovpn_initpki
4.启动 OpenVPN 服务
docker compose up -d
docker compose logs -f openvpn
# Initialization Sequence Completed
5.生成客户端证书
# 生成客户端证书(例如客户端名称为 client1)
docker compose run --rm -it openvpn easyrsa build-client-full CLIENT_NAME nopass
# 导出客户端配置文件
docker compose run --rm openvpn ovpn_getclient CLIENT_NAME > ./CLIENT_NAME.ovpn
5.5 可选 允许客户端之间互相访问
vim ./openvpn-data/openvpn.conf
# 添加一行 重启服务
client-to-client
MAC M1 客户端配置优化建议
client
nobind
dev tun
remote-cert-tls server
remote 8.216.32.199 1194 tcp
# 新增M1兼容配置
tls-client
cipher AES-256-GCM
auth SHA256
persist-key
persist-tun
tls-version-min 1.2
remote-cert-eku "TLS Web Server Authentication"
# 解决DNS泄漏(可选)
dhcp-option DNS 8.8.8.8
dhcp-option DNS 8.8.4.4
# 超时重试配置
connect-retry 5 30
connect-timeout 60
6.防火墙配置
# 开放 UDP 1194 端口
sudo firewall-cmd --permanent --add-port=1194/udp
sudo firewall-cmd --reload
# 关闭 SELinux(临时生效)
sudo setenforce 0
7.验证
# 检查容器运行状态
docker ps | grep openvpn
# 查看服务日志
docker logs openvpn
8.宿主机内核参数调整
- 在宿主机中编辑/etc/sysctl.conf或/usr/lib/sysctl.d/*.conf文件,添加以下参数以启用IPv6默认转发:
net.ipv6.conf.default.forwarding=1
sysctl -p
sysctl net.ipv6.conf.default.forwarding
第二种方法
version: '3.8'
services:
openvpn:
image: kylemanna/openvpn:latest # 使用社区维护的 OpenVPN 镜像
container_name: openvpn
restart: unless-stopped
cap_add:
- NET_ADMIN # 允许容器管理网络接口
ports:
- "1194:1194/udp" # 映射 UDP 1194 端口(OpenVPN 默认端口)
volumes:
- ./openvpn-data:/etc/openvpn # 持久化存储配置和证书
environment:
- EASYRSA_KEY_SIZE=4096 # 证书密钥长度
- EASYRSA_CA_EXPIRE=3650 # CA 证书有效期(10年)
- EASYRSA_CRL_DAYS=180 # 证书吊销列表有效期
networks:
vpn_net: # 自定义网络(可选)
ipv4_address: 10.88.0.2 # 固定容器 IP(避免 DHCP 冲突)
networks:
vpn_net:
driver: bridge
ipam:
config:
- subnet: 10.88.0.0/24 # 定义 Docker 内部子网(与 OpenVPN 服务端子网隔离)
1.初始化 OpenVPN 服务端配置
# 创建配置目录
mkdir -p ./openvpn-data
# 初始化配置文件(替换 YOUR.SERVER.DOMAIN 为你的公网 IP 或域名)
docker-compose run --rm openvpn ovpn_genconfig \
-u udp://47.239.214.124 \
-p "route 192.168.1.0 255.255.255.0" # 推送客户端可访问的局域网路由
-e "duplicate-cn" # 允许多客户端使用同一证书(测试用,生产环境建议关闭)
-s 10.8.0.0/24 # OpenVPN 服务端 IP 池(确保与本地网络不冲突)
2.生成 CA 和服务器证书
# 生成 CA 证书(按提示输入信息)
docker-compose run --rm openvpn ovpn_initpki
# 生成服务端证书(服务端名称为 "server")
docker-compose run --rm openvpn easyrsa build-server-full server nopass
3.启动 OpenVPN 服务
docker-compose up -d # 启动容器
docker-compose logs -f # 查看实时日志(确认无报错)
生成客户端配置文件
1.创建客户端证书
# 生成客户端证书(例如客户端名为 "client1")
docker-compose run --rm openvpn easyrsa build-client-full client1 nopass
2.导出客户端 .ovpn 文件
# 导出配置文件(自动嵌入证书)
docker-compose run --rm openvpn ovpn_getclient client1 > client1.ovpn
3.客户端配置文件示例
client
dev tun
proto udp
remote YOUR.SERVER.DOMAIN 1194 # 替换为你的公网 IP 或域名
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
cipher AES-256-CBC
verb 3
# 内嵌证书(直接包含在 .ovpn 文件中)
<ca>
-----BEGIN CERTIFICATE-----
...(CA 证书内容)
-----END CERTIFICATE-----
</ca>
<cert>
-----BEGIN CERTIFICATE-----
...(客户端证书内容)
-----END CERTIFICATE-----
</cert>
<key>
-----BEGIN PRIVATE KEY-----
...(客户端私钥内容)
-----END PRIVATE KEY-----
</key>
五、关键网络配置说明
- 服务端 IP 池 (-s 10.8.0.0/24)
- 确保与客户端本地网络(如 192.168.1.0/24)不重叠,否则路由冲突。
- 客户端连接后会分配到 10.8.0.x 的 IP。
- 路由推送 (-p "route ...")
- 若需客户端访问服务端所在局域网的设备(如 192.168.1.0/24),必须推送路由。
- 客户端需开启 IP 转发(Windows/Mac 客户端通常自动处理)。
- Docker 自定义网络 (vpn_net)
- 为 OpenVPN 容器分配固定 IP (10.88.0.2),避免与其他容器冲突。
- 若不需要访问其他容器,可删除自定义网络配置,使用默认桥接网络。
- 防火墙与端口映射
- 宿主机需开放 UDP 1194 端口(检查 iptables/ufw/云服务商安全组)。