折腾一下斐讯K2用LEDE

内啥。。。好久没写blog了。。。还欠了去菲律宾潜水的游记,我会补的。。。

起因就是我在电梯里面看到斐讯K2的广告,然后觉得不花钱搞一个双频路由器也蛮好的,家里原来的路由器是单频,2.4G上面的干扰说多了都是泪啊。。。于是就在某站上下了单,399元,坐等1个月之后的返现。。。

顺便研究了一下,觉得应该就是xx金融和斐讯一起搞的一个活动,拉客户什么的,基本上就是卖个个人信息吧,399块其实卖得还不错的。。。不知道斐讯和这个xx金融的股东啊投资人啊什么的有没有关联,我觉得这个活动其实还不错,互联网金融那么火,看到他们刚融了B轮,估计增加的这么多用户也帮他们卖个更好的价钱。所以就先谢谢未曾谋面的投资人吧,就好像我一直想感谢uber的投资人一样。。。

拿到手之后觉得这个路由器的外观做得还是可以的,开箱照就点这里看 吧。。。我懒,没拍。

之前在网上搜索的时候就知道斐讯的固件有后门。。。呵呵我竟然毫不意外和生气。。。因为反正我都是要刷机的。。。

刷机的第一步就是刷入breed,刷机这种事情从来就是买家和卖家斗智斗勇的过程,卖家不断更新买家不断破解。。。所以我觉得我在这里说得很详细也没啥用,说不定下个版本就被封了┑( ̄Д  ̄)┍(其实主要还是因为懒)

反正我是按照这里的教程 来做的,成功刷入breed。

吐槽一下,尼玛看到这个机器的配置。。。MT7620,64M的RAM和8M的ROM。。。就这个配置你告诉我要卖399?抢钱吧。。。顿时觉得自己的信息被卖便宜了。。。

刷入breed之后选择就很多了,我首先尝试了小米路由版的openwrt,2.4G的信号弱得没法用(不知道是不是2.4G功率设置的问题,懒得回来重试了),家里一堆老的电脑手机不支持5G,所以放弃。。。然后又试了传说中老毛子的固件padavan,2.4G的信号比openwrt好,但是速度很慢,而且经常莫名其妙断流,就算不断,shadowsocks也很不稳定,又放弃。。。后来偶然看到LEDE,惊喜地发现居然有斐讯K2专用的版本,于是果断下载下来折腾。但是这个的确比较折腾,因为刚装好的时候试没有luci的,没有luci也就没有web界面。。。所有的操作需要在ssh下面进行,好在平时折腾VPS什么的,具有一定的经验。。。

下载地址就用官方的吧,每日更新,零添加,纯净无污染,才3.5M。。。

http://downloads.lede-project.org/snapshots/targets/ramips/mt7620/

进去之后搜索psg1218,找到的就是K2的最新版固件,psg1208对应的是K1,下载之后连好网线,拔电源,再按住reset插电源进入breed,刷机。具体过程就不多说了。。。

刷完之后自动重启,这个时候整个路由器只有有线是能用的。。。而且还没有web界面。。。所以第一步是ssh连上路由器。。。地址192.168.1.1,用户名root,无密码。

进去之后改个密码是好习惯:

1
passwd root

然后输入2遍密码,密码要记住,以后web登录路由器也是这个密码。

我家是电信的宽带,所以第一步是配置pppoe拨号。依次输入下面的命令就好了:

1
2
3
4
5
uci set network.wan.proto=pppoe
uci set network.wan.username=电信宽带用户名
uci set network.wan.password=电信宽带密码
uci commit
/etc/init.d/network restart

这个时候用网线一头插在光猫的LAN上一头插在K2的WAN上,应该就可以自动拨号上网了。但是对于我这种在家找了半天都找不到第二根网线的,还需要继续打开wifi。。。

1
2
3
4
5
uci set wireless.@wifi-device[0].disabled=0
uci set wireless.@wifi-iface[0].mode=ap
uci set wireless.@wifi-iface[0].network=lan
uci commit
/etc/init.d/network restart

这样应该就好了,找一个LEDE的没有密码的AP连上,然后把网线一头插在光猫的LAN上一头插在K2的WAN上,再ssh到路由器继续下一步。想法是等以后有了web界面之后,再详细设置wifi。

