Reius

  • 政策
    • 企业
  • 哲学
    • 逻辑学
  • 工具
    • 软件
    • 硬件
  • 规范
    • JEDEC
    • IEEE
    • ARM
    • ONFI
  • 杂文
  • 关于
坚持成为你认为应该成为的人
  1. 首页
  2. 工具
  3. 软件
  4. 正文

基于Docker搭建VPN

2022年4月28日 3757点热度 18人点赞 0条评论

对于VPN,无需多言,可以使得远在千里之外的不同网络下的计算机处于同一个专用网络。这意味着如果有一台自己的云服务器,则利用VPN技术可使手机、笔记本、云服务器处于同一个专用网络。一般来说,各大云计算公司均有有售VPN网关的产品,我们可以使用这些产品。但不幸的是,这些产品的价格往往比高昂。

退而求其次,我们可以在自己的服务器上搭建VPN服务以组建一个VPN网络。本文基于Docker进行搭建,并假设读者已经具有使用Docker的知识。

1. 概述

在软件架构中,VPN网络的基础设施呈现客户端-服务器结构。客户端每次加入VPN网络时需携带认证信息(密码或密钥)并向服务器进行申请。若经服务器审核通过,这个客户端便加入了VPN网络。

客户端加入VPN网络后,整个VPN网络中可能存在如下访问需求:

  • 任一客户端可以访问服务端
  • 多个客户端之间可以互相访问
  • 服务端可以访问任一客户端
  • 服务器所在局域网中的任一设备可以访问VPN网络下的任一设备
  • VPN网络下的任一设备可以访问服务器所在局域网中的任一设备

本文所搭建的VPN网络将会支持上述需求,搭建过程中依赖的资源如下:

  • 服务端软件:OpenVPN 容器。
  • 客户端软件:OpenVPN Connect(若网络受限请在自行在第三方网站下载)。

2. 搭建

我们所搭建的VPN服务使用了第三方容器,使用这个容器搭建VPN服务是比较便捷的。整个搭建过程共如下4步:

步骤一:搭建OpenVPN运行环境。在服务器执行下述命令以配置OpenVPN运行环境,成功执行后意味着OpenVPN的运行环境已搭建完毕。

# 执行命令时请将命令中字符串VPN.SERVERNAME.COM替换为你的服务器地址,如vpn.reius.cn
docker run -v data-openvpn:/etc/openvpn --rm kylemanna/openvpn ovpn_genconfig -u udp://VPN.SERVERNAME.COM
docker run -v data-openvpn:/etc/openvpn --rm -it kylemanna/openvpn ovpn_initpki

步骤二:启动OpenVPN服务。在服务器执行下述命令以启动OpenVPN服务。

docker run -v data-openvpn:/etc/openvpn -d -p 1194:1194/udp --name vpn-server --cap-add=NET_ADMIN kylemanna/openvpn

步骤三:生成客户端认证信息文件。在服务器重复执行下述命令为OpenVPN配置一些客户端。成功执行后将生成的认证信息文件分发给各个客户端。客户端使用这些证书可顺利加入VPN网络。

# 执行命令时请将命令中的字符串CLIENT_NAME替换为你的客户名,如lijiacheng
docker run -v data-openvpn:/etc/openvpn --rm -it kylemanna/openvpn easyrsa build-client-full CLIENT_NAME nopass
# 此命令将生成认证信息文件并拷贝至服务器的当前目录
docker run -v data-openvpn:/etc/openvpn --rm kylemanna/openvpn ovpn_getclient CLIENT_NAME > CLIENT_NAME.ovpn 

步骤四:客户端加入VPN网络。在客户端机器下载前文提及的软件“OpenVPN Connect”,并使用该软件加入VPN网络。若有多个客户请分别重复执行步骤三和步骤四。

3. 效果

执行完毕“2. 搭建”章节描述的步骤后,客户端应当已加入VPN网络,但使用上可能存在问题。若存在问题,请参照以下内容对服务器配置做相应的修正。

  • Q:任一客户端无法访问服务端
    • A:请开放服务器1194端口,包括防火墙安全组等。
  • Q:多个客户端之间无法互相访问
    • A:请在前文提及的数据卷data-openvpn的配置文件openvpn.conf中添加新行client-to-client,并重启服务器容器。
  • Q:服务端无法访问任一客户端
    • A:请确保客户端机器防火墙没有阻拦(可临时客户端关闭防火墙进行测试)
  • Q:服务器所在局域网中的任一设备无法访问VPN网络下的任一设备
    • 请检查路由表并确认访问信息可达,若不可达请做相应的路由配置(配置路由表或者执行docker run命令时添加参数--net host以达到令VPN服务端充当网关的目的)
  • Q:VPN网络下的任一设备无法访问服务器所在局域网中的任一设备
    • A:请在前文提及的数据卷data-openvpn的配置文件openvpn.conf中添加新行push "172.24.177.0 255.255.255.0"(需按照实际情况将字符串中的网络号和网络掩码更改为实际的服务器所在的局域网的值),并重启服务器容器。

4. 示例

示例一:远程嵌入式调试。对于远程嵌入式开发,默认可以通过VScode远程访问服务器进行编辑与编译。但在VPN网络与GDB server工具的加持下,远程调试也成为可能。图示远程嵌入式调试。

5. 附录

5.1 服务端命令

5.1.2 删除客户端

在服务端执行下述命令以删除单个客户端。

# 执行命令时请将命令中的字符串CLIENT_NAME替换为你的客户名,如lijiacheng
docker run -v data-openvpn:/etc/openvpn --rm -it kylemanna/openvpn easyrsa revoke CLIENT_NAME
本作品采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可
标签: VPN
最后更新:2023年4月5日

李嘉诚

这个人很懒,什么都没留下

点赞
< 上一篇
下一篇 >

文章评论

您需要 登录 之后才可以评论
文章目录
  • 1. 概述
  • 2. 搭建
  • 3. 效果
  • 4. 示例
  • 5. 附录
    • 5.1 服务端命令
标签聚合
笔记 自旋琐 Wi-Fi 截屏 VPN littlefs deepin SFDP
最新 热点 随机
最新 热点 随机
几种经典的滤波算法 拉杆箱密码锁的工作原理分析 注册公司的流程 命题逻辑笔记 JESD254(安全的串行Flash总线事务) IEEE Std 1003.1 (POSIX.1)
ONFI Redis JESD254(安全的串行Flash总线事务) Clang-Format linux自旋琐源码分析 拉杆箱密码锁的工作原理分析

COPYRIGHT © 2023 Reius. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

萌ICP备20233055号

晋ICP备17003055号-4

晋公网安备 14062402000036 号