斐讯 K2 的不死鸟刷机-科学上网和广告屏蔽

无线路由器刷机的核心需求是科学上网和广告屏蔽,同时一定是为局域网内,整个家庭或者小型办公室使用。我们用 SS-libev + polipo + wpad 的方案实现了客户端的无感“上网”

心急要吃热豆腐的,请直接拉到文章底部,看大总结

不死鸟指的是 Breed Boot-Loader 引导固件,和我们要刷机的操作系统固件不是同一个东西。本文假定你已经刷好了 Breed,就是下面的这个截屏。

假定你已经刷好了 Breed 不死鸟,然后你就可以无限制的刷各种操作系统,不喜欢老毛子就刷 OpenWrt/LEDE,也可以刷梅林。 系统启动不了,就换一个再刷。

刷操作系统的办法很简单,把 PC 电脑的网线直接连接 K2 的 LAN 口, K2 的 WAN 口连接到能上网的路由器的 LAN 口(也可以不连),PC 电脑的 Wi-Fi 连接能上网的 SID,如果 DHCP 有冲突的话(一般肯定会冲突,PC 的有线会拿到 192.168.1.2,无线会拿到 192.168.1.3),可以设置 Wi-Fi 为能上网的 VLAN 里的静态 IP,设置好网关和 DNS ,保证刷机中的电脑能同时上网。当然也要保证能上网的无线环境里使用的不是 192.168.1.x 的网段。

斐讯 K2 是 MT7620A 的 CPU,主频是 580MHz,内存是 64M,Flash (可以理解为是电子硬盘)只有 8M。也就是说,我们要把操作系统放到只有 8M 的 Flash 里。

现在是选择合适的操作系统,刷机了,点 “固件更新”,选择“固件”,从 PC 上选择固件的文件。


我们选择老毛子的固件: RT-AC54U-GPIO-1-PSG1218-64M_3.4.3.9-099.trx

刷新完成后,去 Windows 的网络,查看有线网卡拿到的 IP 地址,如果没有拿到,可以重新插拔网线或者重启 K2,如果还是没有拿到 IP 地址,那就重新刷(不用怕)。你总是可以拿到 192.168.1.2 的 IP 地址的。

譬如刷的时候选择了错误的 Flash 布局(应该选公版),刷完后,PC 报告网线没有连接,说明 K2 根本就没有启动,不用怕, 重新插入电源线的同时按住 reset 10秒左右放手,192.168.1.2 又回来了。

我们换一个官方的 OpenWrt Snapshot 版本刷一下,固件文件是 openwrt-ramips-mt7620-phicomm_psg1218a-squashfs-sysupgrade.bin

刷完后,因为我们刷的是 snapshot 版本,所以不带 web 界面,我们只能 ssh root@192.168.1.1 (没有密码),就可以进入 OpenWrt 的 console 了。 用 opkg 命令就可以安装 web 界面

OpenWrt Snapshot 版本 比较适合有一定 Linux 基础和网络基础的大咖玩,基本都是需要自己琢磨,自己定制,而且最坑的是 8M 的 Flash 实在太小,老毛子从内存里挖了空间给操作系统使用,把配置保存到NVRAM(掉电能保留),然后下次重启又从网上下载 /opt 下的内容,恢复配置,基本原理就是这样,都是为了解决只有 8M 的痛苦。

在详细阐述老毛子 Padavan 之前,我们刷一个梅林,其实是华硕的一个自定义版本,看下界面。 固件文件名:RT-ACK1_K2_3.0.0.4_380_8228-g3af35f9.trx,大小 6.18M

刷完梅林,PC 拿到的地址是 192.168.1.112,网关还是 192.168.1.1,我们在浏览器输入 http://192.168.1.1/ 就看到梅林的界面了:

如果这个时候 WAN 口连接了能上网的路由器的 LAN 口, K2 就能自动上网了, 连接在 K2 LAN口的 PC 自然也能通过有线上网了, 配置好密码和无线后,会自动检测到有新的固件,然后选择自动升级固件。也就是说 K2 是和华硕的 AC54U 是完全兼容的。

梅林的这个固件连 telnet 设置允许也报错,界面也没有 ssh 登录的设置,其实和普通的路由器没啥区别,不建议刷。

回头再说老毛子,刷完老毛子后,有线网卡拿到的是 192.168.123.x 的地址,网关是 192.168.123.1 ,在浏览器输入 192.168.123.1 ,弹出窗口输入用户名和密码都是 admin

真心讲,里面设置 SS 的界面太复杂。

