小米路由器Mini 破解SSH刷OpenWrt架设IPv6环境

起源

说来事情的源头来自于我在这个博主这边看到了他说的假装自己有了原生IPv6:

然后很有意思的是,下面的ISP显示的是HE,一下子就唤起了我之前捣鼓IPv6时的记忆。其实这个跨度很大,从高中时期的6飞到后来的ISATAP(当时用的交大的,还是挺好用的)到大二的时候发现学校有双栈(以前一直不明白为什么接入明明是中国教育网却没有IPv6,后来才知道是学校信息中心太渣),只要稍微捣鼓捣鼓还是能用上的,虽然麻烦了点。后来学校的挂了就继续开始折腾,包括上面的ISATAP(当时直接阿里云开windows server然后设置个清华的isatap.tsinghua.edu.cn轻轻松松能到100Mbps的IPv6网速,以及后来被 GFW 干掉之后试过另外很多方法,也是类似于隧道额技术,尝试了很久之后在百度文库上面找到一个文档里面的方法是可行的,只是很慢,印象中使用的是台湾的隧道,神奇的是居然没被干掉。)。
要说我为什么这么执着于IPv6呢。。因为高中一开始接触只是觉得好玩,后来发现可以拿来上Google(说起这个真的是非常怀念Google北京的服务器还在的时候,改个hosts文件就能满速看Youtube的日子,现在不知道是怎么实现的就算改了hosts也没法看了),然后就是到了最近2年发现了PT(比如北邮人PT)这种神奇的东西,可以轻松找到自己想要的一切资源,学习的也好,娱乐的也罢。
扯远了(。-_-。)那个博主po的图片等于告诉我,HE(也就是tunnel broker)的隧道是可以用的(其实以前尝试过,只是家中和学校中都是使用的NETGEAR WNDR2000v3既不能刷openwrt,自带的6to4tunnel也不好用,虽然后来有买过好几个路由器刷过openwrt但是目的是在于别的,所以也就没有尝试,可能也是印象中是不行的所以就一直没去尝试),也就是说,只要能拿到公网的ip地址,只要隧道的ip还没被 GFW 干掉,那么也就是可以实现隧道接入IPv6的。

判断与准备

在此预期之下,我登录了我很久没有登陆的Tunnel Broker的账号,测试了一下给出的隧道ip,发现是ping的通的,而且丢包不严重,所以我就激动难耐,果断查了一下现在什么路由器比较好刷openwrt,最后得出了小米路由器Mini这个结论。其考量主要有3点:

  1. 用户群体广(像Ubuntu,有比较好的用户社区你遇到的问题大神们都遇到了)
  2. SoC适用性好(小米路由mini用的是基于MediaTek的7620A单核心,这个芯片之前是主流国内的路由器的宠儿,如果刷上Breed或者Uboot能通刷国内的各种路由器的ROM,比如说华硕家的,总之就是基于Linux的ROM都能刷,反正不死,随便刷)
  3. 价格(虽然官网买不到,直接京东之,也就124大洋,挺便宜的)

下单,等了3天到手了之后就果断刷机之。

获取SSH权限

常规手段

按照游戏规则,需要分以下几个步骤:

  1. 初始化设置(按照说明书),让自己的路由器能连上互联网(一般是PPPoE或者直接插在另外的路由器上面,反正小米路由默认的网关是192.168.31.1不会冲突直接能用),别设置完密码转头就忘就行。
  2. 手机上(好像目前只有iOS??)安装小米路由,手机连接到小米路由器的Wi-Fi,然后在App里面登陆小米账号,然后就会搜索网络所在是否有小米路由,搜索到了点配对,即完成账号和路由器的绑定。
  3. 登陆Miwifi官网然后下载对应路由器的最新的开发版的固件并刷机[1](使用一个FAT32的U盘,根目录下放置那个ROM并重命名为miwifi.bin,插上路由,按住RESET并通电,黄灯闪烁后松开等待刷机完成并重启)
  4. 登陆小米的开放平台(如果1完成绑定的话这边就能看到有路由器的信息,包括ROOT密码以及一个ID,否则的话请回1重新操作),然后下载工具包[2],按照提示进行刷机操作(和前面刷开发者版很像,只不过工具包其实也是个.bin文件,你需要重命名为miwifi_ssh.bin)。
  5. 成功获取SSH登陆权限,使用Putty(Windows)或是SecureCRT或者是终端(*nix)进行登录,密码就是开放平台登陆之后显示的ROOT密码,接下来就可以为所欲为了。[仰天长笑]

可能你会问“怎么刷ROM这么麻烦呀?”,其实也有简单的方法就是登录进管理界面,然后找到系统状态,那边有个“手动更新”选项,选择需要更新的ROM稍等片刻即可完成更新(可以看指示灯,安装ROM的时候是黄色删闪烁状态,蓝色常亮代表正常工作),但是上面出于不同系统环境的考虑所以才介绍比较麻烦的方法。当然,正常情况下,如果能进管理系统的话当然可以用图形化的方式进行软体的更新。上面只是介绍了一个万能的最可靠的方法而已。
然而。。。取得SSH权限并非如此简单。天下的事情要都这么简单也就没那么多疯子了。事实上,在第4步大家都会卡住,原因貌似是:小米为了降低用户乱刷ROM导致的路由器故障的售后的成本,直接把SSH给毙了(这算闹哪样??自己给了SSH的工具包结果还不让人玩??这叫哪门子开放??你们忘了小米一开始打上的标签就是随便刷?连个SSH权限都不给真是岂有此理。。。不经让人想要拍案而起。)。而且比较有意思的是,这个和HTC,Sony,华为,魅族手机的做法很像,都是如果你要“ROOT”(有的是解锁Recovery,也就是拿到自由更换ROM的权限乃至更高的权限),那么你得放弃保修。[摊手]霸王条款就是这么多,我是不会夸奖他们机智的。

