极客长斋 篇一:我给Openwrt造盔甲

2021-02-25 20:24:47 39点赞 125收藏 22评论

缘起

那一晚我不该看手机的。

不看手机就不会知道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由主路由提供。这神奇的玩法有没有什么不对劲?这哪里是主副路由啊,这是两个路由器串联,其中一个路由器挂了就全完了!

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

明确的自定义项

对于自定义功能,我做了两方面的努力。

  1. 将功能相关的patch放在各个以功能名称命名的目录下。Openwrt的功能可能会涉及各个模块。这里带一下,Openwrt的很多功能都是依赖第三方feeds的(这也是国内编译麻烦的地方,很多第三方下不到啊!)所以我人为地以git仓库为依据将openwrt分为了openwrt和feeds。每个功能命名的目录下可以包含openwrt目录,用于对openwrt部分打补丁,feeds/*对feeds打补丁,除此之外如果有特殊需求可以在目录下建立custom.sh做一些额外动作。这样做的好处是清晰,易定制。再也不用到commit里的海洋里去大海捞针了。

  2. 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 build processopenwrt build process

上面是Openwrt原始的编译过程

slim-wrt build processslim-wrt build process

上面是slim-wrt的编译过程,原理都在图里了。流程都在下面了,代码都在github上了。

  1. 加入自定义的feed,指向本项目的slimapps目录。具体每个app做什么会在其目录下另写文档,在此不再赘述。

  2. 对openwrt应用补丁。遍历patches-modules下所有目录中,如果包含openwrt则应用其中的patch文件。例如patches-modules/0001-fullcone-nat/openwrt

  3. 对feeds进行补丁。遍历patches-modules下所有目录中,如果包含feeds则应用其中的patch文件。

  4. 配置每个项目的profile,拷贝到openwrt根目录下之后执行defconfig就会生成相应配置。

  5. 配置生成后再额外补充一些内容到.config文件。

  6. make,等待之后固件就生出来了。

尾声

终于,Openwrt穿上盔甲后CDN挖矿的网络环境满足了。看着100M上传带宽换来的每天4块钱感觉离财富自由越来越近了。不,其实这个根本不重要了。事实上,电费加上设备的损耗,我很可能是亏的。

重要的是有个想法,找找方法,然后真的做到了,自high一番再接着找下一个目标。slim-wrt并不想取代任何的路由器固件,只是有这么一种玩法我给公开了出来。

致谢

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

展开 收起

微软 Microsoft 365 家庭版 15个月加长版电子秘钥 1年订阅 多至6人 正版Office 1T云存储 限PC/手机组合购买

微软 Microsoft 365 家庭版 15个月加长版电子秘钥 1年订阅 多至6人 正版Office 1T云存储 限PC/手机组合购买

628元起

国行机专用 任天堂Switch健身环大冒险游戏卡中文兑换码国行游戏机ns体感套装运动环健身圈舞力全开实体卡带 标准版

国行机专用 任天堂Switch健身环大冒险游戏卡中文兑换码国行游戏机ns体感套装运动环健身圈舞力全开实体卡带 标准版

469元起

WPS 超级会员 年卡

WPS 超级会员 年卡

229元起

任天堂Switch游戏 NS塞尔达传说 荒野之息 旷野之息 中文现货

任天堂Switch游戏 NS塞尔达传说 荒野之息 旷野之息 中文现货

310元起

任天堂 Switch游戏卡带 NS超级马里奥派对 玛丽欧聚会 中文 现货

任天堂 Switch游戏卡带 NS超级马里奥派对 玛丽欧聚会 中文 现货

294元起

Nintendo 任天堂 海外版系列 NS游戏卡带《超级马里奥3D世界 狂怒世界》

Nintendo 任天堂 海外版系列 NS游戏卡带《超级马里奥3D世界 狂怒世界》

385元起

任天堂Switch游戏 NS出租 分手装修 Tools Up 胡闹 中文下载版租赁 会员免费畅玩

任天堂Switch游戏 NS出租 分手装修 Tools Up 胡闹 中文下载版租赁 会员免费畅玩

1元起

现货全新正版 switch体感游戏 舞力全开2020 ns实体中文游戏卡 Just Dance 2020 支持双人

现货全新正版 switch体感游戏 舞力全开2020 ns实体中文游戏卡 Just Dance 2020 支持双人

217元起

8BITDO 八位堂 Zero2 无线游戏手柄 柠檬黄

8BITDO 八位堂 Zero2 无线游戏手柄 柠檬黄

99元起

Office 365 家庭版

Office 365 家庭版

248元起

微软 (Microsoft) 精巧鼠标 冰川灰 | 无线鼠标 蓝牙5.0 小巧轻盈 多彩配色 适配Win10、Mac OS和Android

微软 (Microsoft) 精巧鼠标 冰川灰 | 无线鼠标 蓝牙5.0 小巧轻盈 多彩配色 适配Win10、Mac OS和Android

99元起

《国家地理 每日精选》iOS数字版软件

《国家地理 每日精选》iOS数字版软件

1元起

《Picsew》iOS数字版软件

《Picsew》iOS数字版软件

1元起

《kirakira+》 iOS软件

《kirakira+》 iOS软件

暂无报价

《扫描全能王付费版》iOS数字版软件

《扫描全能王付费版》iOS数字版软件

1元起

《拍照取字 专业版》iOS数字版软件

《拍照取字 专业版》iOS数字版软件

1元起
22评论

发表评论请 登录
  • 最新
  • 最热
评论举报

请选择举报理由

相关好价推荐
查看更多好价

相关文章推荐

更多精彩文章
更多精彩文章
最新文章 热门文章
125
扫一下,分享更方便,购买更轻松