用于远程访问家庭局域网的OpenVPN虚拟专用网络搭建教程

如果你的家庭路由器的WAN口上没有公网IP,但你想要在外地的时候访问家庭局域网,那么可以使用OpenVPN搭建虚拟专用网络

OpenVPN,基于client/server架构,分为工作在数据链路层的TAP模式和工作在网络层的TUN模式。具体工作原理请自行搜索

一、前置条件

  • 拥有一台VPS

二、生成私钥和证书

首先在VPS上安装OpenSSL,我这里用的操作系统是ubuntu

1
sudo apt install openssl libssl-dev

然后使用OpenSSL生成OpenVPN的客户端和服务器用于双向认证的TLS证书

在你的VPS上切换到一个空目录

生成CA的私钥和根证书

1
2
3
4
5
6
# 生成CA的私钥
openssl genpkey -algorithm RSA -out CA.key -pkeyopt rsa_keygen_bits:2048
# 生成证书签名请求
openssl req -new -key CA.key -out CA.csr
# 生成CA的自签名证书
openssl x509 -req -in CA.csr -signkey CA.key -out CA.crt -days 365

注意,这里生成的CA.key一定要严格保存,不能泄漏或丢失

生成服务器的私钥和证书

1
2
3
4
5
6
# 生成服务器的私钥
openssl genpkey -algorithm RSA -out server.key -pkeyopt rsa_keygen_bits:2048
# 生成服务器的证书签名请求
openssl req -new -key server.key -out server.csr
# 生成服务器的经CA签名的证书
openssl x509 -req -in server.csr -CA CA.crt -CAkey CA.key -CAcreateserial -out server.crt -days 365

生成客户端的私钥和证书

1
2
3
4
5
6
# 生成客户端的私钥
openssl genpkey -algorithm RSA -out client1.key -pkeyopt rsa_keygen_bits:2048
# 生成客户端的证书签名请求
openssl req -new -key client1.key -out client1.csr
# 生成客户端的经CA签名的证书
openssl x509 -req -in client1.csr -CA CA.crt -CAkey CA.key -CAcreateserial -out client1.crt -days 365
1
2
3
4
5
6
# 生成客户端的私钥
openssl genpkey -algorithm RSA -out client2.key -pkeyopt rsa_keygen_bits:2048
# 生成客户端的证书签名请求
openssl req -new -key client2.key -out client2.csr
# 生成客户端的经CA签名的证书
openssl x509 -req -in client2.csr -CA CA.crt -CAkey CA.key -CAcreateserial -out client2.crt -days 365

生成Diffie-Hellman参数文件

1
openssl dhparam -out DH2048.pem 2048

至此,整个目录下应该有10个文件

  • CA.key、CA.csr、CA.crt

  • server.key、server.csr、server.crt

  • client1.key、client1.csr、client1.crt

  • client2.key、client2.csr、client2.crt

  • DH2048.pem

三、VPS上的服务器配置

首先在VPS上使用apt安装openvpn

1
sudo apt install openvpn

安装好后,把上一步中生成的server.keyserver.crtCA.crtDH2048.pem复制到VPS的目录/etc/openvpn/server

同时在/etc/openvpn/server下创建server.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
port xxx    # 监听的端口
proto tcp # TCP模式
dev tun # TUN模式
ca /etc/openvpn/server/CA.crt
cert /etc/openvpn/server/server.crt
key /etc/openvpn/server/server.key
dh /etc/openvpn/server/DH2048.pem
topology subnet # 设置网络拓扑为subnet模式
server 192.168.111.0 255.255.255.240 # 这里填一个网段即可,注意不要和原有网段冲突
client-to-client # 允许客户端之间互相通信
ifconfig-pool-persist /etc/openvpn/server/ipp.txt
keepalive 10 120
max-clients 10 # 最大客户端数
status /var/log/OpenVPN/OpenVPNStatus.log
log /var/log/OpenVPN/OpenVPN.log
verb 3 # 日志详细等级,数值越大越详细
persist-key
persist-tun
cipher AES-256-CBC
verify-client-cert require # 验证客户端的证书

然后去你的VPS提供商那里配置防火墙,放行xxx端口

接着启动OpenVPN服务器

1
sudo systemctl restart openvpn-server@server.service

四、局域网内主机的客户端配置

首先在需要放入虚拟专用网络的局域网主机上安装OpenVPN,我这里局域网主机操作系统也是ubuntu

1
sudo apt install openvpn

将第二步生成的CA.crtclient1.keyclient1.crt复制到/etc/openvpn/client目录下

然后将以下配置文件client1.conf上传到/etc/openvpn/client目录

1
2
3
4
5
6
7
8
9
10
11
12
client
dev tun
proto tcp
remote 你的VPSIP 服务器监听的端口
ca /etc/openvpn/client/CA.crt
cert /etc/openvpn/client/client1.crt
key /etc/openvpn/client/client1.key
cipher AES-256-CBC
verb 3
status /var/log/OpenVPN/OpenVPNStatus.log
log /var/log/OpenVPN/OpenVPN.log
keepalive 10 120

接着启动OpenVPN客户端

1
sudo systemctl restart openvpn-client@client1.service

如果客户端和服务器连接成功,双方都会生成一个tun0接口

这里有一个图片

这里有一个图片

双方都能互相PING通

这里有一个图片

这里有一个图片

五、外地笔记本的客户端配置

我们假设外地笔记本为windows系统

首先前往OpenVPN官网下载windows客户端

安装好客户端后,一定要确保TAP-Windows Adapter V9 for OpenVPN Connect这个网络适配器存在已启用

然后将第二步生成的client2.keyclient2.crtCA.crt复制到windows的某个目录

接着在该目录下创建配置文件client2.ovpn

1
2
3
4
5
6
7
8
9
10
client
dev tun
proto tcp
remote 14.103.157.111 22993
ca "D:\\OpenVPN\\CA.crt"
cert "D:\\OpenVPN\\client2.crt"
key "D:\\OpenVPN\\client2.key"
cipher AES-256-CBC
verb 3
keepalive 10 120

启动OpenVPN客户端,导入client2.ovpn

这里有一个图片

连接成功,分配的IP为192.168.111.3

这里有一个图片

此时PING下192.168.111.2,可以PING成功

这里有一张图片

浏览器访问下192.168.111.2上的nginx服务器,成功访问

这里有一个图片

六、添加更多局域网内主机

如果要添加更多局域网内主机到OpenVPN构建的虚拟专用网络,只用照着第二步通过OpenSSL生成客户端的私钥和证书client3.keyclient3.csrclient3.crt,然后照着第三步配置即可

同时要注意客户端数量不要超过服务器配置文件server.conf里的max-clients上限


用于远程访问家庭局域网的OpenVPN虚拟专用网络搭建教程
https://www.pasiphae.top/2023/11/01/用于远程访问家庭局域网的OpenVPN虚拟专用网络搭建教程/
作者
pasiphae
发布于
2023年11月1日
许可协议