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/云服务商安全组)。
- 验证端口映射是否生效:
netstat -an | grep 1194 # 应显示 0.0.0.0:1194 或 [::]:1194
六、客户端连接后调试
1. 检查客户端 IP 分配
# 进入 OpenVPN 容器
docker exec -it openvpn bash
# 查看已连接客户端
cat /etc/openvpn/openvpn-status.log
2.测试客户端到服务端内网连通性
# 在客户端执行
ping 10.8.0.1 # 测试 VPN 网关
ping 192.168.1.100 # 测试服务端所在局域网的设备
七、常见问题修复
- 客户端无法连接
- 检查 client.ovpn 中的 remote 地址是否正确。
- 确认宿主机防火墙允许 UDP 1194 入站流量。
- 客户端能连接但无法访问内网
- 确保服务端配置中推送了正确的路由(-p "route ...")。
- 在服务端宿主机启用 IP 转发:
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p
- Docker 网络冲突
- 若使用自定义网络,确保其他容器与 vpn_net 互通或通过网关路由。
第三种方法,Linux安装
一、系统环境准备
1. 关闭SELinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
setenforce 0
2. 关闭防火墙
systemctl stop firewalld && systemctl disable firewalld
3.启用IP转发
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p