路由器固件编译及个性化

一、前言

  • 自编译可以得到较为安全、精简、个性化的固件,内核版本也将同步最新。
  • 自编译固件需要的要求较多,但编译多次就轻车熟路了。如果想深入了解嵌入式设备开发,可以尝试一下
  • 接下来,如果您对路由器、Linux、ipv6等感兴趣,可以看一下我探索过的东西,本人菜鸡,大佬移步

二、编译过程

前提

1、Ubuntu 64bit,装在VMware就好,最好配给25G以上的空间,4G以上运行内存,一半以上的处理器核心。编译会产生大量的中间文件。充足的资源可以节省大量的时间,我第一次编译花了半天时间。

2、除了性能,另一个主要影响因素就是网络了。网上绝大多数教程会让你挂梯子,但由于我处于校园网环境下,属于教育网(个人认为这个连接高校的CERNET2较其他的开放多,其开放性主要体现在ipv6上,YouTube,Google等可以通过ipv6访问,也有可能是现在处于一个ipv6过度时期,相关审查未完善之类等,不过移动的数据网支持ipv6,但不能访问YouTube之类等,这就很迷了),编译时部分依赖是通过ipv6下载的

3、其他的一些编译报错,主要还得看你Linux操作和英文阅读能力了

成果

先看一下最终产品体验吧。(我路由器是newifiD2 ,某鱼上85RMB淘的,体验半年,没翻车)

路由器固件编译及个性化_第1张图片

[]( ̄▽ ̄),流量都是”进口“的,虽然国内在今年大力推进ipv6,但是当你只允许ipv6的时候会发现,QQ上不了,baidu.com 用不了,得ipv6.baidu.com这个才行,国内的视频网站爱奇艺、bilibili。。。都上不了。国外的YouTube、google很久以前就支持ipv6访问了。我并不是崇洋媚外,只是国内在ipv6这方面没有太大的需求,加上NAT延缓了ipv4地址的枯竭。不过随着万物互联的时代的到来,ipv6也被国家大力推进,三大运营商已经给用户分配了ipv6地址,接下来就是那些提供网络服务者加快对ipv6的适配了,尤其是那些提供云计算服务的。我的一个室友购买的某云主机是没有ipv6地址的,他提供的程序也是不太可能支持ipv6的。*

路由器固件编译及个性化_第2张图片

过程

1、Ubuntu安装就不详说了

2、初次编译先下载编译的源码,我第一次使用的是https://github.com/openwrt/openwrt 的官方源码,但是编译的几个固件刷进去都是无限重启,可能是我操作上的错误?又或者是一些核心模块没勾选?(能编译出来应该不是)总之是很大的BUG

3、之后我是选择的是https://github.com/coolsnowwolf/lede 的源码

路由器固件编译及个性化_第3张图片

sudo apt-get update	

git clone https://github.com/coolsnowwolf/lede

./scripts/feeds update -a
./scripts/feeds install -a

make menuconfig		\\这个是打开配置界面,如果命令窗口较小,无法显示下图的界面

newififD2处理器是联发科MT7621,属于MIPS架构—>是一种采取精简指令集(RISC)的处理器架构
如下图,前三项选好之后,之后就是选择用户界面LuCi,默认内置bootstrap,当选择其他的theme将默认将其启动。

路由器固件编译及个性化_第4张图片

第一次编译先不要考虑多余的app、驱动模块等,当你确定好型号之后,程序已经把必要的勾选了。默认保存的名称是 .config,如果你重新命名保存一定要注意将你命名的覆盖默认的(xxxx >> .config),如若不然则会编译之前.config里的固件。建议你以默认名称保存较好

4、make -j1 V=s 将依照.config 里的信息编译,其他的照着lede仓库里的Readme来一般不会有什么问题,反正我是不需要挂梯子的( ̄▽ ̄)"

路由器固件编译及个性化_第5张图片

5、编译完成,会得到如下的路径的二进制bin文件,使用sysupgrade的就好,另外一个initramfs是不会保存任何的个人配置的,一重启就丢失。(根据名字大体也能知道其特性)

路由器固件编译及个性化_第6张图片

6、编译可能出现的错误