所以当我尝试的时候,我发现不论是更换ROM的开发版的版本还是更换U盘还是多试几次,都是不行的,等闪烁完黄灯就直接红灯了,只能断电重启。一查资料才知道SSH被锁了,好吧,Never Mind,咱只是被逼上了一条必须要Hack或者说Crack一下的路而已,梁山好汉有几个是自愿上山的呢。接下来就是遍地撒网了查资料了!

破解方法

其中有个看起来靠谱的破解方法,当然也有人破解成功了,当然也有不成功的,大部分时间靠近的都没成功,因为楼主直接发在了小米社区,然后下个版本号就直接把漏洞给堵了。那么好,我想我刷干掉漏洞之前的版本再用这个破解的方法就可以了吧(在刷官方的SSH的时候我就尝试了更早的版本号开发版0.4.36,因为官方的说明是要SSH必须要是开发版0.3.84以上,但是奈何这个版本已经找不到了,而且从版本号可以看出来SSH获取的官方通道是多么早之前的事情了,现在的版本号是2.7.x)?然后我就按照说明刷了开发版2.7.11以及稳定版2.6.11,然后使用破解的方法。当然,也是可以破解的,而且破解方法有很大的参考价值,然而结果还是失败的(原作者说可以自行修改脚本,虽然2015年11月官方就封堵了这个漏洞,但是2016年1月的固件还是可以破解的。奈何我不懂shell也不是很懂python,所以还是失败了)。因为这个帖子感觉还是很有信息量的,若是感兴趣的话可以研读一下,其实就是涉及到具体的原理问题了[3](而且这个帖子中涉需要有恩山的账号才能下载附件,还好有好心人已经把具体的代码在他的博客里面贴了出来[4]),不过我不明白的是 API是从哪得来的 ?是mini开发文档中看到的呢,还是抓包抓到的呢?好想得到答案呢。
但是这个不是我们这边的重点,因为获取到ssh只是万里长征的第一步而已。暂时先立个flag,有空了一点要把 pythonshell 好好看看。说来也是挺神奇的,最后的答案居然是在一篇教你怎么不用USB来打开
SSH的台湾博主那边得到的[5]。简单来讲,分为以下几步:

  1. 到这边[6]下载小米路由器mini 稳定版2.8.14的ROM(没错就是稳定版!)
  2. 按照上面的刷机步骤进行刷机操作,并还原出厂设置,然后重新设置相关的网络参数(是否绑定小米账号,是否连接到互联网无关紧要)并重启。
  3. 重启之后使用设置的密码登录进管理界面,则可以在地址栏见到类似这样子的网址:http://192.168.31.1/cgi-bin/luci/;stok=521b849e00a11c5b6743aa275ba84ed8/web/home#router,将/web开始到最后替换为/api/xqsystem/set_name_password?oldPwd={路由器的原有密码,没有括号}&newPwd={想要设置的密码,没有括号},也就是类似于这样:http://192.168.31.1/cgi-bin/luci/;stok=521b849e00a11c5b6743aa275ba84ed8/api/xqsystem/set_name_password?oldPwd={路由器的原有密码,没有括号}&newPwd={想要设置的密码,没有括号} 回车之后可以看到网页显示为{"code":0}就表示成功更改了密码(这一步其实可有可无,只是为了测试下api是否正确运行而已)。
  4. 这一步需要替换/web到网址最后的是/api/xqnetwork/set_wifi_ap?ssid=tianbao&encryption=NONE&enctype=NONE&channel=1%3B%2Fusr%2Fsbin%2Ftelnetd,然后再将原有网址替换并输入类似这样子的网址到浏览器中:http://192.168.31.1/cgi-bin/luci/;stok=521b849e00a11c5b6743aa275ba84ed8/api/xqnetwork/set_wifi_ap?ssid=tianbao&encryption=NONE&enctype=NONE&channel=1%3B%2Fusr%2Fsbin%2Ftelnetd,并回车(这一步无需要更改的参数,直接替换拼接即可)。然后稍等一会(最多10分钟,而且一般如果超过2分钟就表示已经更改成功了但是浏览器不一定会显示,在这种情况下最好还是等候一段时间不要贸然中断,就算和路由器断开连接也得等到浏览器提示无法访问再做下一步操作。虽然浏览器没有了显示,但是实际上软体的漏洞已经被利用了,已经可以使用telnet进行登录了)浏览器中会出现:{“msg":"未能连接到指定WiFi(Probe timeout)","code":1616}就代表了我们的目的已经达成已经可以进行下一步操作,也就是说我们接下来可以使用Telnet登录路由器了。但是如果显示的结果是:{“msg":"参数错误","code":1523} 就代表了这个漏洞不适用于你路由器现在所使用的ROM版本(最好按照我的说明使用2.8.14的版本,因为我就是这个版本测试成功的),换言之,你没有操作1,2步,那么请你回头按照我所说明的来进行操作。
  5. 使用telnet登录路由器,这边我使用的是 Windows 7 中文旗舰版,不过各大版本都大同小异,唯有一个需要注意的是Windows 7开始默认是不内置telnet的,所以需要额外的一个步骤进行开启[7]。开启之后,在cmd里面输入 telnet 192.168.31.1 账号是root,密码则是上面你自己访问那个网址时设定的那个密码。
  6. 路由器不让SSH登录只是它在SSH小型服务程序中做了限制,具体如何限制的感兴趣的可以参见[3]。所以我们需要做的就是登录进路由器,并对SSH登录判断逻辑进行更改,依次在cmd里面(假设现在已经成功使用telnet登录进了路由器)输入以下三行命令:
    sed -i ":x;N;s/if \[.*\; then\n.*return 0\n.*fi/#tb/;b x" /etc/init.d/dropbear

/etc/init.d/dropbear start

nvram set ssh_en=1; nvram commit

  1. 6的命令输入完毕并切没有报错的话,即说明现在已经可以使用ssh进行登录了。windows下可以使用 putty 或是 xshell 或是 secureCRT 之类的终端类软体进行登录,*nix则使用原生的终端即可。命令是(如果是*nix的话,如果是putty之类的windows下的ssh登录环境的话会需要提前输入帐号或密码):ssh root@192.168.31.1 密码则是按照上文你自行更改的密码(不是小米开放平台上面显示的那个ROOT密码)。

