前言

最近舍友说我丢在宿舍里的极路由1S突然挂了,具体表现为只有电源灯亮着但无法发射WIFI信号。恰逢回校一趟,找出包装盒,把路由打包好,在JD申请了售后。

第二天就有极路由的客服打电话给我,询问了情况后说应该是固件出问题导致的,建议我自己重刷一下,随后就收到了含重刷教程链接的短信。问舍友,答几个星期前在高速下载的时候WIFI信号间接消失,于是让其自动升级到最新的固件。原来如此,那就先试试重刷固件吧。

按照教程,我首先在http://bbs.hiwifi.com/thread-78198-1-1.html下载了极路由壹s(HC5661)的固件9008,然后按照http://bbs.hiwifi.com/forum.php?mod=viewthread&tid=80529&page=1&extra=#pid1276046里说的进行刷机,刷完后果然满血复活了。

本来这件事到这里就结束了,但是我又起了折腾的念头。因为舍友们已经新弄了一台路由器来用,而家里一主一备两台TPlink工作良好,等于说这台路由器修好了也是吃灰而已。早闻OpenWRT大名,其今天就来把极路由1S刷成OpenWRT。

获取Root

当前版本的极路由封了root,不能ssh到路由器上愉快地玩耍,刷OpenWrt更是想都不要想,所以首先要开启极路由的开发模式。

注意开启后会失去官方保修服务! 注意开启后会失去官方保修服务! 注意开启后会失去官方保修服务!

进入云平台,点击路由器信息,拉到页面最下方,点开高级设置进行申请。之后需要关注极路由官方微信,绑定自己的社区账号,绑定完毕后即可安装开发者模式插件。

此后可以通过ssh登陆路由器,root完成。

不死uboot

俗话说常在江湖走,哪有不挨刀。刷固件多了,变砖乃兵家常事。为了避免悲剧,先刷上不死uboot。

首先登陆http://www.right.com.cn/forum/thread-161906-1-1.html,下载本机对应的Breed。注意别下载错了,不然刷完是真变砖。我的极路由1S对应的是breed-mt7620-hiwifi-hc5761.bin

ssh到路由器上,用scp上传该文件到/tmp目录下,然后执行以下命令:

mtd -r write /tmp/breed-mt7620-hiwifi-hc5761.bin u-boot

显示rebooting后等待路由重启完成。

重启完毕后三灯亮起,此时断开电源,按住RST通电,看到电源灯闪烁时可以松开RST。电脑自动获取ip,用浏览器192.168.1.1即可登陆Breed控制台。

至此不死uboot刷入完毕,以后想怎么刷就怎么刷,刷成砖后进Breed控制台继续刷。当然刷之前最好先在固件备份页备份一下。

获取路由器固件

在github上找到了适配极路由的OpenWrt固件。项目主页:

https://github.com/rssnsj/openwrt-hc5x61/tree/chaos_calmer

作者提供了编译好的固件下载地址,但是作为一只猿,总是觉得要自己编译才放心,于是按照作者的指引进行编译:

# 安装必需的软件包(仅限Ubuntu/Debian)
sudo apt-get install build-essential git subversion wget flex gettext libncurses5-dev unzip gawk liblzma-dev zlib1g-dev ccache u-boot-tools

# Checkout项目代码
git clone https://github.com/rssnsj/openwrt-hc5x61.git -b chaos_calmer openwrt-hc5x61-cc

cd openwrt-hc5x61-cc

有两种编译方法:

直接编译法

刚刚已经cd到openwrt-hc5x61-cc目录下,直接执行make即可。只是该方法容易报错且耗时长,包含下载和编译我花了一个多小时。因此建议使用ImageBuilder编译法。