检查pppoe设置是不是正确的办法很简单,在路由器里面ping一下百度就好了。谁说现在国内没人用百度的?没有百度怎么判断我的网路好不好哈哈哈哈。

假设网络是好的,接下来的重中之重就是搞定luci了,什么都通过ssh也太蛋疼太不直观了。。。

首先是更新一下软件源:

1
opkg update

LEDE的网络是比较烂的。。。非常有可能的情况是会失败。。。典型的失败情况是这样:

Update Failed
Update Failed

这种情况是说明LEDE的服务器抽风了,如果用浏览器去看的话会看到403 Forbidden的提示,遇到这样的情况。。。也没什么特别好的办法,过一会儿再重试。。。

还有一种情况会显示wget returned 4,这个是网络连接的问题,立刻重试一下就好了。。。

update完了之后,就装luci啦!之前就可以看到,LEDE的命令和openwrt是一样一样的,所以:

1
opkg install luci

过程中由于网络的问题,某些组件可能会下载失败,失败也没关系,重试就好了。全都完成之后,你以为就好了吗?哈哈哈少年你还是太天真了。。。Too young too simple, sometimes naive!如果这个时候你满怀期待打开192.168.1.1,等待你的会是这个界面:

Luci Error
Luci Error

因为出于某些未知的原因,有些必须的包没装上。。。所以只好手动添加了:

1
opkg install luci-lib-jsonc luci-lib-ip luci-lib-nixio libubus-lua libuci-lua rpcd

装完之后终于能看到登陆界面了。。。进去之后发现在wifi的部分,噪声的显示都是0dBm,不知道是驱动的问题还是固件的问题还是我少装了某个包。。。反正不影响使用,暂时就这样吧。。。

接下来比较重要的是2.4G无线的设置。在发射功率(Transmit Power)这里,默认最大的20dBm会导致信号看上去很强但是连不上网的情况。。。网上逛了一圈有人说改到最小也就是0dBm就好了,可能的原因是内置和外置PA互相干扰?反正改到0了之后2.4G的信号的下降并不是很明显,但是上网的速度的确好了很多。5G的网络用30dBm的就好。。。改成0了之后信号就真的是0了,巨弱。。。这个可能也从侧面验证了是外置PA的问题?K2的PA好像是只用在2.4G上面的。

到这里,基本的功能都有了,看了一下这么折腾之后,小小的K2还剩下80%的空间可以继续折腾,我很满意。。。于是接下来就要折腾我最爱的。。。一种强身健体的体育运动了。。。

我最爱的运动姿势是shadowsocks+ChinaDNS,然后内外有别,不影响国内的网速。

shadowsocks比较简单,一条命令直接搞定:

1
opkg install luci-app-shadowsocks-libev shadowsocks-libev-polarssl

坐等安装全部完成之后,开始配置。。。用shadowsocks-libev-polarssl的原因是K2的ROM太小了。。。libpolarssl比libopenssl要小好多。。。

ChinaDNS就比较复杂,LEDE的源中并没有这么高级的工具。。。想着偷openwrt的来用,结果可耻地失败了。。。所以我就自己编译了。编译说起来又是一个很长的故事了,以及,没找到现成的toolchain自己编译要花好久好久。。。我又不是学IT的。。。编译好的ChinaDNS我放百度盘了,下载地址:http://pan.baidu.com/s/1nuEIssh 密码:sbfq。下完之后WinSCP去/tmp下面备用。

好人做到底把我编译的toolchain也分享一下吧。。。nnd这个编译起来太慢太占资源了,用屌丝配置的digitalocean直接就内存不足退出了,还好DO可以动态调整,把内存调到2G才通过。。。

链接:http://pan.baidu.com/s/1gfBhafD 密码:3egz

为了通过web管理ChinaDNS,还需要luci-app-chinadns这个包。还好这个包有现成的,不需要自己来编译。。。去https://sourceforge.net/projects/openwrt-dist/files/luci-app/chinadns/ 下载。不确定这个包是不是和ChinaDNS的版本对应,因此不知道能不能用最新版的,保险起见也可以用我测试可用的1.4.0版。然后scp到路由器里面手动安装就好了。假设ipk文件是放在了/tmp下:

1
2
cd /tmp
opkg install luci-app-chinadns_1.4.0-1_all.ipk ChinaDNS_1.3.2-4_mipsel_24kc.ipk

接下来生成一个中国国内的ip地址文件,这个在shadowsocks和ChinaDNS都要用到:

1
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

然后就是设置了,先设置shadowsocks-libev,最上面的enable记得选上,然后依次填入地址,端口,密码,加密方式。Local port保持默认不要动,然后ignore list选择custom,然后填入/etc/chinadns_chnroute.txt。UDP Relay选enable,UDP forward的Enable选中,UDP Local Port就写5300,Forwarding Tunnel保持默认的8.8.4.4:53就好。这里的作用是利用shadowsocks的UDP转发来避免来自Google DNS服务器的查询结果被污染。填完之后点击Save & Apply。

然后搞搞ChinaDNS。大多数都保持默认就行了,Enable选中,Enable Bidirectional Filter选中,Local Port保持5353不变,CHNRoute File依然写/etc/chinadns_chnroute.txt。Upstream Servers改成114.114.114.114,127.0.0.1:5300。点击Save & Apply。

最后改DNS设置。这个是在Network->DHCP & DNS里面。DNS forwardings改成自己的ChinaDNS,也就是127.0.0.1#5353。注意这里是#不是冒号。。。Resolv and Hosts Files这个tab里面,选中Ignore resolve file,然后Save & Apply,结束。

把电脑上面所有翻墙工具关掉,接下来就是见证奇迹的时刻了。。。

首先,打开www.google.com,能打开说明是好事。。。打不开就自己找原因。。。然后搜索ip,这个时候看到的ip应该是shadowsocks服务器的ip。然后打开百度,同样搜索ip,这时候显示的应该是国内的ip。如果确认无误的话,基本上就够用了。

作为一个完美主义情绪略浓厚或者说略"作"的人,基本上够用当然不够好。。。接下来要干的事情是:

  1. 定期检查一下shadowsocks是不是挂了,挂了重启一下
  2. chnroute时不时要更新一下
  3. 好像听说vlmcsd有路由器专用的版本

1和2主要参考了这篇文章 ,并作修改。

最大的修改之处是,那篇文章是用完整版的wget来检查shadowsocks挂没挂,但是,要安装完整版的wget就要装那个之前我千方百计避开的libopenssl。。。于是改用curl重新写了个脚本,保存在/etc/ss-test中。curl需要的是libpolarssl,完美~~

先装curl:

1
opkg install curl

然后编辑脚本:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#!/bin/sh
 
LOGTIME=$(date "+%Y-%m-%d %H:%M:%S")
curl --connect-timeout 10 -s -I www.google.co.jp > /dev/null
if [ "$?" == "0" ]; then
    echo '['$LOGTIME'] No Problem.'
    exit 0
else
    curl --connect-timeout 10 -s -I www.baidu.com > /dev/null
    if [ "$?" == "0" ]; then
        echo '['$LOGTIME'] Problem decteted, restarting shadowsocks.'
        /etc/init.d/shadowsocks-libev restart
        /etc/init.d/chinadns restart
    else
        echo '['$LOGTIME'] Network Problem. Do nothing.'
    fi
fi

保存之后记得chmod 755 /etc/ss-test。那篇文章没有提到但是非常重要的一点是,需要手动改一下pppoe的设置,拨号的时候不要生成/etc/resolv文件。在pppoe的Advanced Settings中,把Use DNS servers advertised by peer后面的勾去掉,并且输入路由器的ip地址(192.168.1.1)。不然脚本运行的时候仍然从/etc/resolv中读取DNS设置,然后要么从电信的DNS那里得到了错误的google的ip,要么从你填的其他DNS比如8.8.8.8那里获得了一个被DNS污染之后的结果,自然是连不上的。。。于是天真的脚本就以为shadowsocks挂了,重启了。。。造成的结果就是可怜的shadowsocks每10分钟被重启一次。。。