由于我们的境外服务器开启了 kcptun,所以尝试把里面的 kcptun 打开,然后 SS 走 kcptun,发现小小的 64M 内存根本就不够用,就连 nslookup 也返回一些莫名其妙的地址。

可以说, 整体的老毛子固件在 K2 这台小机器上捉襟见肘,根本就无法有效的开启里面的诸多功能,特别是核心的 SS 功能(带 KCPTUN)。

在开启 Adguard Home 做广告屏蔽的时候,如果是 nslookup 一个屏蔽的域名, DNS 查询极其缓慢。 我们回头在 x86_64 的 Ubuntu 虚拟机平台上来评估 Adguard Home。 现在让我们把 K2 切换到一个旧的OpenWrt 固件,也就是刷机自带 Web 界面的固件。

我们去 OpenWrt 的硬件下载列表,搜索 PHICOMM ,K2 PSG1218 就是我们要找的,写稿时的最新版本是 18.06.5 。刷完以后,浏览器访问 192.168.1.1 ,用户名 root ,密码为空, 也可以命令行直接 ssh root@192.168.1.1 登录 OpenWrt 。

Web 界面是这样子的:

和老毛子不同,这里有另外一个坑就是根文件系统只有 3.8M 空余了,几乎不能安装什么大的软件包了。 如果要安装广告屏蔽,要安装 VPN ,要安装科学上网,几乎是不可能的事情。

但是,中文界面总是需要安装的,运行:# opkg update; opkg install luci-i18n-base-zh-cn,刷新 Web 界面,我们就看到中文了。如果还没有的话,去顶上 System 菜单,下拉,选择 System,选择 Languange ,看看是否有中文。

搞完了以上的事情, 只是一个基本的无线路由器的设置,和上面提到的梅林以及其他任何不能刷机的路由器买来的功能是差不多的。只不过多了能直接 ssh 进入操作系统修改。

最核心的就是要科学上网,本身就要好多种不同的技术,从最原始的 SS 版本, 到国人后来开发的 SSR (加了混淆),到一个 SS-libev(适合嵌入式,例如路由器)的版本,到后来 KCPTUN 底层 UDP 协议加速,到其他各种加速方案,到后来V2RAY 用 vmess 协议。但是盒子太小,各种进阶方案对内存的要求太大。

让我们先从相对比较小占用资源的 libev-local 开始,运行
# opkg install shadowsocks-libev-ss-local luci-app-shadowsocks-libev

安装完以上两个软件包后,我们还有 2.9M 的磁盘空间,刷新Web 页面,可以看到多出一个服务菜单,下拉以后可以看到 SS-libev 的配置。我们只安装了 ss-local,因此,我们就去配置 ss-local 这部分,先去 Remote Servers 添加墙外的服务器信息(墙外怎么搭 SS-libev 服务器就不展开了),千万不要忘记把那个“禁用”的勾去掉。保存并应用后去修改 “Local Instances”,其实啥也不用做,因为直接选默认就可以,也就是侦听在所有网口上的 1080 socks5 标准端口。启用这个 ‘local instance’。进入 Firefox 浏览器,选择 socks5 代理,配置 192.168.1.1 1080 端口,如果能访问 Google , 那就是科学上网成功了。 这个无线路由器后面的任意设备,只要设置好 socks5 代理服务就可以上网了。


以上介绍的是 SS-libev。 我们尝试一下 V2ray 。Github 上把这个 12M 的“大家伙” 下载到 PC 端,然后从 OpenWrt 上把文件 scp 到 /tmp 下, 尝试用 opkg install v2ray-core_4.21.3-1_mipsel_24kc.ipk , 显然由于根文件系统只剩余 2M,根本就是徒增烦恼!

接下来我们尝试安装 kcptun 的客户端,去 github 下载 mipsel_24kc 版本,2.39M,看上去还能放到我们的 Flash 里,但是安装到一半还是说磁盘空间不够啊!

接下来,我们尝试用ram-root 的一个工具,利用 NFS 服务器来扩充根文件系统
# opkg install kmod-fs-nfs kmod-fs-nfs-v4
配置好 /etc/ram-root/ram-root.cfg 里面的 NFS Server 信息

可以看到根文件系统有 10M 了, 我们就可以安装 kcptun 了。安装结束我们发现根文件系统使用了 6.8M,很明显这么大的一个东东是不可能全部放到 8M 的 Flash 里的。 因为在家庭环境里, 我们不可能去挂接一个 NFS 哪怕 CIFS 上一个 Windows Share 都不太可能,这就是为什么老毛子采用了 optware,从内存里挖出空间给 root,然后每次启动都要从网上重新下载一堆软件。

