内网穿透系列十五：Docker 部署 OpenVPN 攻略，集成 Web UI，实现一键式异地组网

<img width="661" height="372" src=":/f4ac0e4ef2244a249f4c250a6893c57e"/>

  

## 一、简介

- • 本文介绍如何利用基于 Docker 封装的 openvpn 镜像快速实现异地组网
    
- • 集成了 Web UI，可实现在线授权访问，在线调整openvpn客户端、服务端配置，在线管理客户端连接证书配置
    
- • 基于企业级的 openvpn 工具生态，可靠、稳定、安全，各种操作系统的连接客户端一键接入虚拟网络
    
- • 开源项目参考：https://github.com/d3vilh/openvpn-server
    
- • OpenVPN 异地组网拓扑图参考  
    
    ![图片](data:image/svg+xml,%3C%3Fxml%20version='1.0'%20encoding='UTF-8'%3F%3E%3Csvg%20width='1px'%20height='1px'%20viewBox='0%200%201%201'%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg%20stroke='none'%20stroke-width='1'%20fill='none'%20fill-rule='evenodd'%20fill-opacity='0'%3E%3Cg%20transform='translate%28-249.000000,%20-126.000000%29'%20fill='%23FFFFFF'%3E%3Crect%20x='249'%20y='126'%20width='1'%20height='1'%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E "null")
    
      
    

## 二、安装与使用

### 1\. 快速搭建 openvpn-server、可视化Web UI服务

- • 克隆仓库，该仓库已经配置好各种启动配置
    

`git clone https://github.com/d3vilh/openvpn-server.git`

- • 进入openvpn-server目录，查看编辑目录下的docker-compose.yml配置文件
    

`version: "3.5"services:        openvpn:              container_name: openvpn              # If you want to build your own image with docker-compose, uncomment the next line, comment the "image:" line and run "docker-compose build" following by "docker-compose up -d"              # build: .              image: d3vilh/openvpn-server:latest              privileged: true              ports:                      - "1194:1194/udp"   # openvpn UDP port                    - "1194:1194/tcp"   # openvpn TCP port                  # - "2080:2080/tcp"  # management port. uncomment if you would like to share it with the host              environment:                      TRUST_SUB: "10.0.70.0/24"                      GUEST_SUB: "10.0.71.0/24"                          HOME_SUB: "192.168.88.0/24"              volumes:                      - ./pki:/etc/openvpn/pki                      - ./clients:/etc/openvpn/clients                      - ./config:/etc/openvpn/config                      - ./staticclients:/etc/openvpn/staticclients                      - ./log:/var/log/openvpn                      - ./fw-rules.sh:/opt/app/fw-rules.sh                      - ./checkpsw.sh:/opt/app/checkpsw.sh                      - ./server.conf:/etc/openvpn/server.conf              cap_add:                      - NET_ADMIN              restart: always              depends_on:                      - "openvpn-ui"        openvpn-ui:              container_name: openvpn-ui              image: d3vilh/openvpn-ui:latest              environment:                      - OPENVPN_ADMIN_USERNAME=admin  #web ui登录账号，必须调整成复杂的                      - OPENVPN_ADMIN_PASSWORD=gagaZush  #web ui登录密码，必须调整成复杂的              privileged: true              ports:                      - "18080:8080/tcp" #web ui的端口，根据需要调整外部端口              volumes:                      - ./:/etc/openvpn                      - ./db:/opt/openvpn-ui/db                      - ./pki:/usr/share/easy-rsa/pki                      - /var/run/docker.sock:/var/run/docker.sock:ro              restart: always`

- • 配置完成，执行下面命令一键启动
    

`docker-compose up -d`

成功启动截图  

![图片](data:image/svg+xml,%3C%3Fxml%20version='1.0'%20encoding='UTF-8'%3F%3E%3Csvg%20width='1px'%20height='1px'%20viewBox='0%200%201%201'%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg%20stroke='none'%20stroke-width='1'%20fill='none'%20fill-rule='evenodd'%20fill-opacity='0'%3E%3Cg%20transform='translate%28-249.000000,%20-126.000000%29'%20fill='%23FFFFFF'%3E%3Crect%20x='249'%20y='126'%20width='1'%20height='1'%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E "null")

  

### 2\. 登录管理界面，进行初始化配置，新建客户端连接配置

![图片](data:image/svg+xml,%3C%3Fxml%20version='1.0'%20encoding='UTF-8'%3F%3E%3Csvg%20width='1px'%20height='1px'%20viewBox='0%200%201%201'%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg%20stroke='none'%20stroke-width='1'%20fill='none'%20fill-rule='evenodd'%20fill-opacity='0'%3E%3Cg%20transform='translate%28-249.000000,%20-126.000000%29'%20fill='%23FFFFFF'%3E%3Crect%20x='249'%20y='126'%20width='1'%20height='1'%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E "null")

  

### 3\. 客户端节点接入虚拟局域网

- • 各种操作系统的客户端下载地址参考：https://openvpn.net/client/  
    
    ![图片](data:image/svg+xml,%3C%3Fxml%20version='1.0'%20encoding='UTF-8'%3F%3E%3Csvg%20width='1px'%20height='1px'%20viewBox='0%200%201%201'%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg%20stroke='none'%20stroke-width='1'%20fill='none'%20fill-rule='evenodd'%20fill-opacity='0'%3E%3Cg%20transform='translate%28-249.000000,%20-126.000000%29'%20fill='%23FFFFFF'%3E%3Crect%20x='249'%20y='126'%20width='1'%20height='1'%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E "null")
    
      
    
- • 也可以通过Docker容器作为客户端连接（不支持Windows）  
    新建客户端docker-compose.yml配置文件，内容如下：
    

`version: '3'services:    openvpn-client:        image: dperson/openvpn-client        restart: always        cap_add:            - NET_ADMIN  # 需要此权限来修改网络设置        volumes:            - ./vpn:/vpn  # 将配置文件挂载到容器内        network_mode: host`

把新增的客户端配置文件复制到./vpn目录内，然后一键启动

`docker-compose up -d`

## 三、总结

- • 使用该工具可以快速搭建虚拟专用网络，实现多机器异地组网
    
- • openvpn 是成熟的企业级的VPN方案，安全稳定可靠
    
- • 集成了 Web UI 在线管理，便于在线监控与管理，实现可观测的管控

id: 2aad79c091be4618bffe05000213f5b4
parent_id: c4b5bbe706394f1a919a418c1f48165a
created_time: 2025-12-04T14:06:49.154Z
updated_time: 2025-12-04T14:06:49.154Z
is_conflict: 0
latitude: 0.00000000
longitude: 0.00000000
altitude: 0.0000
author: 
source_url: https://mp.weixin.qq.com/s/9RepDKSAyQeUppyP-4WDfw
is_todo: 0
todo_due: 0
todo_completed: 0
source: joplin-desktop
source_application: net.cozic.joplin-desktop
application_data: 
order: 1764857209154
user_created_time: 2025-12-04T14:06:49.154Z
user_updated_time: 2025-12-04T14:06:49.154Z
encryption_cipher_text: 
encryption_applied: 0
markup_language: 1
is_shared: 0
share_id: 
conflict_original_id: 
master_key_id: 
user_data: 
deleted_time: 0
type_: 1