自动更新的脚本比较简单了,同样是根据上面那篇文章的脚本改写,主要是改了改保存的文件名:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#!/bin/sh

set -e -o pipefail

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)) }' > /tmp/chinadns_chnroute.txt

mv /tmp/chinadns_chnroute.txt /etc/

/etc/init.d/shadowsocks-libev restart
/etc/init.d/chinadns restart

同样不要忘记chmod 755 /etc/update_chnroute

最后在计划任务中写入下面内容:

1
2
3
*/10 * * * * /etc/ss-test >> /tmp/shadowsocks_watchdog.log 2>&1
0 23 * * * echo "" > /tmp/shadowsocks_watchdog.log
30 4 * * * /etc/update_chnroute>/dev/null 2>&1

清理log的频率改为每天晚上11点,因为多了也看不过来啊。。。还占我宝贵的空间。。。

然后搞定kms。这一部分其实不难,但是之前的教程关于局域网自动获取kms地址的部分都不够详细,走了一些弯路。。。

首先去神一样的MDL下载 最新版的vlmcsd,点Source and binaries后面的链接可以下载最新的编译好的程序,可是好像那个链接坏了,点过去之后显示403错误。。。不过没关系,现在我有自己的toolchain了我牛逼了一言不合我可以自己编译了。。。编译完了之后扔去路由器的/usr/sbin/里面,记得改权限755,名字就叫作vlmcsd吧。

然后写个小脚本控制这个服务,新建一个/etc/init.d/kms的文件,里面写如下内容,巨简单的一个脚本。。。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#!/bin/sh /etc/rc.common

START=90

boot() {
        start
}

start() {
        /usr/sbin/vlmcsd
}

stop() {
        killall -9 vlmcsd
}

改一下权限,设置一下开机启动什么的:

1
2
3
4
chmod 755 /etc/init.d/kms
chmod 755 /usr/sbin/vlmcsd
/etc/init.d/kms enable
/etc/init.d/kms start

搞完之后用vlmcs-Windows-x64测试一下,电脑的命令行里面输入vlmcs-Windows-x64.exe 192.168.1.1。成功了之后就可以继续下面的工作了。具体步骤和原理参见这篇文章 。下面我就说说需要特别特别主意的部分:

第一,如果用 nslookup -type=srv _vlmcs._tcp.lan和 nslookup -type=srv _vlmcs._tcp始终得不到正确的回应的话或者只有一个能得到正确回应的话,首先检查自己电脑TCP/IPv4的设置。在高级TCP/IPv4设置的DNS选项卡中选择这个(如果nslookup大法的结果一个成功一个失败的话基本上就是这个原因了):

TCP/IPv4 Settings
TCP/IPv4 Settings

改完之后看看nslookup是不是正常,然后再用vlmcs-Windows-x64确认一下dns的设置是否正确。方法:vlmcs-Windows-x64.exe .lan。如果成功的话基本上就可以排除DNS设置的问题了。

第二,KMS自动发现的前提条件是之前设置的kms服务器地址已经被清空,不然的话激活程序会始终连接设置的KMS服务器(我相信在测试路由上面vlmcsd的时候应该已经把自己之前的KMS关掉了吧)。。。文章里面说的 CSCRIPT OSPP.VBS /remhst的确清空了office的KMS服务器设置,但是,企业版Windows的KMS信息还在啊。。。貌似即使清空了Office的KMS之后,Office的激活程序会读Windows的KMS,以至于我看log的时候发现一直试图联系我之前的服务器。。。所以要记得把Windows和Office的KMS也清空了,用管理员身份运行下面2条命令:

1
2
cscript "C:\Windows\System32\slmgr.vbs" /ckms
cscript "C:\Program Files\Microsoft Office\Office16\OSPP.vbs" /remhst

Office16是2016版office,其他版本的Office自己修改。运行完成之后,就可以尝试激活啦:

1
2
cscript "C:\Windows\System32\slmgr.vbs" /ato
cscript "C:\Program Files\Microsoft Office\Office16\OSPP.vbs" /act

激活成功之后用"cscript “C:\Program Files\Microsoft Office\Office16\OSPP.vbs” /dhistorykms"命令来看看最近一次激活的地址是否正确。