如何玩转智能家居 - 如何优雅的访问家庭网络

接上篇文章,继续折腾家庭网络:如何玩转智能家居 - 网络如何智能openwrt+v2ray

本篇文章解决问题是:如何通过配置wireguard实现从世界任何地方优雅的访问家庭网络。我们在家庭网络使用场景汇总一定会遇到以下情况,人在外:

  1. 想要访问家庭网络中的NAS服务,获取一些资料。
  2. 想要下载一部资源,添加下载任务,一回家就可使用
  3. 全屋智能家居,某一个设备出现故障,想要直接接入家庭网络查看原因修复
  4. 等等…

这些场景的基本需求都是,能够在外网连接到家庭网络,同时又要保障安全性,但问题是

  • 没有公网IP,现在IPv4已经耗尽,想要从运营商那获得公网IP还是很困难的,而且IPv6目前还不是很普及。
  • 家庭内部网络安全性脆弱,需要防火墙来保护,一般的不应该将家庭网络中的服务暴露在公网中,这样会有极大的安全隐患。

那本篇文章的目的是:通过VPN的形式使得在外网如同访问家庭内部局域网一样,让外部设备与家庭网络中的设备形成一个局域网。

那为什么选择wireguard:

  • 开源:https://github.com/WireGuard
  • 简单:代码简单,仅4000余行,原理简单,部署简单。
  • 安全:支持最新加密技术,Curve25519、ChaCha20等。
  • 性能:WireGuard 虚拟网由于是100%内核处理,省去了用户进程和内核交互的开销,因此性能优越,具体表现为吞吐量高。

网络架构: homenet-design

博主目前设计的网络架构如上图,不过本篇文章只讲 光猫<->R2S<->路由器 这样的链路:

光猫:192.168.1.1
R2S:192.168.100.1
路由器:192.168.2.1

提前准备

这里假设你已经准备好已经准备好openwrt路由器。我们还需要准备:

一个公网IP:一是家里自带公网IP+DDNS,或者购买一台公网服务器VPS 一个域名:可选,如果你的公网IP是动态的,那就需要域名且必须通过DDNS

FRP

因为博主家里没有公网IP,那么只能通过这种内网穿透的方式实现,将wireguard的udp端口通过代理的方式进行。具体配置较简单请参考:https://gofrp.org/docs/,也可参考:记一次树莓派搭建git服务器及内网穿透过程

在vps上安装请到 frp/releases 下载对应架构的最新版本即可。服务端配置:

[common]
bind_port = 7000

token = 768f72bc664ad2ad7c9edccf65523fd7

在openwrt安装frp,请到 System->Software 搜索 frpc 安装。 software-frpc

假设这里我们选择端口 51820/udp 作为wireguard的通信端口,IP 10.0.0.1作为wireguard的网关IP。对了,记得将vps的防火墙打开,否则frpc连不上vps。配置如下:

[common]
server_addr = xxx.xxx.xxx.xxx
server_port = 7000

token = 768f72bc664ad2ad7c9edccf65523fd7

[wireguard]
type = udp
local_ip = 10.0.0.1
local_port = 51820
remote_port = 51820

如果不出意外的,openwrt中的frpc已经跑起来了。

WireGuard

WireGuard是点对点的网络,每个节点既可以做服务器,又可以做客户端。我们这里将部署在openwrt中的wireguard节点称为服务端,在手机或电脑端部署的wireguard节点称为客户端。

安装wireguard的方式可参考官方网站:https://www.wireguard.com/install/

安装wireguard

在openwrt中安装wireguard建议通过System->Software进行安装:

software-wireguard

安装完成,重启路由器。同时你也会看到 Status->WireGuardwireguard-status

配置服务端

需要了解细节的朋友可以参考官方 Quick Start,我们这里通过openwrt进行wireguard服务端配置。

1、点击 Network->Interface 中的 Add new interface 创建接口: wireguard-interface

2、接口名称建议 wg0,协议选择 WireGuard VPN 进行创建: wireguard-create

3、一般设置:

  • Private Key 是WireGuard节点的私钥,私钥建议通过命令生成,方便算公钥:

    # 通过ssh登录到openwrt,执行
    $ wg genkey | tee privatekey | wg pubkey > publickey
    $ cat privatekey publickey
    
  • Listen Port 监听的端口,这里设置为 51820 与 frpc 配置对应即可。

  • IP Addresses 是WireGuard接口的私有IP网段,这里设置为 10.0.0.1/24 与 frpc 配置对应,不要与其它内网IP段冲突。

wireguard-general-settings

4、防火墙设置,有 vpnvpn,无则选 lanwireguard-firewall-settings

最后 Save,保存即可,后续再步骤添加 Peers

客户端配置

首先,通过这里的安装方式进行客户端的安装:https://www.wireguard.com/install/,我这里以iOS举例。

1、点击 创建隧道->手动创建wireguard-ios-home

2、填写基本信息,主要填写下面三项,其它默认:

  • 名称,这里随便填
  • 公私钥,这里点击 生成密钥对 随机生成即可。
  • 局域网IP地址,即客户端节点IP,这个地址要设置为符合 10.0.0.1/24

wireguard-ios-settings1

3、通过 添加节点 添加服务器信息:

  • 公钥,填写服务端的公钥。
  • 对端,服务端地址+端口,由于家里没有公网,这里走的frp,所以填的是公网vps代理地址。
  • 路由的IP地址(段),这里填写需要走wireguard网络的IP段,如:192.168.100.0/24,192.168.2.0/0,10.0.0.0/0。这样当开启wireguard vpn之后访问这些IP就会走vpn网络。

wireguard-ios-settings2

到了这一步,客户端已经完成配置了。但是服务端还没有,因为wireguard本质上是一个P2P通信的软件,我们还要将客户端公钥信息配置到服务端才行。

配置Peer

在openwrt配置wireguard peer信息。

wireguard-interface-edit

填写刚才配置的客户端信息,Save 保存即可: wireguard-peer-settings

现在在手机上开启 vpn,尝试访问一下路由器地址 192.168.100.1 是否可行。 wireguard-ios-vpn

FAQ

1、客户端如何访问openwrt的下一级路由的服务,如这里如何访问 192.168.2.x 服务:

因为路由器作为openwrt的下一级路由,openwrt是不知道如何到达 192.168.2.x 这个网段的。因此需要添加一条静态路由: wireguard-static-route

2、如何所有流量都走wireguard,并且可以通过之前设置的v2ray进行科学上网:

请参考:https://www.wireguard.com/netns/#routing-all-your-traffic

3、不用开启端口吗,很多教程上面需要开启路由器端口?

开启端口,一般是指我们路由器有公网IP,通过ddns方式对外暴露端口的时候需要开启。

相关地址

[1] https://github.com/WireGuard

[2] https://www.wireguardconfig.com/

本文链接:参与评论 »

--EOF--

专题「智能家居」的其它文章 »

Comments