小米路由使用经验

槽点

小米路由比极路由 1S 还早买,但用了一周后就决定把他收起来了……

  1. 0.4.58 的版本,下载功能根本不能用,人品真差,同样的种子,1S 就可以下载!有朋友也这样,看来不是个例。

  2. 发烧……您说替代 NAS 吧,就一个硬盘而已,缓存还只有 8MB,一天就开机 9 小时左右,每天下班都是暖手宝。

  3. 太 TM 贵了,收起来还有点浪费啊!

优点

话说回来,UMU 是看好小米路由的,配置真心高,虽然大部分人不需要,但也提一下优点:

  1. 千兆网口啊!高富帅家里怎么能没有千兆独享的宽带?

  2. USB 啊!尼玛,插个 USB 声卡就可以做窃听器了,您造吗?扩展性超高,堪称智能……前提是 root。

  3. 信号超好啊!虽然天线内置,但有 4 根啊,秒杀极路由 1S。重点还很稳定,Windows、MAC OS、Android、iOS、WP 各种设备都一起连上来,MAC OS 和 iOS 都不会掉线哦!

  4. 11AC 超快啊!干扰少啊!

  5. 黑色垃圾桶的造型,让您放在角落也毫无违和感,它真的很像另一个角落的垃圾桶。(风扇有声,放角落才不会吵)

极路由 1S 使用经验

优点

基本全在硬件上:

  1. 不贵,性价比不错;

  2. 铝合金外壳,体型小巧,散热性好;

  3. MicroUSB 电源接口,停电时可以用移动电源供电(最近宿舍跳闸停电三次,还不得不提一下,这绝对是优点!);

  4. 两根天线,信号还行,虽然不如小米路由,但考虑到价格还是过得去。

  5. 可以插 SD 卡,这个能秒杀很多传统路由。

缺点

主要缺点在软件上:

  1. 不稳定,每个开发版都应该吐槽,办公室的 MAC OS 机器一连上来就出现一天死一次的问题,CPU 占用率超高!

  2. 定位很忽悠。您说智能吧,只是界面和使用流程得到一点点优化,再说面向极客吧……极客需要那些给小白用的界面?这明显是面向装逼的初级技术人员。一天死一次,就不要说极客了……

  3. 服务态度问题。App 不支持 Windows Phone。注册个账号哟手机,然后 UMU 手机换号了,联系了官方客服、在论坛上问了,都不让改,让 UMU 再注册一个账号……逛了几周的论坛,发现各位坛友大部分是小白,所以官方不断发一些扫盲的科普文,品质和逼格都不高,可以说根本没有极客间的交流。

硬件上的明显缺点:

  1. 不贴防滑贴在办公桌上很容易滑……设计硬伤!

  2. 没有 USB,明显少了很多扩展性,还敢自称智能?

个人观点

最近有朋友让 UMU 推荐路由器,UMU 还是建议他们买极路由 1S,回来刷 OpenWRT,自己整吧!

跟 UMU 一起玩 OpenWRT(入门篇3):工作模式开关

DIR-505 有一个工作模式开关,可以设定三个模式,但刷了 OpenWRT 后,默认没有任何功能,我们可以利用 GPIO 读取获得开关的位置。

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
#!/bin/sh

read_gpio() {
(echo $1 > /sys/class/gpio/export) >& /dev/null
(echo "in" > /sys/class/gpio/gpio$1/direction) >& /dev/null
return `cat /sys/class/gpio/gpio$1/value`;
}

read_gpio 19;
v=$?;
read_gpio 20;
v=$v$?;
read_gpio 21;
v=$v$?;
read_gpio 22;
v=$v$?;
read_gpio 23;
v=$v$?;
case "$v" in
10001) v="ap";;
11001) v="repeater";;
01001) v="hotspot";;
11000) v="4th";;
*) v="error";;
esac
echo $v;