附上我编译时遇到和解决的一些错误:

  • 错误

    svn co svn://svn.openwrt.org/openwrt/branches/chaos_calmer openwrt-ramips -r46893
    svn: E000111: Unable to connect to a repository at URL 'svn://svn.openwrt.org/openwrt/branches/chaos_calmer'
    svn: E000111: Can't connect to host 'svn.openwrt.org': Connection refused

    解决

    不知道为啥我用Proxifier+Shadowsocks无法为svn代理,依然checkout失败。建议使用国内的镜像,修改makefile中的svn地址:

    svn co svn://svn.openwrt.org/openwrt/branches/chaos_calmer $(openwrt_dir) -r46893
    
    ->
    
    svn co svn://svn.openwrt.org.cn/openwrt/branches/chaos_calmer $(openwrt_dir)
  • 错误

    *** Please make a symbolic of either config file to 'config-hiwifi'.
    make: *** [.patched] Error 1

    解决

    根据路由器型号做符号链接,我的是极路由5661,因此执行以下代码:

    ln -s config-hiwifi-hc5761 config-hiwifi
  • 错误

    Build dependency: OpenWrt can only be built on a case-sensitive filesystem

    解决

    由于我是在Docker的Ubuntu里编译的,编译目录挂载在Mac上,然后Mac的文件系统的case-insensitive的。于是我把整个编译文件夹都拷贝到/下了。

  • 错误

    Build dependency: Please install the openssl library (with development headers)

    解决

    安装openssl

    apt-get install libssl-dev

编译成功后,在openwrt-hc5x61-cc/openwrt-ramips/bin/ramips目录下可以找到固件文件openwrt-ramips-mt7620-hc5761-squashfs-sysupgrade.bin

ImageBuilder编译法

首先到OpenWrt官网,下载OpenWrt-ImageBuilder-15.05-ramips-mt7620.Linux-x86_64.tar.bz2OpenWrt-SDK-15.05-ramips-mt7620_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-x86_64.tar.bz2,然后解压到openwrt-hc5x61-cc/ImageBuilder文件夹下。然后执行make编译。注意如果需要5G驱动,make命令加上RALINK=1,如果需要自带全家桶(Shadowsocks, minivtun),make命令加上FEEDS=1。我希望能够获得比较纯净的版本,因此什么都没加。

make BUILDER=OpenWrt-ImageBuilder-15.05-ramips-mt7620.Linux-x86_64 SDK=OpenWrt-SDK-15.05-ramips-mt7620_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-x86_64 HC5761

编译成功后,在openwrt-hc5x61-cc/ImageBuilder/OpenWrt-ImageBuilder-15.05-ramips-mt7620.Linux-x86_64/bin/ramips目录下可以找到固件文件openwrt-15.05-ramips-mt7620-hc5761-squashfs-sysupgrade.bin

更新固件

按照之前介绍的方法进入Breed的控制台界面。先在固件备份界面将EEPROM、固件、编程器固件、极路由 Key 备份下来,进入固件更新页面:

上传刚刚编译好的文件,点更新,进度条跑完后路由器将自动重启,由于我们的电脑和路由器的LAN口相连,所以路由器第二栈灯将会亮起,可以作为重启完毕的标志。

配置

