本文发自 http://www.binss.me/blog/how-to-configurate-phicomm-k3-router/,转载请注明出处。

自从 16 年折腾极路由 1s ,将其刷成 OpenWRT 并装上各种各样的服务后,才发现有趣的是折腾的过程,刷完后路由器出现了一些奇奇怪怪的毛病,最难以忍受的是路由器偶尔会断流,需要重启才能恢复。一个路由器连最基本的功能都提供不了,要之何用?于是我放弃了折腾,老老实实地成为了 tplink 低端路由器的忠实粉丝。

相信很多人会对 tplink 嗤之以鼻,以最为主流的、价位在 100 元左右的产品为例:64M 的 ram,mtk 的弱鸡 CPU,明明写着千兆路由但 LAN 口只有百兆,等等等等,而我曾经也是这样认为的。然而前段时间家里升级宽带时,父亲跟我说装宽带的师傅说家里的路由太菜要换时,我才想起家里的那台 tplink 已经默默工作了十年,在此期间,风雨无阻,从不断网。在这一刻我才明白了一个优秀路由器的最重要的品质:稳定。于是,我把当前手头这台千兆 tplink 腾出来,准备下次带回去放家里,然后开始为自己物色一台更好玩的路由器。看来看去,华硕的 ac88u 好像不错,但其高达 1300 的价格让我望而却步。此时,一台路由器映入眼帘。

斐讯 k3,硬件上跟 ac88u 媲美:

  • CPU: BCM4709C Cortex A9 1.4GHz
  • RAM: 512MB DDR3-1600
  • flash: 128MB NAND Flash
  • 无线芯片: BMC4366 * 2, 4×4 MU-MIMO
  • 功放: SKY2623L + PA5542
  • 接口: 千兆 wan 口 + 千兆 lan 口 * 3 + USB 3.0

此外个人看来 k3 在工业设计上也是完爆华硕全家的。最引人瞩目的是不像 ac5300 将天线外露做成八爪鱼,k3 将 8 根天线收到机身内部。同时,在顶部提供一块显示屏进行显示:

最关键的是,这款在某二手交易平台上只需要 300 多。于是我痛快地剁手,开始了折腾之旅。

刷机

路由器到手,刷机是肯定要刷的。一方面是出于安全考虑,比如流量被监听、被劫持(后来的广告门也验证了这一点),另一方面是作为一台拥有豪华配置的路由器,不折腾一下自己浑身难受(后来回想起来极路由经常卡死可能是硬件太菜而我却还让他跑各种乱七八糟的服务)。得益于高装机量,在恩山论坛上有整整一个板块都是讨论斐讯家路由器。于是我开始了自己的刷机之旅。

梅林混血

该固件的优点在于能够使用华硕家成熟的梅林固件,从而获得丰富的功能和酷炫的操作界面。

我选用的是 tianbaoha 的固件,教程可以参考 https://tbvv.net/posts/0101-k3.htmlhttps://tbvv.net/posts/0101-merlin.html ,先刷成官改,然后通过 SSH工具箱–>刷机&还原—>Asuswrt-Merlin 固件—>Merlin固件 by tb 刷成梅林混血。

刷完后重启即可使用。

APP

可在 app store 上下载到华硕路由的 app,输入路由器的账号密码,在同一内网内能连上路由器进行管理。界面非常酷炫,强烈推荐。

安装软件

梅林混血固件内带了 koolshare 全家桶,在启用 jffs 后即可随意安装插件,但我对这些插件都不是很感兴趣,因此没怎么折腾。相反,我对命令行软件更感兴趣,比如 tcpdump、htop 之类的更感兴趣,为了避免自己编译,我选择了 entware-ng 。

entware-ng 是一个包管理工具+软件源,安装后可以直接通过命令一键安装常用工具。安装流程如下:

mkdir /jffs/entware-ng.arm
ln -nsf /jffs/entware-ng.arm /tmp/opt
wget -O - http://pkg.entware.net/binaries/armv7/installer/entware_install.sh | /bin/sh

