对于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
,并重启服务器容器。
- A:请在前文提及的数据卷
- 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"
(需按照实际情况将字符串中的网络号和网络掩码更改为实际的服务器所在的局域网的值),并重启服务器容器。
- A:请在前文提及的数据卷
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
5.2 如何为客户端配置静态IP
OpenVPN 的配置文件(即openvpn.conf)中的“client-config-dir”配置项用来指明客户端的配置文件所在的文件夹,该文件夹下每一个文件对应一个客户端。该配置项默认值为ccd。
客户端配置文件通过使用“ifconfig-push”配置项来配置静态IP,每对 ifconfig-push 地址代表虚拟客户端和服务器IP端点。必须从连续的/ 30子网中获取它们,以便与Windows客户端和TAP-Windows驱动程序兼容。具体来说,每个端点对的IP地址中的最后一个八位位组必须来自以下集合:
[1,2] [5,6] [9,10] [13,14] [17,18]
[21,22] [25,26] [29,30] [33,34] [37,38]
[41,42] [45,46] [49,50] [53,54] [57,58]
[61,62] [65,66] [69,70] [73,74] [77,78]
[81,82] [85,86] [89,90] [93,94] [97,98]
[101,102] [105,106] [109,110] [113,114] [117,118]
[121,122] [125,126] [129,130] [ 133,134] [137,138]
[141,142] [145,146] [149,150] [153,154] [157,158]
[161,162] [165,166] [169,170] [173,174] [177,178]
[181,182] [185,186] [189,190] [193,194] [197,198]
[201,202] [205,206] [209,210] [213,214] [217,218]
[221,222] [225,226] [229,230] [233,234] [237,238]
[241,242] [245,246] [249,250] [253,254]
配置示例:下述名为“lijiacheng-asus”的文件内容是为客户“lijiacheng-asus”配置静态IP。
文章评论