①空间不足,20G就这样没了(;´д`)ゞ

路由器固件编译及个性化_第7张图片

②软件冲突。如下图我选择了samba3,然后又选了samba4,就会编译报错,还有其他一些互斥的软件也会出现报错,根据提示来解决就好

路由器固件编译及个性化_第8张图片

7、编译选择模块及app问题

make menuconfig里全是英文,所以多看几下就熟悉了

由于我的路由器是有USB3.0,而且我是要挂一个300G 格式为ext4的硬盘,根据这些有针对性的选择对应驱动就行,在USB support和Filesystems里勾选对应模块的就好,当你需要挂载其他格式的硬盘时,用opkg命令安装就行,只不过没有编译到内核的话,格式化可能会没有(没试过)。

通过自编译,我发现路由器有一个usb是多么幸福的事,usb是可以插各种东西的,比如摄像头、usb上网。。总之有什么驱动,就可以往上装什么。

还有好多的一些没有必要的东西,比如路由器不可能在ppp下工作,也就没有必要装什么pppoe的模块了。其实装不装问题不大,这些模块体积较小,相对于aria2等程序来说。

三、个性化要求

背景:由于我是在学校使用的路由器,使用drcom认证,双栈协议,openWrt对ipv6支持较好,我之前使用Padavan固件较差。

Padavan有两种方案解决为下边设备提供ipv6通信。

①使用NAPT66(需注意wan接口的名称,通过ifconfig查看)

缺点:nat严重破坏了ipv6的特性。比如想通过ipv6控制改路由器下的电脑是很困难的,具体原理请详细阅读NAPT技术白皮书。不过是由此构造的内网是相对安全的

###启动NAPT66模块
insmod /lib/modules/$(uname -r)/kernel/net/napt66/napt66.ko wan_if=eth2.2
###NAPT66 所需要的防火墙政策
ip6tables -F
ip6tables -P INPUT ACCEPT
ip6tables -P FORWARD ACCEPT
ip6tables -P OUTPUT ACCEPT

②通过桥接转发

缺点:极其不稳定

modprobe ip6table_mangle
ebtables -t broute -A BROUTING -p ! ipv6 -j DROP -i eth2.2
brctl addif br0 eth2.2

openWrt的网络配置及个性化

①ipv6配置(主要是对dhcp和network的文件修改)ipv6的防火墙规则一般没有问题,但会有第三方大佬编译前修改默认防火墙规则,你可以找官方的替换就好,另外一个可能ipv6的是硬件加速问题,建议不要打勾HWNAT加速

一般来说用户分配得到的ipv6前缀是64位,剩下的64位一般是EUI64,也就是我们的硬件地址mac。至少我路由器上的ipv6是这样的特征,但下边的设备就没有遵循这样的规律。如果想深入了解ipv6地址分配,请查阅相关资料。

不过有一点,同一个网络的ipv6前缀是必须统一的。也可以不是,比如使用了napt66,内网可以使用自定义的ipv6前缀,虽然能访问外网ipv6,但外网想主动与其建立通信时,比如ssh、远程控制等,就需要建立映射关系。

通过网线直连电脑,记录相关信息

ipconfig all	//记录ipv6地址,地址后面一般会有/64的后缀

tracert google.com	//记录第一个ipv6地址,那个就是你上层的ipv6网关,它一般也会提供ipv6的dns解析服务

一般来说,建议不要使用dhcp来为自己路由器分配ipv4地址,如果你想快速的连接网络,那就应该使用静态的地址,
这是一个主动的过程,如果上层网关处于一个高负荷状态或者其他网络拥塞,被动分配得话,
你会迟迟得不到ipv4地址的。所以得记录网关、子网掩码、dns等重要信息

记录完毕之后就可以配置路由器了

dhcp文件修改如下

config dnsmasq
	option domainneeded '1'
	option boguspriv '1'
	option filterwin2k '0'
	option localise_queries '1'
	option rebind_protection '1'
	option rebind_localhost '1'
	option local '/lan/'
	option domain 'lan'
	option expandhosts '1'
	option nonegcache '0'
	option authoritative '1'
	option readethers '1'
	option leasefile '/tmp/dhcp.leases'
	option resolvfile '/tmp/resolv.conf.auto'
	option nonwildcard '1'
	option localservice '1'

config dhcp 'lan'
	option interface 'lan'
	option start '100'
	option limit '150'
	option leasetime '12h'
	option dhcpv6 'server'
	option ra 'server'
	option ndp 'relay'
	option ra_management '0'
	option ra_default '1'
	list dns '2001:xxxx:xxxx:b096::1'

config dhcp 'wan'
	option interface 'wan'
	option ignore '1'
	option ra 'server'
	option dhcpv6 'server'
	option ra_management '0'
	list dns '2001:xxxx:xxxx:b096::1'
	option ndp 'relay'

config odhcpd 'odhcpd'
	option maindhcp '0'
	option leasefile '/tmp/hosts/odhcpd'
	option leasetrigger '/usr/sbin/odhcpd-update'
	option loglevel '4'

config srvhost
	option srv '_vlmcs._tcp'
	option target 'LANG'
	option port '1688'
	option class '0'
	option weight '100'

network修改如下


config interface 'loopback'
	option ifname 'lo'
	option proto 'static'
	option ipaddr '127.0.0.1'
	option netmask '255.0.0.0'

config globals 'globals'
	option ula_prefix '2001:xxxx:xxxx:b201::/64'

config interface 'lan'
	option type 'bridge'
	option ifname 'eth0.1'
	option proto 'static'
	option ipaddr '192.168.1.1'
	option netmask '255.255.255.0'
	option ip6assign '64'
	option ip6hint '2001:xxxx:xxxx:b201::/64'

config device 'lan_dev'
	option name 'eth0.1'
	option macaddr '20:xx:xx:xx:xx:df'

config interface 'wan'
	option ifname 'eth0.2'
	option proto 'static'
	option ipaddr '10.16.44.50'
	option netmask '255.255.255.240'
	option gateway '10.16.44.49'
	option ip6assign '64'
	option dns '211.x.x.3 114.114.114.114'
	option ip6hint '2001:xxxx:xxxx:b201::/64'
	option ip6ifaceid 'eui64'

config device 'wan_dev'
	option name 'eth0.2'
	option macaddr '20:xx:xx:xx:xx:df'

config interface 'wan6'
	option ifname 'eth0.2'
	option proto 'dhcpv6'

config switch
	option name 'switch0'
	option reset '1'
	option enable_vlan '1'

config switch_vlan
	option device 'switch0'
	option vlan '1'
	option vid '1'
	option ports '0 1 2 6t'

config switch_vlan
	option device 'switch0'
	option vlan '2'
	option ports '4 6t'
	option vid '2'

②drcom自启动(添加其他的一些程序自启动类似)

#!/bin/sh /etc/rc.common
START=90
boot() {
	sleep 5s
	start
}

start() {
	/etc/xxx/drcom -m dhcp -c /etc/xxx/drcom.conf &
	echo "Drcom is running"
	return 0
}

stop() {
    killall drcom >/dev/null 2>/dev/null
	echo "Drcom has stopped."
}

之后可通过如下图的交互界面进行控制

路由器固件编译及个性化_第9张图片

③添加自定义app到Luci界面(具体来说是怎么复制第三方固件里好用的且有交互界面的app,但官方没有的)

大多数人比较喜欢有人性化的界面进行交互。首先声明,我并不会交叉编译自定义软件。接下来是我移植第三方app的过程。仅是个人的经历,不具普遍性。具体Luci界面对接后台程序,还需自个去查阅相关资料

在openwrt文件系统中,lua语言的代码不要编译

复制需要的xxx app,如果还有其他的在lua下也请一起复制了,不排除第三方app不按套路安装的,是不会有下面的东西的

/usr/lib/luci/model/cbi 	下的xxx.lua

/usr/lib/lua/luci/controller 	下的xxx.lua

/usr/lib/lua/luci/i18n 	下是对应的翻译文件xxx.zh-cn.Imo

/etc/config	下对应的xxx配置文件

/etc/init.d	下的xxx启动项

④ 关于多拨和负载均衡

由于我是用drcom认证上网,而且一个账号支持同时两台设备上网。所以你可以把两根网线的网速叠加,不过由此会于ipv6冲突

需要注意一点,当你的网不是pppoe拨号的时候(比如我所在的网),不要使用多线多播里的自动配置

第一、先把LAN1口改成wan口

路由器固件编译及个性化_第10张图片

第二、在接口初添加新的接口,接口命名为wan2,选择eth0.3,而且mac地址不能跟wan1一样

第三、在mwan3配置好权重之类的东西(我放弃了多线多播,保留了ipv6,所以此处无图)

第四、这个drcom拨号要指定ip,默认是绑定0.0.0.0,因为你两根网线由于mac不一样会分配不同的ip

在这里你可能会想把mac搞一样不行吗?ip也一样,认证服务器就会认为只有一台设备,就不用两个拨号了!两根网线又能同时加速!

虽然没有试过,但学过计算机网络的人应该知道,这样会把另一个挤掉线的,在类似于校园网的局域网中是以广播的形式进行通信的,而这是基于mac地址来标识设备,通过arp协议将ip转mac,是会造成“贵圈真乱”的!

.xxx/drcom -m dhcp -c xxx/drcom1.conf -b 10.x.x.50 -d &

.xxx/drcom -m dhcp -c xxx/drcom2.conf -b 10.x.x.52 -d &

⑤关于QoS问题

​ 我路由器里保留的是SQM QoS,其实我对QoS了解不多,更何况我路由器下除了我会占用较大的宽带之外,似乎没有了,游戏又不经常打,所以我并不需要预留宽带来降低游戏的延迟。

​ 另一个script qos 是可以对特定用户限速。不过没这个必要

​ 在网络中往往会发生1%的人占据99%的带宽,这时候可以开启你的SQM QoS了。。。

⑥shell界面

在http://www.asciiworld.com/ 下有许多好玩的ASCII字符图像,通过修改/etc/banner就行
路由器固件编译及个性化_第11张图片

四、总结

​ 其实自个探索挺有意思的。低价路由器玩出了上万的感觉。学习Linux、数据库、甚至是C语言、Python等都可以通过该路由器来实现,挂载的300G硬盘读写速度以及网速完全没问题。自从有了ipv6之后,硬盘真正实现了私有云。

​ 如果我在教室上课,忘了带电脑,其实可以通过手机控制路由器唤醒在寝室的电脑,然后通过ipv6直接控制电脑,而不论你是否处于同一局域网,通过移动数据也是可以远程控制电脑。基于ipv6的服务在互联网的任何一个角落都可以到达!

个人GitHubPage地址

你可能感兴趣的:(路由器固件编译及个性化)