上文提到,我刷的是ImageBuilder编译法编译出来的“纯净版”固件,因此悲剧地发现路由器没装LuCI,需要自己安装。使用了作者提供的固件或使用直接编译法固件的童鞋可以直接浏览器访问192.168.1.1登入LuCI管理页面,请直接跳到第4步。

  1. 登陆路由器

    路由器默认没有密码,因此无法用ssh登陆,先用telnet登陆上去,然后用passwd设置密码。

    telnet 192.168.1.1
    ...
    passwd

    设置密码后,今后无法用telnet登陆,换用ssh,敲入刚刚设置的密码即可:

    ssh root@192.168.1.1
  2. 连接外网

    由于LuCI的包太多,离线安装很麻烦,索性把路由器联网后通过opkg安装。这里我连接的是主路由器(192.168.1.1)提供的WIFI。

    编辑/etc/config/network,确保wan项proto为dhcp:

    config interface 'wan'
    option force_link '1'
    option macaddr 'xx:xx:xx:xx:xx:xx'
    option proto 'dhcp'

    为了避免ip段和主路由冲突,将lan项ipaddr改为192.168.199.1:

     config interface 'lan'
     option ifname 'eth0.1'
     option force_link '1'
     option macaddr 'xx:xx:xx:xx:xx:xx'
     option type 'bridge'
     option proto 'static'
     option ipaddr '192.168.199.1'
     option netmask '255.255.255.0'
     option ip6assign '60'

    然后重新加载配置文件

     ifup wan
     ifup lan

    此时由于修改了路由器的ip,因此ssh连接会断开,换用192.168.199.1登陆。

    编辑/etc/config/wireless,将设备名称改为wlan0,填入主路由器的热点名称(STAR)和密码(password)。

    config wifi-device 'wlan0'
        option type 'mac80211'
        option channel '11'
        option hwmode '11g'
        option path '10180000.wmac'
        option htmode 'HT20'
    
     config wifi-iface
        option device 'wlan0'
        option network 'wan'
        option ssid 'STAR'
        option encryption 'psk2'
        option mode 'sta'
        option key 'password'

    然后重新加载配置文件:

     wifi

    稍等片刻后路由器无线网路灯(第三栈灯)亮起,代表连接上网络。用ifconfig可以看到wlan0设备的分配到的内网地址。

  3. 安装LuCI

     opkg update
     opkg install luci

    安装完毕后访问192.168.199.1即可使用LuCI的界面。

  4. LuCI下的配置

    首先将界面设置为中文:在system-system-Language and Style,将Language设置为Chinese。

    然后配置WAN:在网络-无线,如果之前做了第二步,可以看到已经作为客户端连接到主路由器。否则选择搜索,加入你想加入的主路由器,填入密码点提交,即可创建连接。

    接着配置WIFI:在网络-无线,选择添加,模式选择接入点AP,网络为lan,最后别忘了在无线安全标签下设置wifi密码。设置完毕后,点击保存&应用按钮。

    此时我们的电脑可以断开网线,使用wifi来连接路由器。选择刚过创建的热点,输入密码,即可连接路由器。

应用

