恩山无线论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3290|回复: 37

我给Openwrt造盔甲--一种非入侵式的固件定制方法

  [复制链接]
发表于 2021-2-28 19:49 | 显示全部楼层 |阅读模式
本帖最后由 guyschaos 于 2021-3-1 00:04 编辑

论坛文章格式一言难尽,想看格式完整内容请移步 https://www.zhihu.com/column/c_1347256329229344768



先直接放上我编译的固件地址。暂时只编译了x86_64的版本。现在的版本很清水,只加了我用到的功能。
特性如下:
  • 完全开源
  • 基于Openwrt最新稳定版并随之同步更新
  • 优化Upnp
  • Fullcone NAT (基于LEAN)
  • 为特别设备设置特别的网关和DNS

下载地址:   https://github.com/ryohuang/slim-wrt/releases/tag/v19.07.7-21022801
项目地址: https://github.com/ryohuang/slim-wrt/
知乎专栏: https://www.zhihu.com/column/c_1347256329229344768
微信公众号与知乎专栏同名: 极客长斋

正文:

缘起
那一晚我不该看手机的。
不看手机就不会知道CDN矿工;不当CDN矿工就不会嫌弃家里的AC86U;不嫌弃AC86U就不会花巨资买个软路由;不买软路由就不会把软路由系统刷个遍;刷了一遍发现我就是想自己做(改)一个软路由系统——立刻马上。

现状
说到路由器系统,特别是软路由,现在热门的无外乎闭源的如爱快、高恪,开源的Openwrt和它的子孙们。至于ROS,pfsense之类在国内稍显冷门的并不在讨论范围之内。对于路由器系统没有什么高低贵贱之分,适合自己,满足自己的需求就好。如果一定要争论个高低的话,就好像争论Debian、CentOS、Manjaro、OpenSUSE、和Ubuntu哪个更好一样,毫无意义。
我的使用体验是,想给各个软路由系统发好人卡——你很好,但是我们不适合。
评判之前先说下我的网络环境,尽管是主观感受但也要有客观前提。
  • 上海电信千兆宽带+2路IPTV+固定电话
  • 电信光猫拨号并设置DMZ给家庭网关
  • 一台GEN8,更换E3 CPU,内存12G
  • 一台TS-551,内存10G
  • 一台AC 86U
  • 一台四网口工控机,N4200+4G内存
  • 若干智能设备,总计约30个设备接入
按照刷机顺序先说爱快。国内论坛经常听说的一个系统。对于普通家庭用户来说很多功能是多余的,一屏幕的菜单我需要用到的没几个。最近支持了kvm和docker。对于这两个功能,尤其是kvm,我颇有腹诽。一个路由器的系统竟然跑去作为kvm host?有这个硬件条件我肯定让爱快成为虚拟机中的guest!开头在Gen8上尝试虚拟机安装的时候,开头就让我郁闷了——X64版本强制要求4G内存才可以安装。再看看不完善的docker,而且因为闭源无法对它扩展和修改,当时就想换了它。翻翻网上的风评,之前竟然还干过坑用户的事情?还是回到开源世界吧,惹不起。
再来Openwrt。大名鼎鼎的Openwrt,国内很多路由器系统的爹,包括小米路由器的系统也是由它修改而来的。安装以后第一感受就是瘦。想要个Web UI都需要自己安装。官方原版如果直接让普通用户用,普通用户立刻自闭。而且,它不支持Fullcone NAT,upnp也支持不好。这两个功能对CDN挖矿是致命的,是我财富自由路上的拦路虎。换个符合国情的看看去!
很容易就找到了Lean's Openwrt,国内大名鼎鼎的Openwrt修改版,github上start数有15k,fork数13.1k。由于加入了很多中国特色的功能,国内社区流行程度很高。我自行编译了一个版本用了一段时间后发现了一些问题。Lean的代码感觉已经离Openwrt官方越来越远。Lean内核版本已经5.x,但是软件源还是18.x。而官方19.x的版本还在用4.x的内核版本。这就导致安装ipk的时候很容易发生依赖冲突。Lean那边看着也没有跟随官方版本升级的意思。眼看这今年Openwrt要出21.02了,我等不起啊。
最后我看了看老朋友Gargoyle的代码。稍显另类的一个Openwrt衍生版本。它基于Openwrt的系统但是没有采用luci作为界面。曾经因为它的QoS功能而闻名,也作为我之前的路由器固件运行了好久。今时今日,很多人认为Openwrt上最好的QoS是SQM而不是它了,但是至少他的代码组织方式和编译过程给了我很大的启发。
以上我只列举了我认为的缺陷和离开某个固件的理由,并没有任何指责和批评的意思。所有的开源项目都是在无私奉献,向作者们致敬。