echo "#!/bin/sh" > /jffs/scripts/services-start
echo "sleep 20" >> /jffs/scripts/services-start
echo "/opt/etc/init.d/rc.unslung start" >> /jffs/scripts/services-start
echo "#!/bin/sh" > /jffs/scripts/services-stop
echo "/opt/etc/init.d/rc.unslung stop" >> /jffs/scripts/services-stop
chmod a+rx /jffs/scripts/*

之后即可使用包管理工具 opkg :

opkg list
opkg install python3-pip
opkg remove python3-pip

重启后会找不到 bin 目录,需要再次执行:

ln -nsf /jffs/entware-ng.arm /tmp/opt

DNS 劫持

由于该固件自带了 dnsmasq,我们可以很方便地进行 DNS 劫持:

智能网络卫士 => DNS Filtering ,禁用 Enable DNS-based Filtering

内部网络(LAN) => DHCP 服务器,设置 DNS Server 1 为路由器地址,启用 Advertise router's IP in addition to user-specified DNS ,禁用 Forward local domain queries to upstream DNS

创建 /jffs/configs/dnsmasq.conf.add 文件,写入规则,如:

address=/Smartplugconnect.phicomm.com/192.168.10.250

这里将域名 Smartplugconnect.phicomm.com 解析到 192.168.10.250 。

生效:

service restart_dnsmasq

OpenWRT

总体来说,梅林混血还是非常好用的,但我却还是有些不满意:

作为卖点的 koolshare 全家桶,我却几乎用不到。唯一有一个比较有趣的插件 server 酱,能够监控设备的接入并进行微信推送。当我想去看源代码学习上如何实现时,发现它是闭源的,此时我才发现,所谓的 koolshare 全家桶都是闭源的,此后一直耿耿于怀。

最无法忍受的问题,断流。在我使用的一个月时间里,累计断了 3-4 次流,平均每周断一次,需要重启路由器才能恢复。搜索现象,发现论坛上很多人都反映有该问题,并认为是 k3 漏油导致。k3 漏油的问题在圈内早就家喻户晓了,由于使用了劣质硅脂垫,k3 在长期高温的情况下硅脂垫会析出油,流到主板上,大家都认为漏油是导致断流的主要原因,因此提出了取出硅脂垫后加主动或被动散热的各种方案。但我始终认为不一定是漏油导致的:一来如果是漏油导致硬件故障,那么重启应该无法解决;二来网上很多华硕自家路由器同样出现类似问题;三来是看断流时候的 kernel log::

Aug 27 04:49:33 rc_service: ntp 1108:notify_rc restart_upnp
Aug 27 04:49:33 miniupnpd[1113]: shutting down MiniUPnPd
Aug 27 04:49:33 miniupnpd[1146]: HTTP listening on port 46713
Aug 27 04:49:33 miniupnpd[1146]: Listening for NAT-PMP/PCP traffic on port 5351
Aug 27 04:49:34 rc_service: ntp 1108:notify_rc restart_diskmon
Aug 27 04:49:34 disk_monitor: Finish
Aug 27 04:49:36 kernel: IDPfw: TrendMicro forward module ver-1.0.34
Aug 27 04:49:36 kernel: IDPfw: Apply module param dev_wan=eth0
Aug 27 04:49:36 kernel: IDPfw: Apply module param sess_num=30000
Aug 27 04:49:36 kernel: IDPfw: Init chrdev /dev/idpfw with major 191
Aug 27 04:49:36 kernel: IDPfw: IDPfw is ready
Aug 27 04:49:36 kernel: sizeof forward param = 160
Aug 27 04:49:36 disk_monitor: be idle
Aug 27 04:49:37 kernel: JFFS2 notice: (507) check_node_data: wrong data CRC in data node at 0x01f47050: read 0x3829a09a, calculated 0xc2c94971.
Aug 27 04:49:40 rc_service: udhcpc 750:notify_rc start_firewall
Aug 27 04:49:40 dhcp_client: bound 192.168.1.4 via 192.168.1.1 during 86400 seconds.
Aug 27 04:49:41 miniupnpd[1146]: shutting down MiniUPnPd
Aug 27 04:49:41 kernel: D2H MsgBuf Failure:
Aug 27 04:49:41 kernel:   0000: 0a 00 80 00 fe ff 00 00 00 00 00 00 06 01 00 00
Aug 27 04:49:41 kernel:   0010: 00 00 00 00 b6 00 00 00
Aug 27 04:49:41 start_nat_rules: apply the nat_rules(/tmp/nat_rules_eth0_eth0)!
Aug 27 04:49:41 custom_script: Running /jffs/scripts/nat-start
Aug 27 04:49:42 miniupnpd[1554]: HTTP listening on port 60067
Aug 27 04:49:42 miniupnpd[1554]: Listening for NAT-PMP/PCP traffic on port 5351
Aug 27 04:49:54 crond[698]: time disparity of 1615489 minutes detected
Aug 27 04:50:05 admin: start
Aug 27 05:00:36 disk_monitor: Got SIGALRM...

发现好像是某个服务崩后拉不起来,google 了一番无果。因此我倾向于认为是梅林固件自身有缺陷。

怎么办,刷个别的,比如几年前折腾过的 Openwrt。我选择的是 https://github.com/coolsnowwolf/lede,该项目是在 LEDE 的基础上对斐讯家路由器进行了适配,同时项目一直很活跃,经过长期的维护相信也会比较稳定。

编译

项目的 README 里面已经写的很详细了:

  1. 首先装好 Ubuntu 64bit,推荐 Ubuntu 14 LTS x64

  2. 命令行输入 sudo apt-get update ,然后输入 sudo apt-get install build-essential asciidoc binutils bzip2 gawk gettext git libncurses5-dev libz-dev patch unzip zlib1g-dev lib32gcc1 libc6-dev-i386 subversion flex uglifyjs git-core gcc-multilib p7zip p7zip-full msmtp libssl-dev texinfo libglib2.0-dev

  3. git clone https://github.com/coolsnowwolf/lede 命令下载好源代码,然后 cd lede 进入目录

  4. ./scripts/feeds update -a ./scripts/feeds install -a make menuconfig

  5. 最后选好你要的路由,输入 make -j1 V=s (-j1 后面是线程数。第一次编译推荐用单线程,国内请尽量全局科学上网)即可开始编译你要的固件了。

唯一需要补充的是对于 k3 来说,第四步在 make menuconfig 时需要额外选择的选项如下:

  • target 选 Broadcom BCM47xx/53xx (ARM)
  • Target Profile 选 PHICOMM K3
  • Utilities 确保 k3screenctrl 选中
  • LUCI - Application 中取消掉无用的插件
  • LUCI - theme 选择想要的主题

编译后,在 bin/targets/bcm53xx/generic 目录下可以找到固件 openwrt-bcm53xx-phicomm-k3-squashfs.trx

刷机

这里我需要从梅林刷到 OpenWRT(LEDE),流程类似于前面刷官改。

  1. 除了 WAN 口接电脑外其他网线都拔掉,电脑上指定连接路由器网卡的 ip 和网关地址
  2. k3 断电后,捅住 reset 键上电进入 CFE 模式
  3. 此时 ping 路由器可以发现 TTL=100 ,用电脑浏览器访问路由器 ip 确保进入 CFE 模式
  4. 将固件放到 tftpd 目录,然后启动 tftpd,server address 选择相应的网卡
  5. 浏览器访问以下链接 http://路由ip/do.htm?cmd=flash+-noheader+本机指定的ip:/固件名称 ,如 http://192.168.10.1/do.htm?cmd=flash+-noheader+192.168.10.111:/openwrt-bcm53xx-phicomm-k3-squashfs.trx 。此时发现 tftpd 开始上传走进度条
  6. 此时 ping 路由器发现请求超时,等待直至再次出现 TTL=100 ,如果一直 ping 不同,考虑 ip 地址被重置的情况,尝试更换其他 ip 地址,如 192.168.50.1
  7. 访问 路由器 ip 确保进入 CFE 模式管理页面,依次执行 restore default NVRAM values 和 reboot
  8. 拔出网线,插到 LAN 口,记得重设电脑连接路由器的网卡的 ip 和网关地址,设置为 dhcp 获取即可
  9. 等待浏览器重启完成后,浏览器访问路由器地址即可进入 OpenWRT 的 luci 界面

此时刷机完成,随后要做的是修改密码、设置 2.4 / 5 G 名称、加密方式和密码、网络 - 接口 - lan 修改 ipv4 地址,改为想要的网段。

主题

刷完后一看,泪流满面,还是熟悉的 bootstrap 风格。我们可以给它换个皮肤:

opkg install luci-theme-material

DNS 劫持

和 梅林的设置方法有些许不同。需要在 /etc/dnsmasq.conf 加入:

conf-dir=/etc/dnsmasq.d

然后在 /etc/dnsmasq.d 目录下创建 conf 文件,如:

address=/Smartplugconnect.phicomm.com/192.168.10.250

保存后 service dnsmasq restart ,可能报错:udhcpc: no lease, failing,但已经生效,可以不管。

查看信号

不同于梅林用 iwinfo,其使用 iw dev

屏幕显示温度

修改 luci 的网页:/usr/lib/lua/luci/view/admin_status/index.htm

在 local rv 加入 temperature :

    local rv = {
        uptime     = sysinfo.uptime or 0,
        localtime  = os.date(),
        loadavg    = sysinfo.load or { 0, 0, 0 },
        memory     = meminfo,
        swap       = swapinfo,
        connmax    = conn_max,
        conncount  = conn_count,
        wifinets   = stat.wifi_networks(),
        temperature = fs.readfile("/sys/class/thermal/thermal_zone0/temp") / 1000 or 0
    }

js 部分加入:

            if (e = document.getElementById('temperature'))
                    e.innerHTML = info.temperature + " ℃";

html 部分加入:

<div class="tr"><div class="td left" width="33%"><%:CPU Temperature%></div><div class="td left" id="temperature"></div></div>

接入 homeassistant

OpenWRT 接入到 homeassistant 有两种 device_tracker,一种是 luci,另一种是 ubus。前者尝试后发现无效,抓包后发现虽然 HTTP 请求返回 200,但内容却为 method not found。

于是换用 ubus ,按照 文档

opkg install rpcd-mod-file

创建 ACL 文件 /usr/share/rpcd/acl.d/user.json ,内容为:

{
  "user": {
    "description": "Read only user access role",
    "read": {
      "ubus": {
        "*": [ "*" ]
      },
      "uci": [ "*" ]
    },
    "write": {}
  }
}

重启服务:

/etc/init.d/rpcd restart && /etc/init.d/uhttpd restart

检查 file 服务已注册:

# ubus list | grep file
file

homeassistant 配置如下:

device_tracker:
  - platform: ubus
    host: 192.168.10.1
    username: your-username
    password: your-password
    track_new_devices: True

结果发现依然失败,通过 url : curl --data-ascii '{"jsonrpc": "2.0", "id": 1, "method": "call", "params": ["00000000000000000000000000000000", "session", "login", {"username": "username", "password": "password"}]}' http://192.168.10.1/ubus/ -v 发现返回 404,google 给出的解决方案是安装 rpcd-mod-file :

opkg install rpcd-mod-file

安装后 homeassistant 成功连接路由器,获得设备在线状态。此时可以发现在 .homeassistant 目录下产生了 known_devices.yaml 文件,里面记录了所有在线设备的信息,如果不想跟踪某个设备(比如某些常驻设备),将其 track 设置为 false 即可。

后记

在刷完 OpenWRT 后,截止到目前为止,k3 拖着我手机电脑平板和五花八门的智能家居设备已经稳定运行了 19 天,其中 CPU 温度长期保持在 75 ℃ +,但依然工作良好。至此我对 k3 的折腾也告一段落。

如果让我给 k3 一个评价,那么如今我不会吝啬溢美之辞,在这个价位上,无论是设计、配置、做工都无可挑剔。当然了,漏油是 k3 一个不可回避的问题,但却不是导致断流的主要原因,因此建议大家刷 OpenWRT(LEDE),虽然没有梅林酷炫的界面和管理 APP,但稳定、生态完善,更适合 Linuxer 折腾。