家庭组网折腾记

image

写在最前面: 网上大部分的教程可能是过时的,headscale 内置了 DERP 服务,只需要开启即可,并且很多恩山的教程写的比较 freestyle。

软路由

联调的宽带,公网的 Ipv4Ipv6 (PD /60),对于 Ipv6 的管控就是一个刚需,原生的小米路由器 AX6,没有办法管控 Ipv6 导致机器都裸奔在互联网上,因此对于家中的网络需要一个入口侧的灵活的管控能力,因此显然购置一个可以刷入 Openwrt 的比较合理。

对比一下可以选择 x86ARM,因为主路由本身的工作比较简单,只是 拨号 + 管控,因此还是基于有 NPUARM 设备,无论是功耗还是效能都会好很多。

因为只有 1000Mbps 的需求,因此也不想投入太多成本,参考 2024年中 0-300元的一些便宜的有点可玩性的路由器选择杂谈 最终选择了 AX5 JDC 型号。(实际上同时还购入了 AX6, 不过因为需要并不强烈,两者差异不大)

截止本文日(2024-12-20): AX5 JDC 的价格大致只需要 55 左右,AX 6 也只需要 85 - 90 之间。

刷机

解锁 SSH

第一步肯定是解锁 SSH 权限,对于这些早期版本的设备,其实不降级也可以,github 有个项目 xmir-patcher 测试 AX6 的最新版本也可以解锁 SSH,因此不一定非要参考 恩山 上比较早期的文档 AX5 JDC刷OpenWRT及Uboot

使用脚本就比较简单

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ ./run.sh

==========================================================

Xiaomi MiR Patcher


1 - Set IP-address (current value: 192.168.1.1)
2 - Connect to device (install exploit)
3 - Read full device info
4 - Create full backup
5 - Install EN/RU languages
6 - Install Breed bootloader
7 - Install firmware (from directory "firmware")
8 - {{{ Other functions }}}
9 - [[ Reboot device ]]
0 - Exit

Select:

第一步选择 1,然后输入对应的路由器 IP 即可(默认是 192.168.31.1)
第二步选择 2,等待片刻即可。

然后尝试登录下如果成功就好,不行就用以前的版本,先降级固件。

1
$ ssh root@192.168.31.1

刷入临时系统

对于小米的路由器来说,默认的情况是双ROM,也就是一般来说,其中一个损坏了,不会影响另外一个使用。但是这样导致空间也只有一半能够使用,因此论坛上有大量的固件标明是 大分区 这种固件,在默认的 Rom 大小空间是无法安装的,因为空间不足,需要把默认的 ROM 做合并。

在刷入临时系统之前,我们先了解下,系统是怎么启动的。

在系统中执行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop0 7:0 0 68.3M 0 loop /overlay
mmcblk0 179:0 0 57.1G 0 disk
├─mmcblk0p1 179:1 0 768K 0 part
├─mmcblk0p2 179:2 0 256K 0 part
├─mmcblk0p3 179:3 0 256K 0 part
├─mmcblk0p4 179:4 0 1.8M 0 part
├─mmcblk0p5 179:5 0 1.8M 0 part
├─mmcblk0p6 179:6 0 256K 0 part
├─mmcblk0p7 179:7 0 256K 0 part
├─mmcblk0p8 179:8 0 256K 0 part
├─mmcblk0p9 179:9 0 256K 0 part
├─mmcblk0p10 179:10 0 256K 0 part
├─mmcblk0p11 179:11 0 256K 0 part
├─mmcblk0p12 179:12 0 256K 0 part
├─mmcblk0p13 179:13 0 640K 0 part
├─mmcblk0p14 179:14 0 640K 0 part
├─mmcblk0p15 179:15 0 256K 0 part
├─mmcblk0p16 179:16 0 6M 0 part
├─mmcblk0p17 179:17 0 113M 0 part /rom
├─mmcblk0p18 179:18 0 512K 0 part
├─mmcblk0p19 179:19 0 256K 0 part
├─mmcblk0p20 179:20 0 256K 0 part
├─mmcblk0p21 179:21 0 256K 0 part
├─mmcblk0p22 179:22 0 128M 0 part /mnt/mmcblk0p22
├─mmcblk0p23 179:23 0 4M 0 part
├─mmcblk0p24 179:24 0 127.1M 0 part
└─mmcblk0p25 179:25 0 56.7G 0 part /mnt/mmcblk0p25
mmcblk0boot0 179:32 0 4M 1 disk
mmcblk0boot1 179:64 0 4M 1 disk

我们会发现有大量的分区,可以简单的任务,系统是按照分区启动的,
CPU 通电之后,先从 /dev/mmcblk0 最开始的部分 读取分区表,然后跳转到 /dev/mmcblk0p13Uboot 进行启动,uboot 会继续读取后面的固件。

