Skip to main content

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>

五、关键网络配置说明

  1. ‌服务端 IP 池 (-s 10.8.0.0/24)‌
  • 确保与客户端本地网络(如 192.168.1.0/24)不重叠,否则路由冲突。
  • 客户端连接后会分配到 10.8.0.x 的 IP。
  1. ‌路由推送 (-p "route ...")‌
  • 若需客户端访问服务端所在局域网的设备(如 192.168.1.0/24),必须推送路由。
  • 客户端需开启 IP 转发(Windows/Mac 客户端通常自动处理)。
  1. Docker 自定义网络 (vpn_net)‌
  • 为 OpenVPN 容器分配固定 IP (10.88.0.2),避免与其他容器冲突。
  • 若不需要访问其他容器,可删除自定义网络配置,使用默认桥接网络。
  1. ‌防火墙与端口映射‌
  • 宿主机需开放 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 # 测试服务端所在局域网的设备

七、常见问题修复

  1. 客户端无法连接‌
  • 检查 client.ovpn 中的 remote 地址是否正确。
  • 确认宿主机防火墙允许 UDP 1194 入站流量。
  1. ‌客户端能连接但无法访问内网‌
  • 确保服务端配置中推送了正确的路由(-p "route ...")。
  • 在服务端宿主机启用 IP 转发:
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p

  1. 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

二、安装依赖组件

yum install -y epel-release
yum install -y openvpn easy-rsa openssl lzo pam

三、证书体系搭建

1. ‌初始化证书环境

mkdir -p /opt/easy-rsa
cp -rf /usr/share/easy-rsa/3.0.8/* /opt/easy-rsa/
cd /opt/easy-rsa && ./easyrsa init-pki

2. 配置证书参数

  • 编辑/opt/easy-rsa/vars文件:
set_var EASYRSA_REQ_COUNTRY   "CN"
set_var EASYRSA_REQ_PROVINCE "Shanghai"
set_var EASYRSA_REQ_ORG "MyCompany"

3. 生成核心证书

./easyrsa build-ca          # 生成CA证书
./easyrsa gen-req server nopass # 生成服务器密钥
./easyrsa sign server server # 签发服务器证书
./easyrsa gen-dh # 生成Diffie-Hellman参数

四、服务器配置

‌1.配置文件部署

cp /opt/easy-rsa/pki/{ca.crt,dh.pem,issued/server.crt,private/server.key} /etc/openvpn/
cp /usr/share/doc/openvpn-*/sample/sample-config-files/server.conf /etc/openvpn/

2. 编辑主配置文件

  • 修改/etc/openvpn/server.conf
port 1194
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key
dh dh.pem
server 10.8.0.0 255.255.255.0
push "route 192.168.0.0 255.255.255.0" # 内网路由推送
keepalive 10 120
cipher AES-256-CBC
user nobody
group nobody

五、网络与防火墙

# 配置NAT转发
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j MASQUERADE

# 开放UDP端口
iptables -A INPUT -p udp --dport 1194 -j ACCEPT

六、客户端配置

1. ‌生成客户端证书

./easyrsa gen-req client1 nopass
./easyrsa sign client client1

2.导出配置文件

  • 创建client.ovpn文件包含:
client
dev tun
proto udp
remote your_server_ip 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert client1.crt
key client1.key
cipher AES-256-CBC

七、服务管理

systemctl start openvpn@server
systemctl enable openvpn@server

八、验证测试

  • 服务状态检查:systemctl status openvpn@server
  • 连接日志查看:tail -f /var/log/openvpn.log
  • 客户端IP分配验证:ip addr show tun0
补充说明
  • 推荐使用TLS 1.3协议时需更新cipher参数‌3
  • 多客户端管理建议采用client-config-dir目录‌6
  • 证书有效期默认365天,需定期更新‌4

‌验证与调试

1.客户端连接测试‌:

openvpn --config client1.ovpn  # 观察日志输出是否包含 `Initialization Sequence Completed`‌:ml-citation{ref="1,5" data="citationList"}  

‌2.IP 地址检查‌:

ip addr show tun0  # 确认已分配 VPN 内网 IP(如 `10.8.0.6`)‌:ml-citation{ref="1,5" data="citationList"}