为了简化客户端需要设置 socks5 的步骤,我们安装一下 polipo 这个 socks5 转 http 的代理软件:
# opkg install polipo luci-app-polipo luci-i18n-polipo-zh-cn
刷新 K2 的 Web 界面,我们可以在服务下看到 polipo 的配置,配置上游服务器为 127.0.0.1:1080 保存并应用,我们去 Firefox 设置 http 代理为 192.168.1.1 8123 去掉原先设置的 SOCKS 代理配置

Polipo 的 Web 界面设置实际上是有问题的,我们需要手工做几步动作,上游服务器的配置是 socksParentProxy 和 socksProxyType,这个需要用 uci 命令或者直接编辑 /etc/config/polipo 配置文件解决。底下大总结里详细介绍。

然后打开 http 代理, 不能解决 DNS 解析被墙的服务器的问题,因此我们需要安装 DNS 加密服务:
# opkg install libustream-openssl dnscrypt-proxy luci-app-dnscrypt-proxy
安装完毕后,会自动配置 dnsmasq , 转发到 5353 端口。
这一步很关键,如果这一步搞错了, 会导致 K2 无法连接网络,因为 DNS 解析出错了, 其实你也可以手工修改 /etc/resolv.conf 文件, 把 nameserver 从 127.0.0.1 修改为譬如 114.114.114.114 即可恢复网络,后面重启路由, nameserver 会自动更新成 127.0.0.1 的。

我们去”系统”=》“启动项”把 dnsmasq 重启一下。

接下来我们添加一个 wpad ,就是 Web Proxy Auto Discovery,我们需要添加一条wpad 的主机名记录,指向 路由器的 LAN 地址,就是 192.168.1.1 ,然后把外部生成的一个 wpad.dat 文件拷贝到 /www 目录下,然后去 Firefox 或者 IE ,或者手机端 Wi-Fi 连接后,把代理修改成自动发现即可。

IE/Chrome 的配置:由于 uhttpd 不支持 mime type 的问题,这里的“自动检测设置”截屏是错的,在 K2 上无法使用。要使用下面的这个正确的截屏。

左侧为错误的截屏,正确的设置是下图

iPhone Wi-Fi 的配置:点击连接上的 Wi-Fi 的右边 i 那个标记,进入详情,拉到最底下,点击进入配置代理,把“关闭”,设置成“自动”,然后返回就可以。截图里的 IP 不是本演示的 IP ,请忽略。同样的因为 K2 上 uhttpd 原因,iOS 上配置自动代理,还需要输入 wpad.dat 文件的 URL.

那么这个 wpad.dat 文件怎么生成呢? 网络上有一个 Python 写的 genpac 的脚本,会自动下载 gfwlist ,然后生成符合要求的 proxy 代理 js 脚本。语法如下:
# genpac –pac-proxy ‘PROXY 192.168.1.1:8123; HTTPS 192.168.1.1:8123; SOCKS5 192.168.1.1:1080’ -o wpad.dat

其实 DNSCrypt-proxy 还有黑名单功能,能过滤广告和恶意网站。上面列出的一个专门为中国用户的项目比较好。运行其中的 .sh 脚本就能自动生成配置文件。

通过以上步骤,我们就把一台只有 8M Flash 的斐讯 K2 刷机成为具有科学上网,广告过滤核心功能的强大路由设备。

大总结

K2 甚至包括所有市面上 1000 元以下的无线路由器,基本只能涵盖50人以下的使用,K2 的能力不会超过 20人同时使用。所以基本上我们介绍的解决方案仅仅用于家庭和小企业的上网使用。对于几十人甚至上百人的企业的上网需求,我们可以采用高可靠的免费集群解决方案,把路由和代理等功能,可以通过 OpenWrt 或者 Ubuntu 或者其他 Linux/BSD 兼容的操作系统,为企业员工提供强大的,安全的,可靠的,带有广告稿屏蔽功能的网络连接,让企业员工专心工作,不为广告所打扰。

以上的步骤其实有点繁琐,还介绍了其他和 OpenWrt 不相关的一些内容。我们写了一个简单的部署脚本放到了github,希望能帮助到您。

上面提到的 polipo 的上游 socks5 服务器的配置,需要用 uci 命令来完成,我们都已经写在脚本里了。脚本本身都有比较详细的注释,刷机愉快!

