Docker 部署 OpenVPN:仅特定网段走 VPN,默认流量保留本地网关

yangx5 发布于 5 天前 13 次阅读


在实际场景中,我们常需要 OpenVPN 仅对特定内网网段生效,而浏览外网、访问其他资源时仍使用本地网络,避免所有流量都经过 VPN 隧道。本文基于kylemanna/openvpn镜像,详细讲解 Docker 部署 OpenVPN 的完整流程,并重点说明如何配置 “特定网段走 VPN,默认走本地网关”。

一、环境准备与初始化

1. 创建数据存储目录

首先创建用于挂载 OpenVPN 配置、证书的目录(确保权限正确):

mkdir -p /vol1/1000/Docker/openvpn
chmod 755 /vol1/1000/Docker/openvpn  # 避免容器内权限不足

2. 生成服务器基础配置

使用镜像自带的ovpn_genconfig工具生成初始配置,需指定公网访问地址(域名或 IP):

docker run -v /vol1/1000/Docker/openvpn:/etc/openvpn --rm kylemanna/openvpn ovpn_genconfig -u udp://[此处填写ddns域名或者公网IP]

2025-09-12T05:55:47.png
执行说明

  • 命令会在/vol1/1000/Docker/openvpn目录生成openvpn.conf(主配置)、ovpn_env.sh(环境变量)等文件。
  • 初始配置默认会推送 “全量路由”(所有流量走 VPN),后续需修改此行为。

操作步骤

  1. 输入 CA 证书的密码(牢记,后续生成客户端证书时需用到)。 2025-09-12T05:56:59.png
  2. 输入 Common Name(自定义名称,如openvpn-server),直接回车默认即可。 2025-09-12T05:57:12.png
  3. 等待工具自动生成 CA、服务器证书、DH 参数等(生成过程可能需要几分钟)。 2025-09-12T05:57:21.png

二、核心配置:仅特定网段走 VPN

默认配置会让所有流量通过 VPN,需修改环境变量和服务器配置,实现 “仅指定网段走 VPN,其他流量走本地网关”。

1. 修改环境变量(ovpn_env.sh

环境变量文件控制路由推送、NAT 等核心功能:

# 在宿主机编辑文件
nano /vol1/1000/Docker/openvpn/ovpn_env.sh

替换为以下内容(关键修改已标注):

# 基础配置(保留默认值,修改以下关键项)
export OVPN_DEFROUTE=0  # 禁用默认路由推送(核心:避免所有流量走VPN)
export OVPN_NAT=1       # 启用NAT转换(解决目标网段回程流量问题)
# 仅推送以下网段走VPN(用空格分隔,替换为你的实际网段)
export OVPN_ROUTES="10.1.0.0/16 192.168.1.0/24 192.168.40.0/24 192.168.50.0/24 192.168.97.0/24"
# 其他默认配置保持不变(如端口、DNS等)
export OVPN_DNS=1
export OVPN_DNS_SERVERS="8.8.8.8 8.8.4.4"  # 按需保留或删除
export OVPN_PORT=1194
export OVPN_PROTO=udp
export OVPN_SERVER=192.168.255.0/24  # VPN虚拟网段(默认即可)

保存后设置权限

chmod +x /vol1/1000/Docker/openvpn/ovpn_env.sh  # 赋予执行权限

2. 调整服务器配置(openvpn.conf

确保配置与环境变量协同,避免冲突:

# 在宿主机编辑
nano /vol1/1000/Docker/openvpn/openvpn.conf

添加 / 修改以下内容:

# 禁用客户端拉取默认路由(与OVPN_DEFROUTE=0呼应)
push "route-nopull"

# 保留服务器端对目标网段的路由(确保服务器能访问这些网段)
route 10.1.0.0 255.255.0.0
route 192.168.1.0 255.255.255.0
route 192.168.40.0 255.255.255.0
route 192.168.50.0 255.255.255.0
route 192.168.97.0 255.255.255.0

# 其他默认配置保持不变(证书路径、端口等)

三、启动 OpenVPN 服务器

使用以下命令启动容器,确保赋予网络管理权限和 IP 转发能力:

docker run -d \
  -v /vol1/1000/Docker/openvpn:/etc/openvpn \
  -p 1194:1194/udp \
  --cap-add=NET_ADMIN \  # 必需:允许容器管理网络(路由、NAT等)
  --sysctl net.ipv4.ip_forward=1 \  # 启用IP转发(关键:允许流量中转)
  --name openvpn-server \
  --restart=always \
  kylemanna/openvpn

四、生成客户端配置文件

1. 生成客户端证书

为用户(如admin)生成证书(需输入 CA 密码和客户端证书密码):

docker run -v /vol1/1000/Docker/openvpn:/etc/openvpn --rm -it kylemanna/openvpn easyrsa build-client-full admin

2025-09-12T05:57:47.png
操作说明:

  1. 将上述命令中的admin替换为你要新增的实际用户名
  2. 执行第一条命令时,会提示输入 PEM 密码(用于保护客户端证书),以及 CA 的密码(初始化时设置的)

2. 导出客户端配置(.ovpn

生成可直接导入 OpenVPN 客户端的配置文件:

docker run --rm -v /vol1/1000/Docker/openvpn:/etc/openvpn kylemanna/openvpn ovpn_getclient admin > /vol1/1000/Docker/openvpn/admin.ovpn

2025-09-12T05:58:04.png
打开配置文件,admin.ovpn
2025-09-12T05:58:18.png
说明:生成的admin.ovpn已包含证书、密钥及服务器推送的路由配置,无需额外修改。

五、验证配置是否生效

1.客户端连接后验证路由

客户端导入admin.ovpn并连接,执行以下命令检查路由表:

  • Windowsroute print,确认10.1.0.0/16192.168.1.0/24等网段的网关为 VPN 分配的虚拟 IP(如192.168.255.x),而0.0.0.0默认路由的网关仍为本地路由器 IP(如192.168.31.1)。
  • Linux/macOSip routeroute -n,验证逻辑同上。

2.测试连通性

  • 访问OVPN_ROUTES中的网段(如192.168.1.1),应能正常通信(走 VPN)。
  • 访问外网(如ping 8.8.8.8),应通过本地网关(可在路由器后台查看流量走向)。

通过以上步骤,即可实现 “仅特定网段走 VPN,默认流量保留本地网关” 的需求,兼顾内网访问和外网速度。