IPv6环境预备

更改原生Bootloader,刷入不死Breed

备份原生Bootloader

虽然想想等我刷入了OpenWrt之后也不会再进行乱折腾的操作,除了可能会写点小插件小脚本什么好充分利用OpenWrt是基于Linux内核的这样一个事实,但是还是手贱给直接刷了个Breed。这边建议先按照[3]中后半部分的介绍的 恢复SN 部分到最后来备份bdata,比如最简单的登录ssh后使用bdata show 以及 getmac eth 来获得标准输出的关键的信息,比如SN以及MAC地址,可以截个图,方便以后出问题了恢复[8]。当然,如果跟我一样刷了Breed就能直接通过Breed来备份了。而关于 恢复SN 也可以参见[9]

成功备份了bdata之后(只是以防以后万一还想刷小米本来的固件呢)需要做的就是刷入Breed。在这之前我们需要额外做一步备份原生的uboot的操作(还是以防以后需要恢复成本来的固件)。使用ssh登录进小米路由器mini,然后键入以下命令:dd if=/dev/mtd1 of=/tmp/xiaomi_uboot.bin 则成功将小米原生的uboot备份到了 /tmp 目录下了。接下来需要做的是取出这个文件,Windows下的话可以下载安装 winscp 然后使用ROOT帐号和密码登录路由器,直接在图形化界面中进入到 /tmp 下手动拖出 xiaomi_uboot.bin 即可,比如说桌面上。如果是*nix的话,我发现是不支持 SFTP 的。所以这边我们换 SCP 命令来实现。
键入 scp root@192.168.31.1:/tmp/xiaomi_uboot.bin ./xiaomi_uboot.bin 然后输入密码即可完成备份,文件则在终端的当前目录下。

刷入Breed

等备份好了这个文件我们则可以大胆地刷入 Breed 了。其实以前叫做不死u-boot(本想找一下作者原帖关于U-boot和Breed之间关系的说明奈何没找着,所以就凑活看个关于刷机说明的吧)[10],后来作者 重写 (好像很大的一个问题是之前的不死U-boot是基于U-Boot 1.1.4 modification for routers这个项目做了些汉化和完善的工作,但是这个项目是基于GPL协议的,但是 hackpascal 也就是大家熟知的 h大 拒绝公开源代码,可能这个就是他需要重新一个不需要公开源代码还一定程度能带来一定利益的东西的动机所在吧[11]。说起这个,顿时想到了ShadowsocksR之前的不开源之争,真是为国内的开源社区气氛扼腕叹息,想要了解事情的来龙去脉的欢迎翻阅本文最后的 拓展阅读 )了个更加高效的各种优化的Breed[12],所以自然选择性能上和功能航更加完善的Breed了。步骤如下[13]

  1. 使用SSH登录路由器
  2. 键入 cd /tmpwget http://breed.hackpascal.net/breed-mt7620-xiaomi-mini.bin 即将我们需要的命令下载到了路由器的/tmp目录下(当然,你也可以直接用浏览器下载好了使用 winscp 或者 scp 命令上传到路由器中然后再登陆路由器找到这个文件)
  3. 键入以下命令 mtd -r write /tmp/breed-mt7620-xiaomi-mini.bin Bootloader (其实输到breed那边可以直接按tab补全,因为 /tmp 目录下只有一个breed开头的文件名)

然后等待5-8分钟,等路由器重启(中间会看到灯变成了黄灯闪烁,重启完成之后是蓝色常亮)即完成了 Breed 刷写。

如果刷写成功的话,应该是没有之前设置的wifi信号了(我直接连的有线,所以没关注这个)。说起这个,上文全是文字描述的原因是。。。不是我不喜欢贴图说明,毕竟贴图能言简意赅地说明问题,很多情况下如此。只是我在刷写过程中没有考虑到我会写博客来总结(而且是大半夜捣鼓出来的,而且使用的是同学的电脑,因为我的laptop没法连接有线网口)所以没有留下任何证据[摊手],自然也就没法贴图说明了。好在我也是看着别人的教程来做的,没有图示完全不会影响最后我们的目的的达成。

采用有线网口连接路由器的LAN口,按理说是设置个自动获取ip地址就可以的,但是为了以防万一,我们需要采用最保守的做法。使用尖锐的长条硬物(比如现在的智能手机的SIM卡顶针)顶住reset孔,然后接通电源,看到路由器的黄灯闪烁则可以松手了。将系统的 ip 子网掩码 网关 分别设置成 192.168.1.100 255.255.255.0 192.168.1.1 ,这边我使用的是windows的系统,不知道Linux或是macOS设置是否大同小异,总之至少要将自己的电脑的 ip 设置为192.168.1.100(为了和路由器处于同一网段,学过计算机网络的都知道局域网内需要在同一个网段才能互相访问)才可以。当然,也可以不设置直接在浏览器中访问 192.168.1.1 试试,不行的话再设置也不迟。如果能够访问的话,我们就可以看到如下界面:

建议刷写 Breed 完成后立即进入 固件备份 页面降 eepromfirmwaresn 总之是那个备份页面的所有备份选项都备份一遍。完成这个之后就真的可以大胆地随便刷固件了,Breed号称“不死”的意义也在于此吧,可以不用打开机器使用TTL来刷写(其实像网件和巴法络这种可以直接使用HTTP来刷机,其实也就是支持TFTP的路由器是不怕变砖的,但是还是需要打开机器使用TTL),甚至能直接刷写编程器固件。一定程度上,的确是不死了,不怕变砖了。

刷写PandoraBox

