路由升级:J3455 软路由

最近女朋友沉迷王者荣耀,经常抱怨家里的网络环境变得越来越差。说来也是,上次折腾路由器的时候,Koolshare 还在。已经过了那么久,也该升级一下家里的软路由了。

硬件

自从换上了 Synology920+ 之后,之前搭建 NAS 的 J3455 板子也开始吃灰了,虽然说这个板子的 U 有缺陷,但是跑了三年一点问题也没有,是时候让它继续「发光发热」,继续为这个家做贡献了。

扩展网口

因为主板上只有一个网口,所以买了一个M.2转千兆网卡的扩展卡,从主板的M.2接口转接出来,这样就变成了双网口,并且 8111E/F 也是免驱的,直接就可以用,不要太方便。

m.2网卡

机箱

之前的软路由是用的 NAS 淘汰下来的机箱,不支持 PCIE 的扩展卡,也不支持 COM 口。为了能让机箱尽可能小一些,还是选择了一个工控小机箱,没有风扇位也没有电源位,只能靠被动散热。

毕竟弱电箱的位置太挤了,只能委屈一下主板了。

电源

电源用了 DC 转 ATX 的电源板,80W 绰绰有余。

编译OperWrt

既然都已经开始折腾了,也尝试一下自己动手编译 OpenWrt 好了。

Github 上开源的 OpenWrt 衍生项目有很多,最出名的应该还是 lean 大神的 LEDE,然而国内的环境确实太差,即使全局🪜后,在 ubuntu 上编译了好几遍,中间总是莫名其妙的 Error,于是放弃了。

然后找到了 OpenWrt_x86-r2s-r4s-r5s-N1 这个项目,可以支持 Github Action 编译,简直 nice。

Start,Fork,一气呵成。

因为是只编译 x86 的固件,所以把其他的 device 全部删掉了,在 .config中修改一下自己需要的 luci-app:

CONFIG_TARGET_x86=y
CONFIG_TARGET_x86_64=y
CONFIG_TARGET_ROOTFS_TARGZ=y

# 主题:
CONFIG_PACKAGE_luci-theme-argon=y
CONFIG_PACKAGE_luci-theme-bootstrap=y
CONFIG_PACKAGE_luci-theme-material=y

# EFI支持:
CONFIG_TARGET_ROOTFS_EXT4FS=y 
CONFIG_GRUB_IMAGES=y
CONFIG_GRUB_EFI_IMAGES=y
CONFIG_VMDK_IMAGES=y

# 其他需要安装的软件包:
CONFIG_PACKAGE_luci-ssl=n # uhttpd服务
CONFIG_PACKAGE_luci-ssl-nginx=y # nginx
#CONFIG_PACKAGE_kmod-r8168=n
CONFIG_PACKAGE_luci-app-ddns=y # 域名解析
CONFIG_PACKAGE_luci-app-filebrowser=y # 文件浏览器
CONFIG_PACKAGE_luci-app-uugamebooster=y # UU加速器
CONFIG_PACKAGE_luci-app-adguardhome=y # AdguardHome
CONFIG_PACKAGE_luci-app-sqm=y # Qos流量控制
CONFIG_PACKAGE_luci-app-netdata=y # 性能检测
CONFIG_PACKAGE_luci-app-diskman=y # 磁盘管理
CONFIG_PACKAGE_luci-app-dockerman=y # Docker管理
CONFIG_PACKAGE_luci-app-ttyd=y # 网页命令行
CONFIG_PACKAGE_luci-app-accesscontrol=y # 访问控制
CONFIG_PACKAGE_luci-app-homebox=y # 内网测速
CONFIG_PACKAGE_luci-app-wolplus=y # 网络唤醒
CONFIG_PACKAGE_luci-app-ramfree=y # 释放内存
CONFIG_PACKAGE_luci-app-syncdial=y # 多拨
CONFIG_PACKAGE_luci-app-turboacc=y # 网络加速
CONFIG_PACKAGE_luci-app-smartdns=y # Smartdns