理想
发完好人卡,我们来谈谈我理想的软路由系统。
Lean的系统很好,功能丰富,社区活跃。只是他的做法是直接在Openwrt上做修改,修改越来越多,也就离官方源越来越远。Openwrt现在已经在筹备Openwrt 21.02的发布,并且在未来luci将被luci2所替代。我很担心到时候Lean和Openwrt完全分道扬镳。之前Openwrt分支出去的LEDE,后来两者又合并的故事想必大家都有耳闻吧?
因为Lean对Openwrt的改动直接触及其筋骨,改出来的版本还很利害,这个过程像极了金刚狼的诞生。而我在想,能不能尽量保持Openwrt的原样,但是给他打造一幅盔甲。这套盔甲现在的Openwrt能够穿,稍微改动下将来的Openwrt(例如即将到来的21.02版本)也能穿。对,就像钢铁侠的盔甲一样。

盔甲
对着电脑一顿输出,盔甲造好了在这里:slim-wrt。Slim-wrt意为给小小的Openwrt穿上盔甲,盔甲型号暂且算它是Mark I。
  • 完全开源
  • 不对Openwrt进行入侵式修改
  • 基于Openwrt最新稳定版
  • 优化Upnp
  • Fullcone NAT
  • 可以为特别设备设置特别的网关和DNS
  • 明确的自定义项
  • github workflows
完全开源
这个不用多说,代码全在github上了。
不对Openwrt进行入侵式修改
我没有直接fork一份Openwrt的代码修改。我把要改动的地方都分别做了补丁保存在以feature命名的文件夹中了,要用到的应用也在仓库中保存。在编译的时候对Openwrt的补丁被打入,自定义的应用通过自定义feed的方式合入整个版本中。
基于Openwrt最新稳定版
现在的工作分支是按照19.07执行的,之后会新增21.02。我相信大多数补丁和应用还能沿用。写完这一篇之后会新建branch去尝试Openwrt的新版本。
优化Upnp
upnp功能一直被用户诟病,Lean也对它采取了一些特殊处理,据说是停留在旧版本没有升级。我发现的问题是,在DMZ后一些CDN挖矿软件认为Upnp功能没有开启。对此我写了个简单的程序,就是仓库中的slimapps/application/luci-app-boostupnp。这部分之后会撰文说明。
Fullcone NAT
Fullcone NAT默认不被Openwrt支持,而CDN挖矿需要它。相关的patch在Openwrt的论坛上早有讨论,但是人家不合啊!Fullcone NAT的补丁在这里,Lean也是利用了这一份patch。
可以为特别设备设置特别的网关和DNS
看着很拗口的一个功能,因为一些无法说出口的原因。假设我家里有两个网关和DNS(为什么要有两个网关?不许问)。A直通国内,B直通世界。家里几乎所有设备要连A,少数设备连接B。这个app就是解决这个问题的——如何制定某些设备连接B。这个功能在slimapps/application/luci-app-taghost。 说到这里插一句,很多博主都吹双软路由,主路由的默认网关设置为副路由地址,副路由的默认网关设置为主路由的地址,DHCP由主路由提供。这神奇的玩法有没有什么不对劲?这哪里是主副路由啊,这是两个路由器串联,其中一个路由器挂了就全完了!

现在流行的双软路由下的数据走向