哼哼,辛辛苦苦刷OpenWrt,不就是为了能在路由器装点东西嘛。

  1. 文件共享

    路由器插了张8G的内存卡,可以通过Samba来做文件共享。

    选择系统-挂载点:

    将内存卡设置为启用后保存。刷新页面后可以在已挂载的文件系统处找到内存卡相应的挂载点。

    选择服务-网络共享,添加挂载目录:

    然后路由器子网下的用户就可以通过该目录来进行文件共享了:

    P.S. 经过测试,感觉性能有瓶颈,上传200M的文件要两分钟,下载200M的文件要30秒。建议下载完直接把内存卡拔下来插到电脑上。

  2. Fuck Wall

    作者自带的SS不好用,还受DNS污染导致无法Fuck Wall。因此还是用纯净版自己来。

    先分别到:

    http://sourceforge.net/projects/openwrt-dist/files/shadowsocks-libev/

    http://sourceforge.net/projects/openwrt-dist/files/chinadns/

    http://sourceforge.net/projects/openwrt-dist/files/luci-app/shadowsocks-spec/

    http://sourceforge.net/projects/openwrt-dist/files/luci-app/chinadns/

    把最新的包下载下来,传到路由器中(利用文件共享可以免除scp之烦):

    然后安装:

    opkg install ChinaDNS_1.3.2-3_ramips_24kec.ipk
    opkg install shadowsocks-libev-spec_2.4.6-1_ramips_24kec.ipk
    opkg install luci-app-chinadns_1.4.0-1_all.ipk
    opkg install luci-app-shadowsocks-spec_1.4.0-1_all.ipk

    安装完后,打开服务-ShadowSocks,填入服务器配置信息,UDP转发和访问控制配置如下:

    打开服务-ChinaDNS,配置如下:

    打开网络-DHCP/DNS,在基本设置页设置DNS转发127.0.0.1#5353,在HOSTS和解析文件页将忽略解析文件忽略HOSTS文件钩上。

    为了能够使用UDP转发,需要安装iptables-mod-tproxy:

    opkg update
    opkg install iptables-mod-tproxy

    更新ChinaDNS列表:

    wget -O- 'http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest' | awk -F\| '/CN\|ipv4/ { printf("%s/%d\n", $4, 32-log($5)/log(2)) }' > /etc/chinadns_chnroute.txt

    以上步骤做完后,请重启路由器。

  3. 远程下载

    下载哪家强?当然是Aria2啦~以往用aria2都要开个docker来跑,如今装到路由器上就避免了每次下载都要开docker的麻烦。

    首先安装aria2:

     opkg install aria2

    创建aria2目录,放入session和配置文件:

     mkdir /etc/aria2
     cd /etc/aria2
     touch aria2.session
     vi aria2.conf

    粘入以下内容到aria2.conf中,请将dir修改为相应的下载目录(内存卡等设备):

    dir=/card/aria2
    
    file-allocation=none
    log-level=warn
    
    max-connection-per-server=10
    max-overall-download-limit=0
    max-concurrent-downloads=10
    min-split-size=5M
    enable-http-pipelining=true
    max-tries=0
    input-file=/etc/aria2/aria2.session
    save-session=/etc/aria2/aria2.session
    save-session-interval=60
    
    enable-rpc=true
    
    rpc-listen-port=6800
    rpc-listen-all=true

    配置完毕后,启动aria2:

    aria2c --conf-path=/etc/aria2/aria2.conf

    然后是aria2的Web UI。根据之前的习惯,选用Webui-aria2而不是luci-app-aria2+YAAW。

    首先到https://github.com/ziahamza/webui-aria2把整个目录下载下来,把README.md啊screenshots啊这些无关紧要的文件删除后,上传到路由器的www目录下。

    浏览器访问http://192.168.199.1/webui-aria2/,打开设置-服务器设置,如下填写:

    此时提示连接成功。aria2安装完毕:

    为了让aria2开机启动+后台运行,打开Luci管理页面,进入系统-启动项,在本地脚本中加入一行:

    aria2c --conf-path=/etc/aria2/aria2.conf -D
  4. FTP(新增)

    用Samba来传输大于1G文件时发现传输会出错。具体表现为文件传输到一半WIFI断线,然后文件传输中断。经过一番Google后无果,决定换用FTP来传输文件。

    opkg update
    opkg install vsftpd
    vim /etc/vsftpd.conf

    修改配置文件为以下内容:

    background=YES
    listen=YES
    local_enable=YES
    write_enable=YES
    local_umask=022
    check_shell=NO
    
    chown_uploads=YES
    chown_username=root
    ftp_username=nobody
    anonymous_enable=YES
    anon_upload_enable=YES
    anon_mkdir_write_enable=YES
    anon_root=/mnt/mmcblk0p2
    local_root=/mnt/mmcblk0p2

    anon_root和local_root为要挂载的目录名,设置为内存卡挂载目录。为了方便,我允许了匿名用户登陆。

    接着修改目录权限:

    chown root:nogroup /mnt/mmcblk0p2
    chmod 775 /mnt/mmcblk0p2

    删除nobody用户的密码以允许匿名登陆:

    passwd -d nobody

    配置完成后重启服务:

    /etc/init.d/vsftpd restart

    启动完成后,浏览器访问ftp://192.168.199.1

    用Guest用户登陆,即可访问目录文件~

还有很多有趣的应用,比如adbyby、迅雷远程下载等,待今后有时间在折腾。

总结

OpenWrt作为一个嵌入式的Linux发行版,有着完善的生态系统,赋予用户DIY路由器的权利。用户只需ssh到路由器上,然后就可以像操作VPS那样愉快地玩耍。只要路由器够强大,上nginx+php+mysql完全不是问题。

没想到路由器那么好玩,一不小心就花了两天时间来折腾,羞愧羞愧,以本文记之。

参考

http://bbs.hiwifi.com/thread-82822-1-1.html

http://www.right.com.cn/forum/thread-161906-1-1.html

https://blog.chionlab.moe/2016/01/23/openwrt-bypass-gfw-solution/