后记:一些技术性的 Troubleshooting 的技巧。盒子上的工具都比较弱,不像 X86 的机器上,可以安装很强大的工具,但是一些基本的命令,我们还是需要了解的。

  • nslookup 是一个改装版,只有 nslookup 主机名 这个语法,用来检查盒子是否能解析域名
  • ps 最应该需要知道的查看进程的东东,不需要加任何参数就可以,其实 Web 端也可以看所有进程列表。dropbear 就是 sshd , odhcpd 就是搞 DHCP 的, uhttpd 就是 Web 界面, udhcpc 是盒子本身作为 DHCP 客户端,例如 PPPOE 拨号从ISP 处取地址, ntpd 是时间服务,就是对时间的, polipo 就是 http 代理, dnscrypt-proxy 就是 DNS加密的, dnsmasq 是最核心的做 DNS 解析的服务,并对 LAN 提供 DHCP 服务, ss-local 就是科学上网的进程,对 LAN 提供 SOCKS5 服务。
  • netstat -nlp 这个就是查看端口侦听情况的, 53 端口就是 dnsmasq , 5353 端口就是 dnscrypt-proxy 启动的, 8123 端口就是 polipo , 1080 端口就是科学上网

浏览器调试一定要使用 Firefox,可以先从 socks5 手工代理,看看 192.168.1.1 1080 时是否可以 Google,如果可以,说明科学上网已经成功,再配置自动代理,设置 URL, http://192.168.1.1/wpad.dat 看是否可以,如果可以,那就是成功了!

其他可能的错误就是 IPv6 的问题, 把客户端和网关上的 IPv6 都关闭看看。

云端安装 HTTP 代理 clash 解决后端连接境外网站缓慢的问题

clash 是用 Go 语言写的一个全面的代理服务器,支持多种代理协议。理论上也是一个很好的代理转换工具。假定我们在云端已经安装了一个 v2ray 的 socks5 服务。v2ray 本身是不提供 http proxy 的,但是在我们某些软件的配置,只能使用 http 代理,这个时候,我们就必须使用 clash 来对付了,理论上,如果我们使用了 clash,就可以放弃使用 v2ray 客户端了, 因为 clash 也是支持 vmess 协议的。

这里我们假定 clash 继续使用 v2ray 的本地 socks5 服务,由 v2ray 实现和境外服务器 v2ray 服务的对接。

去 clash github 官网下载最新版本的 release, .tar.gz 解压。 chmod +x ,并把文件移动到 /usr/bin/clash , 创建 /etc/clash 目录,编辑里面的 config.yaml 文件如下:

把 clash 添加为服务,编辑 /lib/systemd/system/clash.service 如下:


然后systemctl daemon-reload; systemctl –now enable clash; systemctl status clash 查看进程状态。
校验是否能访问 Google:
# https_proxy=127.0.0.1:8888 curl -kIsS https://www.google.com/ 看是否能访问 Google 就可以了。

clash 有很多玩法, 这里只是最简单的一个本地 socks5 代理转化为 http 代理的一种方式, tinyproxy 是不支持后端 socks5 的, polipo 虽然也支持, 但是这里写 clash 的目的其实是想在服务器上只安装一个 clash 服务, 去掉 v2ray。

另外, v2ray 也支持 mKCP 协议, 把原先的 tcp 转化为 UDP, 具体就是 v2ray 客户端的配置里,在 outbounds 的 settings 后面添加 streamSettings,当然服务器端是在 inbounds 做对应的配置。

上海电信网络接入终端数限制-光猫桥接

这件事情折腾了一段时间,总算搞定了。 虽然有技术的问题,但是主要还是电信那头的事情,没搞明白。

这个问题是为了解决 电信运营商 对上网终端数量的限制,我们后面做实验, 要接 n 多台虚拟机,由于终端数量的限制,导致新开的虚拟机经常不能上网。只能通过重新启动光猫解决。

上网搜了一下,大概的方式就是把光猫设置到桥接模式。 需要一个 telecomadmin 账号的密码, 这个密码, 可以管安装的师傅要。 网上有说自己拆光猫,插一个 USB 转接口,用 get dmconfig 之类的命令取,感觉复杂了一点。

登录进入后,进入 网络-》网络设置,下拉选择 2 开头的连接名称,记录 ad 号码,修改成桥接模式。

其他啥也不用修改。进入到自己的无线路由器,和以前配置 PPPoE 拨号一样,输入 ad 账号以及密码(管客服要这个密码), ad 号其实在修改光猫配置前默认是路由模式,就显示在那里的。


这样子, 就绕过了电信光猫对终端数量的限制。

题外话: 另外可以通过 Linux pppoe 拨号
在 Ubuntu 上 运行 pppoeconf , 根据提示输入 PPPoE 拨号的用户名和密码就可以配置,其他相关的几个命令:

pon dsl-provider
plog
ip addr show ppp0
poff 挂断