这边我们采用本土化(另外一些常用的命令,依赖等等也全都默认集成好了)比较好的一个 OpenWrt (喜欢捣鼓或者折腾可以试试 老毛子明月永在梅林DreamBox 的固件,玩玩多拨啥的,我的话目前宿舍用所以也没法捣鼓那些东西,哪怕是Chnrouter和Shadowsocks也没法设置[摊手])的衍生版本 PandoraBox,降低我们的上手难度。并且国内的使用群体比较广,出了问题比较容易找到解决方法。如果特别需要查看图示的话,可以参考这个[14](前半段获取SSH的教程已经失效)。

  1. 下载 PandoraBox 最新适配小米路由器Mini的固件版本,地址是:http://downloads.openwrt.org.cn/PandoraBox/Xiaomi-Mini-R1CM/stable/PandoraBox-ralink-mt7620-xiaomi-mini-squashfs-sysupgrade-r1024-20150608.bin
  2. 固件更新 页面找到firmware更新(无需其他两项),选择刚刚下载的这个文件,点击确认刷写并等待5-8分钟,还是一样的,黄灯闪烁表示刷写进行中,蓝灯常亮则代表已经刷写成功了。

补充:如果之前没有选择刷写 Breed 的话,在下载上面给出的链接的固件之后,可以按照下面的方法进行刷写[15]

  1. 在终端下切换到固件所在目录,然后键入scp PandoraBox-ralink-mt7620-xiaomi-mini-squashfs-sysupgrade-r1024-20150608.bin root@192.168.31.1:/tmp/ 没错,这个命令输入ROOT密码之后还是为了上传待刷写的固件(当然,也可以使用 winscp 直接把文件拖进去)。
  2. 登录进路由器的ROOT身份,然后使用这个命令来进行刷写:mtd -r write /tmp/PandoraBox-ralink-mt7620-xiaomi-mini-squashfs-sysupgrade-r1024-20150608.bin OS1 (如果有奇怪的错误请把 OS1 改成 firmware

据我查到的资料(因为我是刷写 Breed 之后进行的刷写,所以这一步也没测试过),网上很多教程用的是形如 mtd -r write XXX.bin firmware ,新版本要是用 OS1 而不是firmware

等到终端中看到Rebooting…之后就可以再等一会,即可完成刷写了。接下来就是连接并登录路由器进行设置了。

设置IPv6隧道以及路由器的一些简单的配置

申请并设置IPv6隧道

首先需要确定的是你的ISP是正儿八经的供应商,比如某动的宽带PPPoE拿到的IP地址还是全球广播的,并不能算完全意义上的独立公网IP。(如果我的记忆没错的话是会存在这样子的问题)就类似于设置ISATAP的话就一定要有一个公网的IP一样的,如果经过了NAT转发之后就不行了([更新]如果机器支持的话可以转发41号协议,这样就可以在NAT下使用6in4 tunnel了。可以见下面来自于he.net的说明引申)。

NOTE: When behind a firewall appliance that passes protocol 41, use the IPv4 address you get from your appliance’s DHCP service instead of the IPv4 endpoint you provided to our broker.

好在宿舍里面的是正儿八经的某信的宽带,所以就可以开搞了。因为使用的是PandoraBox默认继承了WEB图形界面所以也没有安装 LuCI 的烦恼。假设现在有一台完全处于初始状态的刷完PandoraBox的路由器,类似于我的,小米路由器Mini(此处是废话,毕竟如果不是这个路由器那么你也不会看到这篇博文了)。连接没有设置密码的SSID也是一长串类似 PandoraBox_XXX 的Wi-Fi信号,浏览器里面访问 192.168.1.1 输入帐号root,密码admin即可登录。然后就可以看到类似于这样子的界面(终于可以发图了,好激动):

自行 更改密码( System->Administration 中进行更改或是直接点击置顶的 Go to Password Configuration )以及界面语言(如果你觉得英语看着实在是太头疼的话)。更改完密码可以在终端中使用 ssh root@192.168.1.1来登录路由器,然后可以看到这个界面就表示到此为止,从获取到SSH,刷写Bootloader,刷写OpenWrt都圆满成功了:

这也就意味着,我们接下来需要做的只是配置了。 所以接下来首先是配置PPPoE:

  1. 在WEB管理界面找到 Network->Interfaces ,点击WAN上面的Edit,默认进入的是General Setup标签,Protocol选择PPPoE,PAP/CHAP username和PAP/CHAP password分别填入ISP提供给你的帐号密码,保存并应用,然后进入Advanced Settings,在Use custom DNS servers这边可以填入自定义的DNS比如:114.114.114.114223.5.5.5,其他选项默认即可,保存并应用。然后可以重启并连接这个Wi-Fi等待一会看看能否连接到网络,一般而言是可以成功的。如果不行,请检查是否PPPoE帐号密码填错或者搞错。
  2. https://tunnelbroker.net/ 注册一个帐号,不具体说明,不过推荐使用Gmail或是Yahoo Mail或是Outlook邮箱注册以免出现科学无法解释的现象(如果没有收到激活邮件请在垃圾邮件或者垃圾箱里面找找~)。然后点击左侧的 Create Regular Tunnel ,就会看到如下界面:

You are viewing from 这边可以看到你的真实的IP地址,当然,如果你不放心的话可以访问 http://icanhazip.com 或是 https://www.ipip.net查看真实的IP地址并对比。在 Ipv4 Endpoint 中填入路由器 wan 口的公网 IP(也就是下面一行显示的IP地址)。然后在下面的 Available Tunnel Servers 选择一个 he 的 6in4 的隧道服务器。一般而言,正如图片上显示的,HK节点经常是满负载的(估计是很多国人都在用吧,毕竟 HK节点到大陆的线路是最好的 ,但是我使用 BestTrace 测试的结果是都要到美国要一圈,HK和JP节点是到了美国西海岸折返回来,其余的欧洲节点是直接绕地球一圈到了欧洲。)一般而言,OpenWrt的路由器的防火墙默认是不禁止来自公网的ICMP请求包的,如果出现了填入了你的IP地址提示:

IP is not ICMP pingable. Please make sure ICMP is not blocked. If you are blocking ICMP, please allow 66.220.2.74 through your firewall.

如果出现了这样子的错误,那么请自行 Google 在防火墙中添加规则的方法(如果想要偷懒的话可以直接使用 sudo iptables -P INPUT ACCEPT 暂时允许所有的incoming请求,等添加完了再使用 sudo iptables -P INPUT DROP 来关闭)。这边因为有好多个IP,所以我们可以使用简单的BASH来实现自动化统计最好的节点(当然是通过 ping 命令啦,虽然这边的数据好并不代表最后的速度有多快,但是至少是成比例的)

在某一个目录下面新建一个文件名为 list.txt,填入并保存一下内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
216.218.221.6
216.218.221.42
74.82.46.6
216.66.84.46
216.66.86.114
216.66.87.14
216.66.80.30
216.66.80.26
216.66.88.98
216.66.84.42
216.66.86.122
216.66.80.90
216.66.80.162
216.66.80.98
216.66.22.2
184.105.253.14
184.105.253.10
184.105.250.46
72.52.104.74
64.62.134.130
216.66.77.230
66.220.18.42
209.51.161.58
209.51.161.14
66.220.7.82
216.218.226.238
216.66.38.58
184.105.255.26

在同一个目录下新建一个文件名为 ping.sh ,并填入以下内容并保存。


1
2
3
4
5
6
7
8
9
#!/bin/bash
date
cat ./list.txt | while read output
do
(ping -c 20 -q "$output" 2>&1)| tee -a ping.log
done

在终端下切换到当前目录,然后键入 chmod u+x ping.sh && sh ping.sh 然后等个5分钟就可以查看 ping.log 文件中哪个IP的延迟最短选用该IP即可。因为这边的IP并不是很多而且按照网站上的顺序进行排序,所以就不写到自动挑出avg最短时间的IP这个程度了(主要是不会写[摊手])。除此之外还需要考虑丢包率,比如我上海电信白天丢包丢的不想说话了。所以推荐分三个时段分别测试一次,然后综合结果来看。而且线路好的ping时短的也不一定就“快”,还得考虑到隧道到你需要访问的网站或是电脑的线路是怎么走的。所以如果你也是电信的话,不妨试试HK,TYO,LAX,FMT这几个节点(上海电信的测试结果是,Fremont节点最佳,PT下最高能跑满我20Mbps的小水管,没错,Fremont就在San Francisco东南面很近的地方),在我这边表现的还可以。确定好了节点之后点击create稍等片刻即可完成创建,然后可以看到这样子的画面:



这就表示隧道已经创建完毕,接下来需要做的就是设置路由器啦。登录进路由器的WEB管理界面,进入 Network->Interfaces->WAN6->Edit,然后根据提示填入TunnelBroker给我们的信息。

Item Value
Protocol IPv6-in-IPv4
Local IPv4 address 留空
Remote IPv4 address 上图的 Server IPv4 Address
Local IPv6 address 上图的 Client IPv6 Address
Pv6 routed prefix 上图的Routed IPv6 Prefixes->Routed /64

然后保存并应用,稍等一会,断开连接重新连接Wi-Fi应该就已经获取到了IPv6的地址。具体的可以在终端中输入ifconfig | grep inet6来查看:

1
2
3
4
5
6
7
(venv-2.7.12) Macintosh:blog d0zingcat$ ifconfig | grep inet6
inet6 ::1 prefixlen 128
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1
inet6 fe80::c617:feff:fed4:d971%en0 prefixlen 64 scopeid 0x4
inet6 2001:470:24:d3e:c617:feff:fed4:d971 prefixlen 64 autoconf
inet6 2001:470:24:d3e:9482:d36f:b3ab:de60 prefixlen 64 autoconf temporary
inet6 2001:470:24:d3e::12d prefixlen 64 dynamic

顺便可以直接ping一下OpenDNS看一下是否真的能够上到IPv6的网络:

ping6 -c 5 2620:0:ccc::2

1
2
3
4
5
6
7
8
9
10
11
(venv-2.7.12) Macintosh:blog d0zingcat$ ping6 -c 5 2620:0:ccc::2
PING6(56=40+8+8 bytes) 2001:470:24:d3e:9482:d36f:b3ab:de60 --> 2620:0:ccc::2
16 bytes from 2620:0:ccc::2, icmp_seq=0 hlim=60 time=361.459 ms
16 bytes from 2620:0:ccc::2, icmp_seq=1 hlim=60 time=379.972 ms
16 bytes from 2620:0:ccc::2, icmp_seq=2 hlim=60 time=408.520 ms
16 bytes from 2620:0:ccc::2, icmp_seq=3 hlim=60 time=329.682 ms
16 bytes from 2620:0:ccc::2, icmp_seq=4 hlim=60 time=355.077 ms
--- 2620:0:ccc::2 ping6 statistics ---
5 packets transmitted, 5 packets received, 0.0% packet loss
round-trip min/avg/max/std-dev = 329.682/366.942/408.520/26.297 ms

如果能够看到上述的样子,那么表示已经成功连接到了IPv6的网络环境下面[16],Cheers!

一些微小但是必不可少的设置

首先DNS的设置,如果DNS没有设置好的话会在IPv6+DNS6的网络状况下无法正确地解析域名,虽然这对于IPv6而言不是必要,但是还是设置一下为好。在WEB管理界面找到 Network->DHCP and DNS,在 DNS forwardings 这边填写DNS,推荐填写 114.114.114.114 223.5.5.5 2620:0:ccc::2 2620:0:ccd::2 然后保存并应用。

其次考虑到PPPoE每次都断线重连都会获取到新的IP(固定IP的土豪除外),在IP改变之后我们必须要通知 TunnelBroker 否则是无法进入隧道的。所以需要设置PPPoE之后自动更新IP,还好官方给了一个API只要GET一下就能更新了( Typeblog 博主不推荐使用PandoraBox里面自带的Dynamic Tunnel功能,一是说已经失效[有待考究,但是我也没做进一步的尝试,因为嘛,下面要介绍的方法一点也不复杂])。

在TunnelBroker的进入你所创建的隧道的详细信息,点击顶上的 Advanced 标签,复制 Example Update URL。这边有个要注意的点是,有可能会出现如下情况:

请看 光标 处,有个 “/”(默认的网址分隔符)。因为我们需要做的是在PPPoE之后通过GET请求告诉 TunnelBroker 我们最新的IP地址,也就是刚刚拷贝的网址就是我们需要访问的链接。但是如果链接中出现了“/”,那么会被认为是网址分割符,然而它真正的身份只是 Update Key 中的一个字符,并不是一个网址的结束,因此我们要手动点击Key的框框然后随便把“/”改成任何你想要的正常的字符就行。然后点击其他空白处就会更新了,这时候记得再拷贝一遍下面的 Update URL

然后使用SSH登录路由器。使用 vi/etc 下新建一个名为 tunnelbroker.sh 的文件,然后填入:

1
2
3
#!/bin/bash
sleep 10
curl -k https://d0zinat:1PyJSplZKxk1@ipv4.tunnelbroker.net/nic/update?hostname=392

PS,-k用于忽略SSL证书(因为OpenWRT内置的信任证书很少)。其实更新IP还可以直接登录 TB 之后使用另外的API登录,区别嘛就是链接更加短了[手动滑稽]。具体可以参照这边[17]

不过记得把 https 到最后替换成你刚刚拷贝的你自己的URL。然后使用 chmod u+x tunnelbroker.sh 赋予执行权限。然后使用vi打开 /lib/netifd/ppp-up,使用Shit+G到最后一行,添加 sh /etc/tunnelbroker.sh 保存并退出。

同时,建议用 nslookup 查询 ipv4.tunnelbroker.net 的IP地址,加入 /etc/hosts,防止由DNS解析失败带来的更新出错。如果你挂了shadowsocks,还应该把这个IP放进 ignore.list 里面,否则无法正常更新IP。如果有强迫症,还可以把隧道对端IP也加入shadowsocks的白名单里面,虽然这样做没什么用。

接下来就是测试了,可以按照[18]简单讲就是在WEB管理界面进入到 Status->Processes/usr/sbin/pppd Hang Up 就行。等待大概1分钟左右刷新页面发现重连成功了可以去 Status 主页面查看 IPv4 WAN Status 下的 Address 或是采用上文提到的方法查看自己的真实IP,然后去往 TB 的隧道页详细信息查看是否IP已经更新成功。若未成功,请手动查错。若是更新成功了则可以去这边ipv6-test进行测试你的IPv6环境。如果成功设置的话会看到类似下图的结果:

然后,既然有了IPv6的环境,不干点啥好想不大好。但是科学上网我有梯子,那么就拿来挂 PT 吧。毕竟自己的电脑24小时开着太伤,路由和移动硬盘就没这么心疼了。毕竟刷刷PT的流量也是不错的(又看到有人拿来优酷路由宝和迅雷挖矿,我觉得那个没太大必要,一个月也就200不到吧,还得有很高的网速)

最后 在设置Shdowsocks透明代理DNS转发防劫持的时候,PandoraBox出现了科学无法解释的问题,所以R.I.P. 。本爸爸已经投奔原生OpenWrt的怀抱了。

P.S.,刷完OpenWrt Chaos Calmer 15.05.1 默认是不开Wi-Fi而且灯是红灯状态,不要以为刷坏了(愚蠢似我)就再刷没必要的一遍,使用有线连接配置即可(自动获取IP即可)。

关于服务器(CentOS7)配置TunnelBroker隧道上IPv6

今天写这篇文章的时候突然意识到,我的香港的用来科学上网的服务器既然没有IPv4,那么为何不也通过6in4隧道搞起IPv6呢?毕竟要跟着潮流走嘛,不搞个IPv6的站点都不好意思说自己有服务器。顺便吐槽下这破服务器居然连个IPv6也没有(即便我用不上,即便大名鼎鼎的Linode也没有,哈哈)。因为配置相当的简单,所以就不另开一篇了,直接附加在这边。

申请开通隧道之前,我们需要给服务器的防火墙调整一下,使它能够回应ICMP的ping请求。因为我服务器科学上网需要统计流量(和好几个同学一起合租的所以有这个需求),虽然是CentOS7却也卸载了原声的 Firewalld 改用了 iptables(因为统计各个端口比价简单,主要是有现成的人家写好的叫做ss-bash的流量控制脚本可以用,这个依赖的就是iptables)。
使用以下命令来添加防火墙例外[19](上文提到的直接改默认策略当然也行):

sudo iptables -A INPUT -p icmp -m icmp -m limit -s 66.220.2.74/32 -i eth0 --icmp-type 8 --limit 1/sec -j ACCEPT

然后便可以使用服务器的IP去申请Tunnel了。申请开通之后请进入 Example Configurations 标签, Select Your OS 中选择 Linux-route2 复制下面的框框中出现的代码并使用SSH登录服务器,并切换到ROOT用户,粘贴那些命令,回车就设置好了[20],可以试着使用 systemctl restart network 重启下网络或是等一会,然后就可以ping一下公网上的IPv6的IP看看了[21],比如 2001:da8:215:4078:250:56ff:fe97:654d(北邮人PT的IP)。关于Nginx和Apache的监听嘛,自行Google找官方文档咯,我是没这个需求所以也没设置。

另外,如果在設置IPv6那邊粘貼命令時出錯了,那麼可能是系統兼容性的問題,可以使用sudo ip tunnel del he-ipv6刪除已經添加的tunnel,剩下你需要做的便是選擇下拉框的 Linux-net-tools,然後複製粘貼裏面的命令即可(以root身份)。另外值得注意的是,使用ifconfig所進行的設置在重啓之後將會丟失,所以我們需要將上述命令寫入 /etc/rc.local 並授予執行權限方便服務器下次重啓後自動配置。

这篇文章[22]很好的科普了 6to46in4 两种隧道的区别,不嫌英文碍眼不妨一读,反正我是不会去读的。然后嘛,这篇文章[23]写的很好很详细,但是我测试是失败的。这个[24]是Fedora最官方的说明,想要了解具体的命令是怎么敲的不妨试试,我也是不会去看的。

Transmission 配置

写到这边其实有点混乱,因为写这部分的时候我的环境已经 PandoraBox r1024 20150608->OpenWrt 15.05.1 -> OpenWrt 15.05 -> OpenWrt 15.05.1(Self-Build) -> OpenWrt 15.05(Self-Build)。频繁刷机的原因呢是:

Version Reason
PandoraBox r1024 20150608 shadowsocks官方编译源版本太低
OpenWrt 15.05.1 更改WiFi密码后Wi-Fi再也开不出来且Wi-Fi信号极弱
OpenWrt 15.05 尝试安装Transmission之后无法打开
OpenWrt 15.05.1(Self-Build) 科学无法解释的错误(例如安装时提示架构不兼容)
OpenWrt 15.05(Self-Build) 目前在用,测试中

关于提示架构不兼容的问题,当我尝试着我在这边[25]得到了答案:

当架构不兼容时会提示 but incompatible with the architectures configured,
此种情况一般在 ramips_24kec 架构的软件包安装时出现.
可以通过编辑 /etc/opkg.conf 调整架构支持,在文件末尾添加(也可以在 LuCI 设置页面修改):

arch all 100

arch ramips 200

arch ramips_24kec 300

添加完成后使用 opkg update 更新一次
再次使用 opkg install {packagename}.ipk 安装

正常情况下,PandoraBox是没有自带Transmission的,所以需要我们手动安装:opkg install transmission-daemon 进行安装。进行到这一步你可以选择是使用web界面还是远程管理客户端进行管理,我的话偏向于使用远程客户端,因为更加自然。当然,如果你需要Web的话,那么便是使用opkg install transmission-web 安装Web控制界面,如果你想要使用远程客户端的话那么便不用安装这个。但是在官方15.05版本安装时提示架构不兼容,然后照上面改了发现能装了。但是是直接使用opkg install transmission-daemon这个命令进行安装的(在自行编译的15.05.1的版本上面这个命令是没有用的, 因为官方trunk的transmission更新为了transmission-daemon-openssl,所以需要手动更改一下。当然,你也可以手动更改官方的源到14.07或是更低版本的源或是直接下载好了transmission的文件上传到路由器手动安装,正如我自己尝试过的那样,当然,是可以安装的,唯一会出现的错误就是上面提到的架构不兼容的问题了,但是万幸的是有解决的方法)。

然后/etc/init.d/transmission start ps | grep transmission 查找一下,发现死活都没有启动(其实是我犯了个极为弱智的错误,也怪我照着教程做的时候没动脑,没有记下来关键步骤)。因为即便是PandoraBox安装Transmission的话不做任何配置也是无法直接打开的,因为官方的配置文件里面有个option enable 0的参数(以泪洗面,这是闹哪样,装了还不让人打开?)。就跟官方的源码编译出来(或是官方的FW)默认是不带Wifi的,一定要自己先连了有线,手动设置ip了之后登陆ssh改配置文件设置好了才能打开[26],对新手可谓是充满了恶意。其实就是uci set wireless.@wifi-device[0].disabled=0; uci commit wireless; wifi这条命令就能打开Wifi的,当然,可以使用uci show wireless查看啊是否打开。当然,也可以直接去vi /etc/config/wireless手动改配置文件。我的配置文件的样本是这样子的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
config wifi-device 'radio0'
option type 'mac80211'
option channel '36'
option hwmode '11a'
option path 'pci0000:00/0000:00:00.0/0000:01:00.0'
option htmode 'VHT80'
option disabled '0'
option txpower '20'
option country '00'
config wifi-iface
option device 'radio0'
option network 'lan'
option mode 'ap'
option ssid 'Kick Ass_5G'
option encryption 'psk-mixed'
option key 'kaoyanbisheng'
config wifi-device 'radio1'
option type 'mac80211'
option channel '11'
option hwmode '11g'
option path '10180000.wmac'
option htmode 'HT20'
option disabled '0'
option txpower '20'
option country '00'
config wifi-iface
option device 'radio1'
option network 'lan'
option mode 'ap'
option ssid 'Kick Ass'
option encryption 'psk-mixed'
option key 'kaoyanbisheng'

当然,仅做参考。最重要的就是option ssid 'Kick Ass'option encryption 'psk-mixed'以及option key 'kaoyanbisheng'这三条命令。推荐不要动wifi-device里面的设置,原因后面说明。为什么会有重复呢?因为小米路由器Mini是有5GHz的。更改完了别忘了使用uci commit wireless; wifi进行重启Wifi设置。

而且,我在刷机之后发现LED亮红灯了,而且没有Wifi,第一反应就是刷机刷爆了,等再刷了一遍之后才意识到本来就是这样子的,才反应过来向这个方向去查错。然后我猜想是官方固件的问题(毕竟还提示架构不兼容),但是我又不想换回PandoraBox(官方只支持到14.07,我觉得版本太低),自然也就没有去尝试官方的Barrier Breaker版本。那么剩下的路只有一条了:自己编译。详细的内容请见下文的编译相关部分,这边不重复进行叙述。

那么接下来按理说用 vi /etc/config/transmission更改配置文件,将第二行的0手动改成1,理论上来讲就至少能够启动transmission了。但是我们还有一些额外的要做的事情。因为挂PT也好,
机器那点内置的容量是肯定不够的,所以我们需要外接U盘也好,移动硬盘也罢,总之小米路由Mini是支持2.5寸的笔记本的硬盘改的移动硬盘的(有看到说插U盘的话会有负载率长时间异常的情况,但是更换成移动硬盘就正常了)。但是支持的话从理论上来讲需要至少安装几个模块:opkg install kmod-usb2 kmod-usb-storage kmod-fs-ext4。从模块的名字也很容易发现,无外乎USB2支持模块,USB存储支持模块,以及ext4格式支持模块。但是这边也有疑问的是,从下面编译的时候发现有个block-mount的模块选项的,但是我没有测试缺少了这个模块是否还可以正常挂载USB存储,所以如果出错的话,可以手动 opkg install block-mount一下。

在正常使用之前,我们首先需要将相关的分区格式化为ext4格式(请自行做好备份的工作,虽然也可以通过安装其他的模块实现对FAT32/NTFS/ext3/exFAT的支持,但是据先辈的经验说那样子会不稳定,PT下载会失败,所以我们这边选择Linux自带的ext4格式)。将移动硬盘接到路由器上,然后登录路由的SSH。我们使用fdisk -l(如果提示命令不存在失败的话请手动安装这个工具,我不是很确定你使用的版本会不会默认带上这个工具,至少我按照默认选项编译出来的固件默认是不支持fdisk的,当然,也不支持curl)可以看到已经检测到的所有硬盘信息。例如:

我将要配置的是sda8分区,所以接下来我们使用mkfs.ext4 /dev/sdd8进行分区的格式化(当然,你也可以将U盘插在自己的系统上面,比如Debian8.7进行格式化,只是sda的分区可能不是8而是别的数字而已),然后使用mkdir /mnt/sda8 创建目录,然后使用mount /dev/sda8 /mnt/sda8 即可完成挂载。从理论上来讲你的路由器已经可以往这个分区上面读写文件了[27]

然后是transmission的一些设置(按理说如果内存小于128MB的话是要另外分一个区用作swap分区的以避免系统卡死,但是幸运的是小米路由器Mini刚好就是128MB的RAM,而且正常使用只有一次莫名其妙假死,那次的内存可用是6%)。使用vi /etc/config/transmission打开transmission的配置文件,然后先是按照上面说的将enable改成1,否则是怎么也启动不出来的。。气哭。除此之外,我们还需要改另外几个选项,例如config_dirdownload_dirincomplete_dirincomplete_dir_enabled。关于transmission的配置文件具体可以见这边[^transmission-config-exmaple],如果你想进一步了解的话。这几个目录的话可以手动改到例如我的环境下就分别是:/mnt/sda8/transmission /mnt/sda8/transmission/done /mnt/sda8/transmission/incomplete 以及true。按照我自己的实际使用来讲是不用事先创建这些目录的,软件会自动创建。但是谁知道在不同的环境下面会不会出什么幺蛾子呢。如果出错的话,请手动先创建完该目录下的这些文件结构然后再来这边改配置文件然后重启服务试试。

编译相关

因为在尝试着配置Shadowsocks透明代理和UDP转发以对抗DNS劫持的过程中发现,PandoraBox默认支持的shadowsocks-libev-spec版本太低了。。以至于没有ss-tunnel可以单独配置。所以为了解决这个问题,我选择放弃国产支持原生系统。



拓展阅读

简单概括下就是 Shadowsocks-windows 这个软件是基于GPLv2开源协议进行开源的,然后有个女大学生Fork了本项目并对其进行了修改(比如加入了协议混淆和流量统计,UDP over TCP之类的功能)发布名称是Shadowsocks-rss,目的按照作者所说是希望通过自己写了这个功能好“逼迫”原作者进行添加她觉得比较需要的功能(比如最常举例的UDP转发功能,下文给出的资料若你能够仔细阅读相关的链接你也能看到的,这边不赘述),但是这种逻辑就是有错误的,如果原作者的软件真的不够好,你下游改善了不应该直接开源PR原作者么?不开源意思是原作者发现你的想法不错结果还得自己从头造轮子咯?而且从她的commit记录里面可以看到很多都是直接merge的原项目,所以既然使用了原项目的代码,就得尊照协议进行开源!这边有个去该项目发布issue质疑开源协议遵守情况里面的回复挺到位的:

不遵守协议这就是错,不要扯不相干的混淆试听。
跟你辛不辛苦没有一丝关系。
跟你牛不牛逼没有一丝关系。
跟你做了多少贡献没有一丝关系。
跟有多少用户对你翘首以盼也没有一丝关系。
如果大大方方的认个错,没有人会苛求你,何苦在这里狡辩?

下面是一些相关的链接,感兴趣的可以进一步拓展了解:

记念 ss,向一个伟大的创造告别

AppData & temp & 当前目录

对GPL协议的违反

breakwa11.github.io

奇文共赏,关于ShadowsocksR事件

关于 shadowsocks-R

关于最近 @clowwindy 事件的整理

所以在此事件之上,我意识到了开源协议,开源理念和氛围的重要性。有空了应该给自己的博客加上相关的说明,像以前的wordpress的footer的标注一样,起码能够让我的博客的访问者能有一定程度有机会了解开源协议。


  1. 小米路由器mini刷机教程

  2. 小米开放平台-SSH获取

  3. 小米路由器破解开启SSH 小米路由器mini丢失SN后恢复找回SN 完美无需编程器!

  4. 小米路由mini破解ssh并刷入breed

  5. 小米路由器mini 免USB打開SSH

  6. 小米路由器mini 稳定版 2.8.14 (第 52 周2016.02.03)

  7. Win7下启用Telnet方法

  8. 小米路由器SN丢失恢复方法

  9. Newifi mini刷小米路由固件 之 改SN方法

  10. U-Boot 刷机方法大全

  11. 何谓不死 uboot?

  12. AR/QCA/MTK Breed,功能强大的多线程 Bootloader

  13. 小米路由器mini韌體刷openwrt PandoraBox韌體

  14. 涨姿势,小米路由器mini版刷openwrt固件图文教

  15. 小米路由器mini刷OpenWRT/PandoraBox

  16. Openwrt 配置 he.net IPv6 隧道

  17. 在OpenWRT上配置HE IPv6隧道的正确姿势

  18. How to force manual reconnect in OpenWRT PPPoE connection mode?

  19. Setting up an IPv6 Tunnel

  20. (CentOS7)配置IPv6隧道地址

  21. Enable IPv6 Tunnel Broker on Aliyun CentOS 7

  22. 6to4 and 6in4 Tunnels

  23. Set Up an IPv6 Tunnel on Your Linode

  24. IPv6 tunnel via Hurricane Electric

  25. OpenWrt-dist

  26. Wireless configuration

  27. Transmission bittorrent client on OpenWRT