搭建自己的 “御坂网络” 所有设备连入同一个局域网

我的设备和服务器越来越多,如果想在异地访问你的 NAS、打印机、游戏机等设备,出于安全性不能直接将所有设备暴露在公网中,搭建一个 VPN(虚拟专用网)是最好的选择。

本文方案基于 OpenVPN 实现组网,能够将多个局域网多个异地设备组成同一个网络,局域网中的设备无需额外配置,只需在路由器上配置即可。本地 IP 能够与 VPN 中 IP 保持一致,不管在家里还是在学校实验室用同一个 IP 就能访问的同一个 NAS(网络附加储存)。

网络拓扑图

搭建完成后测试,家庭宽带网络连接 VPN 延迟<20ms 带宽约 40Mbps,4G移动网络 延迟< 56ms 带宽约 30Mbps,能够满足在外访问家中 NAS 文件,流畅观看视频,远程控制甚至云游戏的需求。

目前有一款软件叫 ZeroTier 实现了类似的功能,他能够建立点对点虚拟专用网(P2P VPN) ,能使所有登录的设备都处于同一个网络中互相访问。卖点是不需要公网 IP 和服务器,直接点对点连接。

但是依赖 P2P 透传的技术都不符合我国国情,在大多数移动网络或学校网络都无法建立 P2P 连接,只能依靠服务器中继,ZeroTier 的中继服务器在墙外,速度慢的发指。

我使用的方案默认走服务器中继,稳定,兼容所有移动网络和校园网。缺点是云服务器的流量要钱。


下面是具体的配置方案,不需要的可以不用看了。网络配置非常灵活,请在理解的基础上根据自己的情况调整。

一、准备阶段

根据我的设备情况,画了一个网络拓扑图如下:

我分配了3个IP段。

  • 10.233.0.x:云服务器和直连云服务器的设备
  • 10.233.100.x:家
  • 10.233.101.x:学校实验室

为了使 VPN 中的地址和本地地址保持一致,先要在家里和学校实验室里的路由器上配置 DHCP 服务,将所有设备的本地地址改成上面的 IP 段。

准备好你的云服务器,下面只考虑 Linux 的情况,安装好 Docker 和 Docker Compose。

二、服务器配置

服务器使用的 Docker 来自 kylemanna/openvpn,详情请查看项目的 README。

先创建一个文件夹,下面所有操作、配置文件都放在这个文件夹里。

mkdir openvpn
cd openvpn

创建一个 docker-compose.yml 文件,填入以下内容

version: '2'

services:
  openvpn:
    cap_add:
      - NET_ADMIN
    image: kylemanna/openvpn
    container_name: openvpn
    ports:
      - "1194:1194/udp"
    restart: unless-stopped
    volumes:
      - ./config:/etc/openvpn

执行下面的命令初始化配置文件,把里面的 VPN.SERVERNAME.COM 换成你的域名。

docker-compose run --rm openvpn ovpn_genconfig -u udp://VPN.SERVERNAME.COM
docker-compose run --rm openvpn ovpn_initpki

成功后会出现一个 config 文件夹,里面有个 openvpn.conf 文件,我们要做一些修改。

# 将 server 设置改为
server 10.233.0.0 255.255.255.0 # 服务器所使用的IP段 IP + 子网掩码 

# 将 route 设置改为
# 告诉 OpenVPN 路由下面的 IP 段 
route 10.233.0.0 255.255.255.0    # IP段1
route 10.233.100.0 255.255.255.0  # IP段2
route 10.233.101.0 255.255.255.0  # IP段3
# 告诉客户端代理下面的 IP 段  
push "route 10.233.0.0 255.255.255.0"
push "route 10.233.100.0 255.255.255.0" 
push "route 10.233.101.0 255.255.255.0"

# 添加一条 允许客户端通过 VPN 互相通讯
client-to-client

# 将原本的 dns 设置注释掉
# push "block-outside-dns"
# push "dhcp-option DNS 8.8.8.8"
# push "dhcp-option DNS 8.8.4.4"