CONFIG_OPENSSL_PREFER_CHACHA_OVER_GCM=n

接下来就可以交给 Github 了!🎉

使用 Github Action 编译

利用Repo Dispatcher,可以直接从 Github Action 中编译,在 Action 中找到 Repo Dispatcher,点击 Run workflow,之后坐和放宽,也可以去睡一觉。

毕竟真的需要很长时间!😠

workflow编译

自定义构建

如果不想自己编译,大佬还提供了一个在线构建固件的工具:supes.top

或者,也可以下载编译好的固件:08.12_x86_64

安装 OpenWrt

文件系统

将打包好的镜像下载解压后得到这些文件:

 X86-64
 ├── 5.19.59\
 ├── packages\
 ├── config.buildinfo
 ├── feeds.buildinfo
 ├── openwrt-imagebuilder-x86-64.Linux-x86_64.tar.xz
 ├── openwrt-x86-64-generic-ext4-combined-efi.img.gz
 ├── openwrt-x86-64-generic-ext4-combined-efi.vmdk.zip
 ├── openwrt-x86-64-generic-ext4-combined.img.gz
 ├── openwrt-x86-64-generic-ext4-combined.vmdk.zip
 ├── openwrt-x86-64-generic-kernel.bin
 ├── openwrt-x86-64-generic-rootfs.tar.gz
 ├── openwrt-x86-64-generic-squashfs-combined-efi.img.gz
 ├── openwrt-x86-64-generic-squashfs-combined-efi.vmdk.zip
 ├── openwrt-x86-64-generic-squashfs-combined.img.gz
 ├── openwrt-x86-64-generic-squashfs-combined.vmdk.zip
 ├── openwrt-x86-64-generic.manifest
 ├── profiles.json.b
 ├── sha256sums
 ├── version.buildinfo
 ├── x86_64.config
 └── x86_64_kernel.config

这么多文件是因为官方提供了多种格式的 Image Files[1]

  • combined-ext4.img.gz:包含引导信息、rootfs(ext4 格式)、内核以及相关分区信息的硬盘镜像。
  • combined-squashfs.img.gz:包含引导信息、rootfs(squashfs 格式)、内核以及相关分区信息的硬盘镜像。
  • generic-rootfs.tar.gz:rootfs 包含的所有文件。
  • rootfs-ext4.img.gz:rootfs(ext4 格式) 分区镜像,可以 dd 到某个分区或者 mount -o 到某个目录。
  • rootfs-squashfs.img.gz:rootfs(squashfs 格式) 分区镜像,可以 dd 写入某个分区或者 mount -o 挂载到目录。
  • vmlinuz:内核

其中,带 EFI 后缀的即支持 UEFI 引导启动。

而 Ext4 和 Squashfs 格式的区别也很简单:

  • Ext4 格式的 rootfs 可以扩展磁盘空间大小,而 Squashfs 不能。
  • Squashfs 格式的 rootfs 可以使用重置功能(恢复出厂设置),而 Ext4 不能。

所以为了之后可以方便扩容,所以选择了 Ext4 文件系统。

利用 PE 将镜像写入到硬盘中

安装就很快了:利用 DiskGenius 把硬盘多余的分区删掉,使用 physdiskwrite 将镜像写入。

physdiskwrite.exe -u openwrt-x86-64-generic-ext4-combined.img.gz

其实也可以在 Mac 和 Linux 中利用 DD命令将镜像写入,因为要拆装硬盘就偷懒了。🤪

使用 GParted 扩容

编译后的镜像默认 overlay 分区为 2GB,强迫症表示太难受!为了使用 Docker 和把硬盘剩下的空间利用一下,需要对 overlay 分区扩容。

官方网页:GParted

⚠️ 需要注意的是,安装后需要立即扩容,因为一旦 OpenWrt 启动,overlay 分区也就确定了!