现在流行的双软路由下的数据走向
明确的自定义项
对于自定义功能,我做了两方面的努力。
  • 将功能相关的patch放在各个以功能名称命名的目录下。Openwrt的功能可能会涉及各个模块。这里带一下,Openwrt的很多功能都是依赖第三方feeds的(这也是国内编译麻烦的地方,很多第三方下不到啊!)所以我人为地以git仓库为依据将openwrt分为了openwrt和feeds。每个功能命名的目录下可以包含openwrt目录,用于对openwrt部分打补丁,feeds/*对feeds打补丁,除此之外如果有特殊需求可以在目录下建立custom.sh做一些额外动作。这样做的好处是清晰,易定制。再也不用到commit里的海洋里去大海捞针了。
  • Openwrt的编译配置在.config里面,这个文件需要make menuconfig生成。对于默认配置和自定义功能,Lean的做法是修改target的makefile,而那个makefile里面又带了很多我用不到的东西(比如迅雷加速)。Gargoyle的做法是直接提供了.config文件,如果想自定义的话还是需要make menuconfig。我的做法是使用/profiles/slim/config这样的配置文件,再执行make defconfig完成.config的生成。这样的配置文件简单易读易配置,也容易传播。

所以,当你想自定路由器功能的时候,可以看看patch-modules下的目录然后再看看config文件,自定义的工作就完成了。
github workflows
是的,我另外写了workflows用于固件的编译和版本的发布。我再也不想在本地编译了,而是利用美国大公司的服务器编。当完成自定义功能后,提交上去,打个tag,boom,你要的固件好了。很快啊!

原理
所谓一图胜千言,我放两张图。

openwrt.drawio.png

上面是Openwrt原始的编译过程

slimbuild.drawio.png
上面是slim-wrt的编译过程,原理都在图里了。流程都在下面了,代码都在github上了。
  • 加入自定义的feed,指向本项目的slimapps目录。具体每个app做什么会在其目录下另写文档,在此不再赘述。
  • 对openwrt应用补丁。遍历patches-modules下所有目录中,如果包含openwrt则应用其中的patch文件。例如patches-modules/0001-fullcone-nat/openwrt
  • 对feeds进行补丁。遍历patches-modules下所有目录中,如果包含feeds则应用其中的patch文件。
  • 配置每个项目的profile,拷贝到openwrt根目录下之后执行defconfig就会生成相应配置。
  • 配置生成后再额外补充一些内容到.config文件。
  • make,等待之后固件就生出来了。

尾声
终于,Openwrt穿上盔甲后CDN挖矿的网络环境满足了。看着100M上传带宽换来的每天4块钱感觉离财富自由越来越近了。不,其实这个根本不重要了。事实上,电费加上设备的损耗,我很可能是亏的。
重要的是有个想法,找找方法,然后真的做到了,自high一番再接着找下一个目标。slim-wrt并不想取代任何的路由器固件,只是有这么一种玩法我给公开了出来。

致谢
查阅资料的时候参考了各位大佬的内容,在此一并感谢。排名不分先后,全看复制黏贴。









评分

参与人数 1恩山币 +2 收起 理由
hcyme + 2 图片选的好,高手少不了!

查看全部评分

我的恩山、我的无线 The best wifi forum is right here.
 楼主| 发表于 2021-2-28 19:50 | 显示全部楼层
格式竟然全乱了……想看格式完整内容请移步 https://www.zhihu.com/column/c_1347256329229344768
我的恩山、我的无线 The best wifi forum is right here.
发表于 2021-2-28 20:17 | 显示全部楼层
火钳留名,下载了x86安装到爱快虚拟机下,root@(none):/#  什么鬼?

点评

[attachimg]450141[/attachimg] 没用过iKuai的虚拟机呢。这是我在unraid上的截图。  详情 回复 发表于 2021-2-28 20:22
我的恩山、我的无线 The best wifi forum is right here.
发表于 2021-2-28 20:21 | 显示全部楼层
围观一下...
我的恩山、我的无线 The best wifi forum is right here.
 楼主| 发表于 2021-2-28 20:22 | 显示全部楼层
bzlzm 发表于 2021-2-28 20:17
火钳留名,下载了x86安装到爱快虚拟机下,root@(none):/#  什么鬼?

unraid下

unraid下


没用过iKuai的虚拟机呢。这是我在unraid上的截图。
我的恩山、我的无线 The best wifi forum is right here.
发表于 2021-2-28 20:27 | 显示全部楼层
学习一下,谢谢分享
我的恩山、我的无线 The best wifi forum is right here.
发表于 2021-2-28 20:29 | 显示全部楼层
我总觉得,固件是做给人用的,不是做给神用的,越简洁易用越好。而偏偏linux界的都是大神,他们不伺候人,楼主好好努力,走在我们人类当中。
我的恩山、我的无线 The best wifi forum is right here.
发表于 2021-2-28 20:33 | 显示全部楼层
支持楼主!!!
我的恩山、我的无线 The best wifi forum is right here.
发表于 2021-2-28 20:35 | 显示全部楼层
1.png
爱快虚拟机里,用的slim-openwrt-19.07.7-mark-i-x86-64-combined-squashfs.img
/etc/config/network  无此文件,也无法创建,应该是磁盘权限问题

点评

一般x86都用ext4吧。 参考文档: https://openwrt.org/docs/techref/image.format [attachimg]450145[/attachimg]  详情 回复 发表于 2021-2-28 20:40
我的恩山、我的无线 The best wifi forum is right here.
 楼主| 发表于 2021-2-28 20:40 | 显示全部楼层
bzlzm 发表于 2021-2-28 20:35
爱快虚拟机里,用的slim-openwrt-19.07.7-mark-i-x86-64-combined-squashfs.img
/etc/confi ...

一般x86都用ext4吧。

参考文档: https://openwrt.org/docs/techref/image.format

截屏2021-02-28 下午8.38.10.png
我的恩山、我的无线 The best wifi forum is right here.
发表于 2021-2-28 20:49 | 显示全部楼层
你这个鬼怪了哈,我自编译的也是用的combined-squashfs.img,下这论坛里大神的也是用的这个格式,到你这要用ext4的,不过成功了,这个格式没有重置了吧

点评

我这个是在官方的基础上稍微做了点修改。别人的代码的源头是不是都lean那边来的? 确实没有重置。 [attachimg]450153[/attachimg]  详情 回复 发表于 2021-2-28 21:08
我的恩山、我的无线 The best wifi forum is right here.
发表于 2021-2-28 21:02 | 显示全部楼层
前排支持。谢谢分享。
我的恩山、我的无线 The best wifi forum is right here.
 楼主| 发表于 2021-2-28 21:08 | 显示全部楼层
bzlzm 发表于 2021-2-28 20:49
你这个鬼怪了哈,我自编译的也是用的combined-squashfs.img,下这论坛里大神的也是用的这个格式,到你这要 ...

我这个是在官方的基础上稍微做了点修改。别人的代码的源头是不是都lean那边来的?
确实没有重置。
上传备份存档以恢复配置。要将固件恢复到初始状态,请单击“执行重置”(仅 squashfs 格式的固件有效)。
截屏2021-02-28 下午9.08.25.png
我的恩山、我的无线 The best wifi forum is right here.
发表于 2021-2-28 21:17 | 显示全部楼层
支持一下楼主
我的恩山、我的无线 The best wifi forum is right here.
发表于 2021-2-28 21:50 来自手机 | 显示全部楼层
感谢分享,支持ext4,看了一遍config,太纯净水了,科学相关的几个底层kmod加进去就好了,上层的方便可以使用,不然安装非常麻烦事儿

点评

为了方便传播,很多你懂的东西都没加。  详情 回复 发表于 2021-2-28 21:55
我的恩山、我的无线 The best wifi forum is right here.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

欢迎大家光临恩山无线论坛上一条 /1 下一条

有疑问请添加管理员QQ86788181|手机版|小黑屋|Archiver|恩山无线论坛(常州市恩山计算机开发有限公司版权所有) ( 苏ICP备05084872号 )|网站地图

GMT+8, 2023-1-28 19:01

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

| 江苏省互联网有害信息举报中心 举报信箱:js12377@jschina.com.cn 举报电话:025-88802724 | 本站不良内容举报信箱:68610888@qq.com 举报电话:0519-86695797
快速回复 返回顶部 返回列表