按照 OpenWRT 官网资料(http://wiki.openwrt.org/toh/d-link/dir-505#buttons),有一款 DIR-505L 的开关是四个档位的,DIR-505 其实也有,但外壳把第四个档位给挡住了,掰不到。如果您足够蛋疼,可以用刻刀给它开开口……

我们可以在开机脚本(/etc/rc.local)里加入判断代码,根据档位做不同配置,以实现不同用途。

安全性堪忧的门禁系统

天天刷卡开门,不知道大家有没有考虑到门禁的安全性。按照 UMU 的设想,门禁的原理应该是:刷卡器获得卡信息,到服务器比较,若合法,则服务器下令开门。但现实中,有的门禁却不是这样的,下令开门的不是服务器,而是刷卡器!!!

UMU 与门禁的亲密接触发生在 2013-11-13,第二次不小心被关在厕所,忘记带卡,结果出不来,想起第一次是多么惨,最后让住公司附近的同事过来拯救。但总不能第二次又麻烦人家吧!于是开始了研究破解,不到 5 分钟,门就被打开了……

原理:这套门禁系统是直接由刷卡器控制门的开关的,所以在刷卡器这边就可以打开门,不需要经过服务器认证,我们要做的就是找到 OPEN 针脚,把它和 GND 针脚接起来,门就开了。

理论上说,门禁刷卡器很好拆,即使不好拆,一把锤子就能砸烂,所以对入侵者来说,只要具备野蛮和电路知识,破解的难度是相当低啊!

不罗嗦,上图!这是要破解的门禁刷卡器。

47#602-1

徒手温柔地打开……

47#602-2

去掉排线,就可以看到 OPEN 的针脚了:

47#602-3

连接 OPEN 和 GND,门就开了!

47#602-4

微软面试题:为什么 Shell 脚本自动把字符串 10001 当成二进制,输出 17?

注解

这并非是“微软公司”的面试题,而是稣想出来“让人微软”的题。

题目

1
2
3
4
5
6
7
#!/bin/sh
test() {
v='10001';
return $v;
}
test;
echo $?

运行后输出 17(二进制 10001 的十进制 17),解释一下?

解答(2023-01-17 新增)

返回值是个 Byte 呀!10001 是 0x2711,所以被截断为 0x11,那就是 17。即:

10001 mod 256 = 17

本题设置的陷阱正是“二进制 10001 的十进制等于 17”,误导人真有一套。

跟 UMU 一起玩 OpenWRT(入门篇2):连上路由器

登录

刚刚刷好 OpenWRT 的 DIR-505,默认没有开启 WiFi,所以只能用网线连接,连起来后,将电脑的网卡配置为 192.168.1.X,或者自动获得地址也行。

默认也没有开启 SSH,只能用 telnet 192.168.1.1 来连,连上后改 root 密码:

1
passwd root

改好密码后,先不要关闭 telnet,因为一关闭,下次就连不上了。马上用 SSH 客户端(推荐使用 putty,文件复制、编辑则推荐 winscp)连一下路由器:

1
ssh 192.168.1.1

如果连接失败,需要在 telnet 会话下开启 SSH 服务:

1
2
/etc/init.d/dropbear enable
/etc/init.d/dropbear start

开启 WiFi

用有线连接比较麻烦,接下来开启 WiFi,实现无线连接:

1
2
3
4
5
6
uci set wireless.@wifi-device[0].disabled=0;
uci set wireless.@wifi-iface[0].ssid='umu618.com';
uci set wireless.@wifi-iface[0].encryption='psk2+ccmp';
uci set wireless.@wifi-iface[0].key='password';
uci commit wireless;
wifi

改时区

时间都用网络同步,所以使用正确的时区很重要,要改为当地的时区,比如 UMU 使用台北时间:

1
2
3
4
5
uci set system.@system[0].zonename='Asia/Taipei';
uci set system.@system[0].timezone='CST-8';
uci commit system;

echo CST-8 > /etc/TZ;

改机器名

个性化,非必要:

1
2
3
4
5
6
echo 'DIR-505' > /proc/sys/kernel/hostname;

uci set system.@system[0].hostname='DIR-505';
uci commit system;

/etc/init.d/dnsmasq restart;

改欢迎语

个性化,非必要:

1
vi /etc/banner

跟 UMU 一起玩 OpenWRT(入门篇1):硬件选型和刷机

看了《跟hoowa学做智能路由》系列,也想写点自己的经验。

UMU 用的第一款硬件是 D-Link DIR-505。首先声明,UMU 不是 D-Link 员工,也不卖 DIR-505,用它完全是当下对比几个可选项筛选后的结果。理由:

  1. 本身就是不死 Bootloader,刷坏了固件用网线就可以救,把电脑 IP 设为 192.168.0.100,按住 Reset 开机,Web 浏览器访问 192.168.0.1。前面写的《不拆机给 D-Link DIR-505 刷上不死 U-Boot》完全是蛋疼地研究过程,对一般用户 UMU 建议不要刷,因为没有 JTAG,刷固件本来就不死,不小心刷坏 Bootloader,就只能拆机上编程器了,这明显作死。

  2. 配置比较高(相比 TP-Link 坑爹级同价位产品),8MB Flash,64MB RAM,UMU 手头上还有三个 TP 的(TL-WR841N、743N、941N)都只有它一半。有 USB 2.0 接口,743N 的 USB 是 1.1 的。

  3. 国内电商有得买,而且价格便宜,UMU 买的时候是 78 块。

  4. 小巧,方便携带,随时开撸!

也说一下它的缺点:没有外接天线,所以您懂的,信号必然比较弱,不适合“穿墙”族……然后 RJ45 口只有一个,有时候会不太方便。它最适合的使用场景是研究 OpenWRT、短距离和出差便捷使用。

请自行根据当下情况选择,毕竟新的硬件总是越来越强大,还越来越便宜。

接下来就刷个 OpenWRT 先~目前没有稳定发行版支持 DIR-505,所以要在 trunk 下找,下载目录是:http://downloads.openwrt.org/snapshots/trunk/ar71xx/。如果直接开刷,很可能失败,因为 D-Link 是有锁区的,OpenWRT.org 编译的 ROM 不是为中国版准备的,所以要动一下手脚先。上 WinHex 改 ROM,下面两张图分别是中国版和国际版:

中国版

国际版

两者只是图片指出的位置不同而已,可以自己改,如果把 OpenWRT 的 ROM 改为 CN 也无法在原厂 ROM 下刷成功的话,可以先找个官方的 DEF ROM 改为 CN,刷一下,再刷 OpenWRT 原版的 DEF ROM。

跟 UMU 一起玩 OpenWRT(高级篇2):不拆机刷不死 U-Boot

在上一篇《跟 UMU 一起玩 OpenWRT(高级篇1):编译不死 U-Boot》介绍了如何编译不死 U-Boot,但是不死 U-Boot 的作者只介绍了用 TTL 线刷方法,UMU 可不想拆机,毕竟拆机感觉并不好……

第一个思路是刷上 DD-WRT 固件,但是找了一下 DD-WRT 木有支持 DIR-505,只好继续蛋疼地编译 OpenWRT。

第一遍在虚拟机从 12:20 编译到 23:56,花费将近 12 小时……刚开始时,有一个下载过程,不断失败,想想是因为公司的网络太烂,于是把下载脚本改了一下:

<openwrt-svn-dir>/trunk/scripts/download.pl 中的 wget -t5 --timeout=20 --no-check-certificate 改为 wget -t5 --timeout=120 --no-check-certificate

第二天来,刷上,没问题,于是开始改代码去掉 U-Boot 写保护,参考这篇《Openwrt 中刷写 uboot ARThttp://see.sl088.com/wiki/Openwrt_中刷写_uboot_art,但结果很不幸,型号不同嘛!

接下来,凭自己的编程水平了,尝试改 <openwrt-svn-dir>/trunk/target/linux/ar71xx/files/arch/mips/ath79/mach-dir-505-a1.c,加入下面两个结构体:

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
static struct mtd_partition dir505_partitions[] = {
{
.name = "u-boot",
.offset = 0,
.size = 0x010000,
.mask_flags = 0,
}, {
.name = "art",
.offset = 0x010000,
.size = 0x010000,
}, {
.name = "mac",
.offset = 0x020000,
.size = 0x010000,
}, {
.name = "nvram",
.offset = 0x030000,
.size = 0x010000,
}, {
.name = "language",
.offset = 0x040000,
.size = 0x040000,
}, {
.name = "firmware",
.offset = 0x080000,
.size = 0x780000,
.mask_flags = 0,
}
};

static struct flash_platform_data dir505_flash_data = {
.parts = dir505_partitions,
.nr_parts = ARRAY_SIZE(dir505_partitions),
};

并将 dir_505_a1_setup 函数里的 ath79_register_m25p80(NULL); 改为 ath79_register_m25p80(&dir505_flash_data);

测试还是无效……看来必须在源头上使 MTD_WRITEABLE 无效掉,grep -r MTD_WRITEABLE <openwrt-svn-dir>/trunk/build_dir/target-mips_34kc_uClibc-0.9.33.2/linux-ar71xx_generic/linux-3.10.36/drivers/mtd,看到几处关键的地方:

1
if (!(ubi->mtd->flags & MTD_WRITEABLE)) {

1
if (!mtd->_write || !(mtd->flags & MTD_WRITEABLE))

主要在 mtd_erase、mtd_write 等函数,很明显,C 语言不管在什么平台都是很好懂,看几眼就搞定了,原理是使 MTD_WRITEABLE 这个标志无用掉,您可以设置,但是我把判断这个标志的代码全干掉了,设了也是白设!

最后编译好的 openwrt-ar71xx-generic-dir-505-a1-squashfs-sysupgrade.bin,用 sysupgrade 刷一下,reboot 后再用 mtd 刷不死 U-Boot,一切顺利,成功刷上不死 U-Boot!