如何玩转智能家居 - 组建局域网,访问家庭网络

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

更新说明

  • 2023.02.24:R2S不再作为主路由,采用旁路由接入

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

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

这些场景的基本需求是:安全性一定要有保障,能够在外网连接到家庭网络(不是简单的内网穿透,而是组成大局域网)。

答案不言而喻,组建vpn。那么问题来了,用什么vpn,如何连接到家庭网络:

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

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

那为什么选择wireguard:

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

网络架构: homenet-design

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

光猫:192.168.1.1
AC(主路由):192.168.2.1
R2S(旁路由):192.168.2.100

这里的R2S我们作为旁路由来使用,什么是旁路由请自行搜索资料。简而言之,家庭内大多数网络均走AC主路由,部分走旁路由(翻墙),旁路由的(折腾)挂掉不会导致整个家里网络中断。

由于博主家庭网络没有公网IP,动态IP也没有,因此这里找了一台云服务器作为中转(非UDP打洞,中转方式会消耗云服务器流量,请悉知)。当然也可以用基于wireguard现成的方案,如tailscale,免费应该够用(有设备限制)。

提前准备

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

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

FRP

因为博主家里没有公网IP,那么只能通过这种内网穿透的方式实现,将wireguard的udp端口通过代理的方式暴露到外网,如果有公网IP跳至下一步。

1、在vps上安装frps服务端,请到 frp/releases 下载对应架构的最新版本即可,解压到服务器。

服务端配置:

[common]
bind_port = 7000

token = 768f72bc664ad2ad7c9edccf65523fd7

其中 token 是用来鉴权客户端的,请重新生成。bind_port 指定 frps 监听的端口,云服务器需要放开该端口的访问。

2、在openwrt安装frpc客户端,请到 System->Software 搜索 frpc 安装。 software-frpc

完成后进行配置:假设这里我们选择端口 51820/udp 作为wireguard的通信端口,IP 10.0.0.1作为wireguard的网关IP。 frpc-service

我这边的 /etc/config/frpc 配置如下,你可对应着在网页上进行修改:

config init
  option stdout '1'
  option stderr '1'
  option respawn '1'
  option user 'root'
  option group 'root'

config conf 'common'
  option server_port '7000'
  option tls_enable 'false'
  option server_addr '<server_ip>'
  option token '768f72bc664ad2ad7c9edccf65523fd7'

config conf 'ssh'
  option name 'wireguard'
  option type 'udp'
  option use_encryption 'false'
  option use_compression 'false'
  option local_ip '10.0.0.1'
  option local_port '51820'
  option remote_port '51820'

记得将 server_ip 替换成frps的地址,如果不出意外的,openwrt中的frpc已经跑起来了。

WireGuard

WireGuard是点对点的网络,每个节点既可以做服务器,又可以做客户端。我们这里将部署在openwrt中的wireguard节点称为服务端,在手机或电脑端部署的wireguard节点称为客户端。更多安装方式:https://www.wireguard.com/install/

整体步骤如下:

  1. LAN口设置(旁路由)
  2. 安装wireguard

LAN口设置

1、编辑LAN口,设置上游网关信息: interfaces-lan

lan-settings

2、配置DNS: lan-dns-settings

3、关闭SYN-flood保护,开启动态IP伪装 wireguard-firewall

安装wireguard

1、在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节点的私钥,可通过 Generate Key Pair 生成,也可手动生成:

    # 通过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--

提醒:本文最后更新于 426 天前,文中所描述的信息可能已发生改变,请谨慎使用。

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

Comments