因为我们想要刷入 不死Uboot 因此, Uboot 只会从双 Rom 的中的其中一个进入系统,因此需要将 Uboot 读取那个区域先刷入一个临时的系统。

一般来说,第一次默认进去的是 root_1,也就是第二个分区,可以通过下面的命令来判断

1
nvram get flag_last_success

返回数字 1 就是第二分区,若返回 0,就得按之前刷入op的方法向13分区刷入op然后设置下次启动13分区然后继续(别直接改下次启动13,怕13分区没系统或者op不合适直接转)(当然这时没改分区表,砖了用小米官方救砖)

用图来理解的话,就是这样的

image

因为我们会将 Rom 分区合并,因此就不存在后面的那个分区了,因此一开始刷入一个临时系统,可以保证后面的安全(实际上感觉没什么区分)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 配置升级成功标志
nvram set flag_last_success=0

# 下一次重启从 双分区的 0 启动
nvram set flag_boot_rootfs=0

# 一些启动标志
nvram set boot_wait=on
nvram set uart_en=1
nvram set telnet_en=1
nvram set ssh_en=1
nvram set bootdelay=2
nvram commit

# 刷入系统到分区 1
dd if=/tmp/kernel.bin of=/dev/mmcblk0p17

# 刷入rootfs
dd if=/tmp/rootfs.bin of=/dev/mmcblk0p20

# 配置升级成功标志
nvram set flag_last_success=1

# 下一次重启从 双分区的 1 启动
nvram set flag_boot_rootfs=1
nvram commit

做完这些,重启之后就进入了 Openwrt ,这个时候还是双分区的结构

刷入 Uboot & 大分区

1
2
3
4
5
6
7
8
9
10
11
# 将 uboot 刷入 13 分区
dd if=uboot.bin of=/dev/mmcblk0p13

# 将 大分区表 输入
dd if=mibib.bin of=/dev/mmcblk0 bs=512 count=34



fw_setenv fsbootargs
fw_setenv bootargs
fw_setenv bootcmd bootipq

做完这些直接断电即可,这个时候已经成功的刷入 uboot

刷入系统

拔掉电源让机器断电,然后按住 reset 键插入电源通电,灯光闪5下(大概是5s,之后蓝灯常亮)后松开 reset 按键。

之后输入系统即可,我这里用的是 IPQ60XX-WIFI-NO 的固件,因为作为主路由,并不需要进行启动 WIFI 还可以节约一些内存。

组网

当我的 Openwrt 继续之后,配置好拨号,需要的就是进行配置了,先看看家庭的网络架构

image

因为本身有一个路由器 (AX6) 已经配置了大量的静态地址,都在不同的地方已经用上了,因此这里就不折腾这个路由器,仅仅修改这个路由器从 拨号DHCP 其他的都需要想办法在入口的 AX5 兼容。

就有几个需求

  1. 作为二级路由的 AX6 能够分配到公网 Ipv6
  2. 从 AX5 可以访问倒 AX6

这里就需要进行一些配置

Ipv6 PD 配置

  1. 接口 » lan高级配置 配置 IPv6 分配长度 修改为从 WAN 获取的地址(默认的是 64,下级路由本身可以获取 v6,但是无法继续往下分配)
  2. 接口 » lanDHCP服务器Ipv6 设置 配置 PD 最小长度 修改为从 WAN 获取的地址(这里不修改,下游路由器也无法获取)

静态路由配置

插上下级路由器(AX6) 等连接上之后,查看到分配的 IP,将其设置为静态的。然后修改 路由 页面,增加一条

接口 目标 网关
lan 目标网段 刚设置的静态 IP

即可

额外的补充

因为整体上的安全都是通过 AX5 来负责的,这样的情况下,AX6 本身还是有一些安全规则, 导致此时还是无法访问,所以这里需要额外的关闭 AX6 的防火墙,参考 关闭小米路由器防火墙 WAN 放行端口

Ipv6 防火墙

网络 -> 防火墙 -> 通讯规则 里面加上 ipv6 开放的端口即可。因为 ipv6 本身是要对外暴露访问能力的,因此这里只是开放部分端口

虚拟组网

配置完上面的内容就来到最后一个部分,怎么把外部设备和内部设备组成一个虚拟机的网络了。

作者注:因为实际上有 ipv6 和 ipv4 地址,不是特别刚需,这部分单纯是爱好

虚拟组网有有两个软件看起来用的人比较多

  • Zerotier
  • Tailscale

这两个都可以自建中心控制节点,也就是完全自建,因为 Tailscale 默认情况是 100.64.x.x 的网段,和很多云厂商冲突, Zeortier 的默认节点大部分又被封了,整体上还是推荐自建。最终选择了 Zerotier

参考 docker-zerotier-planet 项目非常简单的就可以完成了。

参考