和 PE 一样,需要将 GParted 的镜像写入到 U 盘中,然后通过 U 盘启动就可以进入到 GParted 的 GUI 页面,选中后面的分区选择扩展分区,选择全部或者自定义新大小,点击确定大功告成!

分区表

插电,开机!设置完 PPPoE、DHCP、静态 IP 和端口转发之后熟悉的页面就回来了:

openwrt

配置 SmartDNS

虽然 OpenWrt 自带了 Dnsmasq,但是还是习惯使用 SmartDNS 来处理 DNS。

SmartDNS 是一个运行在本地的 DNS 服务器,它接受来自本地客户端的 DNS 查询请求,然后从多个上游 DNS 服务器获取 DNS 查询结果,并将访问速度最快的结果返回给客户端,以此提高网络访问速度。

Github:SmartDNS

启动也很简单:关闭 Dnsmasq,重定向 53 端口到 SmartDNS。

执行:

$ nslookup -querytype=ptr smartdns

查看命令结果中的 name 是否为 smartdns 或你的主机名,如果是则表示生效:

$ nslookup -querytype=ptr smartdns
Server:         192.168.1.1
Address:        192.168.1.1#53

Non-authoritative answer:
smartdns        name = smartdns.

新的导航页

这次换了路由,把内网的 IP 段也换掉了,除了要更改每个设备的 IP 后,原来的导航页也失效了,所以不如趁这次把 HomeStack 也重新做一下,于是发现了这个宝藏项目:

Github: zombieFox/nightTab

nightTab

永久数据

nightTab does not collect, store or send your data anywhere. All your data is saved locally to your browser.

nightTab不会在任何地方收集、存储或发送您的数据。您的所有数据都会在本地保存到您的浏览器中。

尽管为了安全作者并没有加入 Remote Data 的功能,但是作为只运行在内网的 Tab 页来说,不同的设备之前需要每次导入导出反而更加麻烦了。

所以在当前的项目加入了 Remote Server:

// src/component/data/index.js

data.sync_load = () => {
  const remote = state.get.current().sync.url;
  const token = state.get.current().sync.token;
  if (!remote) {
    console.log('remote config empty');
    return false;
  }

  const dataByRequest = request('GET', remote, {
    qs: { token }
  });

  if (dataByRequest && dataByRequest.getBody()) {
    console.log('use remote data');
    let dataBody = JSON.parse(dataByRequest.getBody() || []);
    let baseToData = JSON.parse(dataBody['data']);
    baseToData['state']['sync']['token'] = token;

    menu.close();
    data.import.render(JSON.stringify(baseToData));
  }
  return false;
};

data.sync_save = () => {
  const remote = state.get.current().sync.url;
  const token = state.get.current().sync.token;
  if (!remote) {
    console.log('remote config empty');
    return false;
  }

  let dataJson = {
    [APP_NAME]: true,
    version: version.number,
    state: Object.assign({}, state.get.current()),
    bookmark: bookmark.all
  };

  // delete sync token
  dataJson.state.sync.token = '';

  const dataSaveByRequest = request('POST', remote, {
    qs: { token },
    json: { data: dataJson }
  });

  dataJson.state.sync.token = token;
  let dataByResponse = JSON.parse(dataSaveByRequest.getBody() || []);

  if (dataByResponse['code'] !== 0) {
    console.log('sync remote fail');
    return false;
  }

  console.log('sync remote success');
  return true;
};

测试

家里的公网带宽是 300M 的,跑满时候的负载也不到 30%,真的要比之前的 D2550 性能高太多。👍

netdata

接下来应该会考虑把一些常用的服务搬到 Docker 中,毕竟只做路由多少有点浪费了 J3455 的性能。

这下女朋友应该可以安心的去打王者荣耀了吧。 (逃


  1. x86-64 设备安装配置 OpenWRT ↩︎

你可能无法访问 Disqus,已启用评论基础模式。如需完整体验请针对 disq.us | disquscdn.com | disqus.com 启用代理并 尝试完整 Disqus 模式 | 强制完整 Disqus 模式

这里空荡荡的,一个人都没有