然后为你的客户端生成配置文件,把 your_client_name 替换成客户端名字,记住这些客户端的名字,后面还要用。
我一共4个家里 eyhn-home,学校 eyhn-school,手机 eyhn-mi8,笔记本 eyhn-macbook

export CLIENTNAME="your_client_name"
# 生成客户端密钥
docker-compose run --rm openvpn easyrsa build-client-full $CLIENTNAME nopass
# 生成客户端 ovpn 文件
docker-compose run --rm openvpn ovpn_getclient $CLIENTNAME > $CLIENTNAME.ovpn 

成功后当前文件夹下会出现 .ovpn 格式的配置文件。

默认配置文件是全局代理,但我们只希望代理局域网的流量,不想代理上网流量。编辑配置文件删除下面一行(一般在最后一行)。

redirect-gateway def1

在手机、电脑上安装好对应操作系统的 OpenVPN 客户端,把修改好的 .ovpn 配置文件下载到手机、电脑,用下面的命令启动服务器,测试一下连接。

# 加 -d 可在后台运行 
docker-compose up

如果没有问题的话,连接上的设备会被分配到 10.233.0.x 的 IP,且可以互相 PING 通。

三、路由器&旁路网关配置

这是最复杂的一部分,局域网中的设备通过网关访问VPN中的其他设备,VPN中的设备也能访问局域网中的设备。

下面是我家的配置过程,IP段是 10.233.100.x,另外一个学校的网段配置同理。

本方法是使用旁路网关实现的, 网关是一个独立的 Ubuntu 主机。你也可以使用 PC、树莓派等支持 IP forwarding 功能的主机,如果你路由器高级的话,也可以不用旁路网关,一个路由器搞定一切。

1. 连接 VPN

首先在作为网关的主机上安装 OpenVPN 客户端,下载前面生成的 .ovpn 配置文件,我这里是 eyhn-home.ovpn,运行 OpenVPN 连接到云服务器,测试连通性。

2. 静态路由配置

先在你的路由器上给作为网关的主机设置一个固定IP,我这里设置是 10.233.100.10

然后在你的路由器上找到静态路由(Static Routing)、高级路由(Advanced Routing)之类名称的设置,按照下面的方式配置,不同品牌的路由器细节不同,但原理相通。

dd-wrt 配置示例

意思就是把 10.233.0.x 的路由转发到 10.233.100.10(旁路网关)。然后 10.233.101.x 网段也同样配置一遍。

配置完成后,局域网中的设备就能通过网关访问到 VPN 中的设备了。但现在还是单向的,无法 PING 通,VPN 中的设备还无法访问局域网中的设备。

3. 服务器配置

现在回到服务器上,修改 openvpn/config 文件夹中的 openvpn.conf 文件,加入一行。

# 设置客户端特定的配置目录
client-config-dir ccd

openvpn/config 文件夹中再新建一个文件夹叫 ccd ,在里面新建一个文件,文件名是在服务器上配置的客户端名,这里是 eyhn-home

mkdir ccd
cd ccd
touch eyhn-home

写入以下内容

# 告诉 OpenVPN 把 10.233.100.x 的数据包转发给 eyhn-home
iroute 10.233.100.0 255.255.255.0

# 设置 eyhn-home 在 OpenVPN 中的固定 IP 10.233.100.10
# 与局域网固定 IP一致
ifconfig-push 10.233.100.10 255.255.255.0

重启 OpenVPN 服务器

docker-compose restart
4. 测试

尝试使用局域网里没有配置 OpenVPN 的电脑,PING 10.233.0.1(OpenVPN服务器的地址),应该能通。

同理在学校的网段 10.233.101.x 再配置一遍。

完成 Enjoy!

上面一通配置非常复杂,如果你跟着做遇到啥问题,可以 在 Telegram 联系我

“搭建自己的 “御坂网络” 所有设备连入同一个局域网”的一个回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注