当前位置

博客

关于路由器配置海内外流量分发

虽然搭树莓派的最初原因只是想使用 Google Home Mini,但这个跑起来后不可避免的就想用它来带其它设备上网,毕竟 iOS 装个 ss 客户端还是挺麻烦的不是?

研究一番,发现 tcp 流量分发异常简单

  1. sudo apt install ipset
  2. 然后创建中国地区的网络地址表,以及生成 ipset 的脚本;可以放在 cron 里每周更新一下
    • https://github.com/17mon/china_ip_list 下载来自 ipip.net 最专业的国内IP表
    • echo "ipset -N chnroute hash:net maxelem 65536">chnroute.sh; chmod +x chnroute.sh; for i in `cat china_ip_list.txt`; do echo "ipset add chnroute "$i >>chnroute.sh; done
  3. 每次启动系统的时候首先执行一次 chnroute.sh,最后在 iptables 设置 bypass 的命令中,增加如下一行
    • iptables -t nat -A SHADOWSOCKS -p tcp -m set --match-set chnroute dst -j RETURN

    现在可以访问一下国内的网站看看是否正确寻路出去了

看其它人的配置,往往还有 ChinaDNS 一项;仔细思索了一下它号称的原理,觉得从逻辑上投毒同正常业务的DNS海内外解析无法分辨的,如果仅仅依赖一个 chnroute.txt 完全做不到信任新浪的国内解析但不信任谷歌的国内解析。。。所以就不部署它了

Topic: 

树莓派做路由器 2018.03 (Part 3) Google 硬件(Home/Wear/Chromecast...)上网配置

前言:写于 2018.03,分成三篇blog,介绍为了在家里使用 Google Home Mini 而进行的一系列努力;
本文为第三部分,进阶路由配置,github 官方页面上相应的 iptables 配置已经介绍的很全面了;本文只描述几个特定的坑
第一部分:树莓派做路由器 2018.03 (Part 1) 最基础的Hotspot配置知识
第二部分:树莓派做路由器 2018.03 (Part 2) hostapd 和 RTL8188CUS 网卡,如何在 Raspbian Stretch/Kernel 4.9.x 下工作?

从源码编译 https://github.com/shadowsocks/shadowsocks-libev#linuxhttps://github.com/shadowsocks/simple-obfs 非常简单,毕竟树莓派系统是一个很完整的 Debian Stretch 变种,首先安装依赖的包,然后从源码 clone 下来按说明编译和配置即可

因为这个树莓派目的很简单,只是为了服务 Google Home Mini,不需要复杂的国内国际流量区分,所有流量统统全局路由出去;为了避免投毒只是简单的自己搭了一个 DNS 转发

  • ss-tunnel -c /etc/shadowsocks-libev/crown2.json -l 5353 -L 8.8.8.8:53 -u -f /var/run/ss-tunnel.pid
  • 如果是在 rc.local 里启动 ss-tunnel 可能出现启动不了的情况。参考 https://www.v2ex.com/t/348171 加上 "sleep 15 && " 解决问题

使用 dig www.youtube.com @127.0.0.1 -p 5353 测试一下

最后把 dnsmasq 作为真实 dns server,ss-tunnel 做 upstream,让 dnsmasq 做一层缓存;这样最终 /etc/dnsmasq.conf 配置如下

  • port=53
    no-resolv
    no-poll
    server=127.0.0.1#5353
    interface=wlan0
    dhcp-range=
    dhcp-option=option:router,192.168.x.1
    dhcp-option=option:dns-server,192.168.x.1

注意 dnsmasq 启动 DNS Server 之后,resolvconf 会自动将 /etc/resolv.conf 中的 nameserver 更改为 127.0.0.1

现在对于接入的其它设备比如 Amazon Echo dot 已经能成功接收来自 CNN/BBC 的新闻了;但对 Google 家族的硬件还不够。它不理会 DHCP 的 DNS-Server 配置,固执的使用自己的 DNS Server 进行解析

附录:在解决问题中发现的其它可能有帮助的链接

又附:本系列的后继 关于路由器配置海内外流量分发

Topic: 

树莓派做路由器 2018.03 (Part 2) hostapd 和 RTL8188CUS 网卡,如何在 Raspbian Stretch/Kernel 4.9.x 下工作?

注意:自从 Raspbian 更新内核到 4.14.x 后,下面说的方法已经不能用了,启动 hostapd 会报错;似乎 https://forum.odroid.com/viewtopic.php?f=146&t=29195#p209268 这里给了一个解法,测试中... 2018.06.07
前言:写于 2018.03,分成三篇blog,介绍为了在家里使用 Google Home Mini 而进行的一系列努力;
本文为第二部分,关于用 RTL8188CUS USB 无线网卡启动热点中的坑,使用 Pi 3B 的大可跳过这一部分;注意 RTL 8188/8192 系列USB无线网卡现在仅仅也就是日常可用而已,见最后 "Update"
第一部分:树莓派做路由器 2018.03 (Part 1) 最基础的Hotspot配置知识
第三部分:树莓派做路由器 2018.03 (Part 3) Google 硬件(Home/Wear/Chromecast...)上网配置

RTL8188CUS 是在 lsusb 里看到的名字,它和 RTL8192CU 用的是同一个驱动,8192cu.ko (https://wiki.debian.org/rtl819x#supported-rtl8192cu)

上文提到,AP 的工作原理是 hostapd + Kernel Driver 在数据链路层上同客户机通信完成身份认证;那么如果设备驱动没实现好、或者 hostapd 没有正确地和设备驱动交互都会导致同客户机的通信失败。
在 Raspbian Stretch/Kernel 4.9.x 里,Realtek 网卡驱动和 hostapd 都有问题!!下面是解决方案

  1. hostapd 无法同 Realtek 网卡驱动通信是老生常谈的故障了;当前最新的 hostapd 是 2.6,patch 方案参考 https://wiki.odroid.com/accessory/connectivity/wifi/wlan_ap
  2. 如果只配置一个无需密码的开放热点,现在光靠 hostapd 已经可用了;据说在老版本内核网卡驱动下,也能把 WPA2 热点跑起来。但恰恰就是我手里的 4.9.x 内核需要换掉驱动,以支持 WPA2 Hotspot
    • sudo apt install raspberrypi-kernel-headers dkms
    • git clone https://github.com/pvaret/rtl8192cu-fixes.git
    • vi rtl8192cu-fixes/include/rtw_version.h #提高版本号,否则 dkms install 有问题
    • sudo dkms add ./rtl8192cu-fixes

      Creating symlink /var/lib/dkms/8192cu/1.11/source ->
      /usr/src/8192cu-1.11

      DKMS: add completed.

    • sudo dkms build 8192cu/1.11
    • sudo dkms install 8192cu/1.11

      8192cu:
      Running module version sanity check.
      - Original module
      - Found /lib/modules/4.9.59-v7+/kernel/drivers/net/wireless/realtek/rtl8192cu/8192cu.ko
      - Storing in /var/lib/dkms/8192cu/original_module/4.9.59-v7+/armv7l/
      - Archiving for uninstallation purposes
      - Installation
      - Installing to /lib/modules/4.9.59-v7+/kernel/drivers/net/wireless//

      depmod...

      Warning: Unable to find an initial ram disk that I know how to handle.
      Will not try to make an initrd.

      DKMS: install completed.

    • sudo depmod -a
    • sudo cp ./rtl8192cu-fixes/blacklist-native-rtl8192.conf /etc/modprobe.d/

    重启系统

在我这里这样就一切OK;可能树莓派刚刚完成重启时去连接热点会出现密码不正确的响应——也许是 driver/firmware 还没有热身完毕?但等2-3分钟就正常了。本系列最后一篇介绍如何让 Google 系列硬件通过这个无线路由上网

附录:其它相关的链接

Update: 热点运行时间长了以后,还是会发生无法连接的情况。登录到树莓派上执行 hostapd 观察输出会看到 l2_packet_send - send: No buffer space available 这样的信息,卸载再重新装载 8192cu 就又好了;说明问题出在驱动,而不是 hostapd。网上搜了一下亦有其他人碰到问题,包括清华某哥们,因为驱动无人维护,似乎无解。简单应用重启即可,或者在 2018 年的今天去买个内核支持更完善、速度也更快信号更好的外设吧
https://github.com/pvaret/rtl8192cu-fixes/issues/85
https://github.com/tuna/collection/issues/73
https://github.com/tuna/collection/issues/79
https://github.com/tuna/collection/issues/103
https://gist.github.com/huiyiqun/9c9b00631768bc5b31971235462eba62

Topic: 

树莓派做路由器 2018.03 (Part 1) 最基础的Hotspot配置知识

Update: 2018.03.14 树莓派刚发布了 Pi 3 Model B+;强烈推荐替代 3
前言:写于 2018.03,分成三篇blog,介绍为了在家里使用 Google Home Mini 而进行的一系列努力;
本文为第一部分,树莓派硬件和OS基础信息等
第二部分:树莓派做路由器 2018.03 (Part 2) hostapd 和 RTL8188CUS 网卡,如何在 Raspbian Stretch/Kernel 4.9.x 下工作?
第三部分:树莓派做路由器 2018.03 (Part 3) Google 硬件(Home/Wear/Chromecast...)上网配置

  1. 硬件简介,购前须知
    下一代树莓派,也就是 Raspberry Pi 4 将在 2019 年或更晚发布。当前这个时间点的选择是淘宝购买全新的 Raspberry Pi 3,或者闲鱼上二手 Raspberry Pi 2 Model B
    【熟悉基础类型后将来可以再考虑 Raspberry Pi Zero W】

    二者的供电消耗可参考 http://www.pidramble.com/wiki/benchmarks/power-consumption

    • 简单总结一下:CPU 跑满会多消耗 330ma,再考虑到板载无线的功耗,所以三代最高支持2.5A的输入(官方建议至少用 2A 的电)
    • 跑个最基础的 Ethernet + Wifi 路由器估计 1A 的电流也够用了

    假定搭一个 NAS,都用上 USB 2.0 的最高带宽【参考 Pi 3 Model B+ 的benchmark 看起来是 300M】,1个SSD + 1个千兆以太 + 1个300M Wifi,对供电的要求可能还是蛮高的

    全新 Raspberry Pi 3

    • 更新、更快(CPU 运算能力比 2 代快了 50% 以上)
    • 内置 Wifi + Bluetooth;官方驱动支持,无线配置起来节省时间

    二手 Raspberry Pi 2 B+

    • 优点是功耗低
    • 缺点是配置无线可能有坑,很花时间;而且买二手有风险,占额外精力

    最低需要主机 + TF卡 + 双绞线(理论上也可以通过 Wifi 进行 headless 配置,但我没有尝试)
    正式在犄角旮旯里应用还需要外壳(考虑下载pdf打印一个纸外壳?)、散热片(或许还得有风扇)、2A直流电源

  2. 操作系统,Configuration headless(without keyboard/mouse/monitor) 怎样在没有连接键鼠显示器的情况下配置树莓派
    从官网下载,选择 RASPBIAN 而不是 NOOBS;Raspbian 基于 Debian,当前是 Stretch(Debian 9);网络上有些文档可能是基于 Jessie 甚至 Wheezy 的,照搬需谨慎

    2017-11-29-raspbian-stretch-lite.img 解开后1.73G,相比 full version 少了桌面环境
    烧好之后,插入 TF 卡,把以太口插到交换机上就能自动从 DHCP 获得IP【或者写入Wifi的配置文件,启动后通过无线路由获得IP】
    然后我们从 ssh 登录进去,用户名 pi,密码 raspberry

    Windows 工具

    • SD Card Formatter
    • Etcher

    烧录 img 到 TF 之后,Windows 下将变成两个盘符,其中分区名为 boot 的可访问,需要在这里

    • touch 一个名为 ssh 的文件(据说 ssh.txt 也行)

    启动进程:

    • 如果 boot 分区存在 ssh 文件则 enable SSH
    • 如果 boot 分区存在 wpa_supplicant.conf 则复制到 /etc 配置目录去启动无线连接
    • 最后自动从 boot 分区删除这两个文件 【再次重启 ssh server 也是启用的】

    【极端情况下没有路由器,通过电脑直连网线到树莓派以太网,则可通过 boot 分区里的 cmdline.txt 指定以太口的 IP】

    至于启动后如何得到 headless 系统的 IP,网上有许多教程,包括官方文档 https://www.raspberrypi.org/documentation/remote-access/ip-address.md

    换一下 apt 镜像源,我这里主要是 archive.raspberrypi.org 慢,替换成中科大的源
    sudo apt update
    sudo apt upgrade
    sudo raspi-config 进行系统配置【如果是通过键盘显示器登录,需要用这个命令调整官方缺省的大英键盘布局——比如美版键盘的管道符 | 就敲不出来】

  3. 网络配置 of Stretch,以把 wlan0 配置为 AP 模式启动热点为例
    Stretch 不再用传统的 /etc/network/interfaces 文件管理网络接口,而是使用 dhcpcd 来维护配置
    修改 /etc/dhcpcd.conf
    • 文件第一行增加
      nohook wpa_supplicant【假定系统不用向上级联无线路由器,Hotspot Only】
    • 文件最后增加
      interface wlan0
      static ip_address=192.168.x.1

    sudo service dhcpcd restart

    这时候 wlan0 的 IP 并没有立刻设置;执行 sudo journalctl | grep wlan0 查看日志,可以看到 wlan0: waiting for carrier;
    sudo apt-get install hostapd
    等配置并启动 hostapd 之后,wlan0 的 IP 就被 dhcpcd 设置上了;日志能看到 wlan0: carrier acquired;手机端也能看到这个建立起的热点

    AP 热点的工作原理是路由器(hostapd+Kernel Driver)同客户机在数据链路层上通信完成认证,认证通过后可以认为把一根虚拟网线插到了路由器上
    接下来安装 dnsmasq(可以只启动 dhcp server,不启动 dns server) 给接入的机器配置 IP、DNS Server… 配置同普通的 Debian 没啥区别了

    • port=0【简单配置可不启动DNS能力】
    • interface=wlan0【系统启动的时候可能wlan0还不可用,只有指定才不会出错】
    • dhcp-range=你的IP地址分配范围
    • dhcp-option=option:router,192.168.x.1
    • dhcp-option=option:dns-server,114.114.114.114【下面会介绍进阶配置,避免投毒】

    最后是把 NAT 路由跑起来

    • 开启转发
      在 /etc/sysctl.conf 最后追加一行 net.ipv4.ip_forward=1
      sudo sysctl -p
    • 建立 iptables 路由规则
      sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
      sudo iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
      sudo iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT
      想办法让每次系统重启后自动执行

hostapd 启动 0bda:8176 Realtek Semiconductor Corp. RTL8188CUS 802.11n WLAN Adapter 作为 AP 有巨坑,很不幸现在网上随树莓派二代销售的最常见的 EDUP 网卡就是这个型号。经过一番努力,终于让它在我的环境里运行了,请看下一部分

Topic: 

2017年邱小达

有时候真觉得她是一个很乖的孩子

怎么定义“乖”呢
我觉得是父母子女能达成默契,这种默契随着孩子成长,级别和需求都在随时变化。好比她小时候,冬天抱着她在外面走,要是风很大,我会解开外套扣子,让她离我更近,她也会开心的主动去寻求和响应这点温暖。现在她会晚上睡觉前主动把 iPhone 交给我,大意是你们不用担心我晚上看手机不睡觉(也承认自己没有什么自制力),但我知道爸爸第二天会在上学路上把手机给我,20分钟时间里听听 Apple Music,看看同人。

我觉得这就很乖了,老怀甚慰

还有就是在 2017 年,她成了北航附中初三800m最快的女生,中长跑最能跑的女生。都是我和她一起练出来的;我严肃制定训练计划,她也努力完成我的要求。全家共同的成果,真开心

伟大的时刻总发生在阳光灿烂的日子。有天我们趴着很近,各看各的屏幕,阳光照射进来,觉得这一刻好像以往她小时候的某些凝固片段,可待未来追忆

希望 2018 她中考顺利,一起努力吧!

Topic: 

谁能干掉微信?

呵呵,标题党一下。微信对我来说就是多媒体短信工具和支付工具,公众号很少地关注了几个,朋友圈几乎不看。

去年见识了两个很火的设备。一个是微软的 HoloLens,一个是亚马逊的 Echo dot(其实主要是里面的 Alexa 智能助手)。HoloLens 的语音从头箍中输出,不需要戴上耳机效果也很好,Alexa 在语音开关灯、搜歌听音乐这些场景也很实用。

如果有一个类似 HoloLens 的头箍部分的设备,能进化到一个比较美观实用的样子,实现语音的输入输出,把这个设备蓝牙连上手机里的 Alex,那么脑洞就可以开了:
比如我想给 qyb 发条音频“微信”,我说:“Alexa,给 qyb 发语音‘微信’,明天中午一起吃饭。”
qyb 头上戴的“发箍”一震,传出“收到 qyt 的‘微信’”,qyb 说:“Alexa,读一下 qyt 的‘微信’”。
然后 qyb 就听到了我说的话,接着说“Alexa,给 qyt 发文字‘微信’,好的,明天中午 12 点老地方见。”
Alexa 先有一个反馈来确认语音正确识别为文字,“请问您的‘微信’内容是‘好的,明天中午 12 点老地方见。’?”
qyb 确认:“Alexa,是的”。于是我就收到了这条文字微信,当然我会让 Alexa 给我读出来,不会傻傻地掏出手机看。

如果这个流程顺畅,我看不出我有什么道理使用微信目前对我来说的文字或语音的短信功能?当然我还是要用微信,因为在这个工具上没有我的好友,这是腾讯最高的城墙,最深的护城河。但我认为这种设备是大家真正需要的可穿戴设备,以后一定是会出现的(骨传导耳机淘宝上有很多,虽然 HoloLens 用的似乎不是骨传导技术),它可以干很多很多事,比如记个备忘录设个提醒任务之类的,这些都是小儿科。如果腾讯自己不推出自己的“Alexa”,也一定需要让微信支持 Alexa/Cortana/Siri/Google Assistant 之类的智能助手。如果无视这个潮流,当人人都有一个“发箍”的时候,在手机上操作的微信一定会被别的应用取代。什么?你说微信支付、公众号、朋友圈?当一个公司有了人际关系自然就有了钱,有了钱就有了一切,腾讯不就是这样走过来的么?

当然,目前我觉得最大的可能是腾讯推出自己的“Alexa”(阿里刚出了一个智能音箱)。如果这个系统级、生态级的东西搞不出来/搞不起来,当发现事不可为,而 Alexa/Cortana/Siri/Google Assistant 等等渐渐壮大,相关的个人可穿戴设备市场上越来越多,腾讯会退而求其次把微信做成这些智能助手的应用。要知道亚马逊今年春天已经在 Echo 上推出了Calling and Messaging 服务,这两天又推出了一个叫做 Anytime 的即时通讯应用,等到亚马逊推出可穿戴版的 Echo 设备,Facebook、Snapchat 等等就要小心了。

最可悲的事是 Alexa/Cortana/Siri 将来被墙在外面(Google Assistant 不说了),中国公司又没有类似的平台,大家依然开心地用手机玩微信,中国与世界渐行渐远。。。

Topic: 

移动设备中Webview的点击延迟问题

是一个老的事件了,但这里记录一下

Android 上的 Chrome/Webview 很早就搞定了这个事情
https://developers.google.com/web/updates/2013/12/300ms-tap-delay-gone-away

iOS 上的 Safari/WKWebview 要等到 iOS 9.3 才据说修补完毕,一年前的事情
https://webkit.org/blog/6008/new-web-features-in-safari/

其它相关连接
https://webkit.org/blog/5610/more-responsive-tapping-on-ios/
https://trac.webkit.org/changeset/191072/webkit
https://bugs.webkit.org/show_bug.cgi?id=149968
https://bugs.webkit.org/show_bug.cgi?id=149854

期望 Mobile Web App 能将来做到更多

Topic: 

crosswalk 即将停止更新

4天前的博客说:crosswalk 23 将是最后一个发布版本 https://crosswalk-project.org/blog/crosswalk-final-release.html

特别惊讶 Intel 的工程师们把这样一个开源项目驱动了4年之久,它的终结也早有预感,看着 mail-list 里面的信息越来越少,发布进度也越来越落后于 chrome 的 6 周更新的节奏

crosswalk 23,是基于 chrome 53 的版本。谷歌是去年9月初正式发布,crosswalk 23 落后了几乎5个月时间

从 crosswalk 已经具备的能力而言,2017年,甚至2018年来陪伴中国安卓 PWA 开发者都不成问题。感谢 Intel

希望 Google Play 早日入华,希望 webview 组件定期更新能成为每台安卓手机的标配

又或者,希望有类似组织能接手 crosswalk 的任务,目前看也就小米或者华为可能来做这件事了!

Topic: 

Apple/Microsoft 的字体问题

研究这件事起因于希望在 Windows 的浏览器上使用 Apple 原生的 Emoji 表情,但是从 Mac 的 /System/Library/Fonts/Apple Color Emoji.ttf 拷贝到 Windows 上后无法被安装。。。于是看了一下究竟怎么回事,虽然问题最终没有彻底解决,但记录一下相关的信息:

  1. 不同于矢量轮廓描绘,Emoji 在实际应用中是以彩色图案的形态存在,尤其是Unicode后来引入皮肤颜色变化,就需要一套新的字体方案
  2. Apple 自己定义了 ttf 中的 sbix 扩展,用嵌入 PNG 图片的方案来取代轮廓描绘;后来 Google、Microsoft、Adobe/Mozilla 也先后定义了自己的 ttf 扩展方案,最后似乎都成了标准的一部分,探索在Android中使用Emoji Font的方法
  3. Adobe/Mozilla 的方案叫 SVG,或者 SVGinOT(opentype);上文提到 Google 的方案类似 Apple,也是 PNG内嵌
  4. 相对来说 Microsoft 的方案更有特色一些,它是用轮廓+调色板渲染的方式实现了 Color Emoji,思路清奇
  5. 按照微软的说法,Windows 10的最新版应该是能支持上述所有的4种字体的,https://msdn.microsoft.com/en-us/library/windows/desktop/mt765165%28v=vs...
  6. 但是浏览器有一点点特殊的地方,它还有 webfont 的支持问题。于是有一个网站可以用来检查浏览器对 webfont 的支持情况:https://pixelambacht.nl/chromacheck/ Windows10上的Edge是4种都支持,但 Chrome Windows 版本就仅仅支持微软自家的Color Emoji
  7. 怎么样替换 Windows 缺省的 Color Emoji 字体呢? http://superuser.com/questions/1062418/how-do-i-replace-windows-10s-emoji
  8. 怎么把 Apple Color Emoji 转换成 Google 格式呢(这样在 Android 和 Chrome/Linux 上就都可用了)?上面中文文档里链接了一个 xda 上的文章,提到了方案:http://forum.xda-developers.com/showthread.php?t=2563757 , 现在再看这个方案,作者说最新的 Android 系统可以直接使用 Apple 的 sbix 扩展了。。。所以我猜最新的 Linux Fontconfig 或许也能支持 Apple Color Emoji.ttf 了
  9. 但如何在 Windows 上直接把 Apple Color Emoji 转换来用上述信息还是没有解决,最终找到了两个平台上ttf格式兼容的另外一篇文章:CMap 表相关修改技术简要指南。。。看似说的很有道理,但是按里面的方法去修改重新合版仍然没有得到想要的结果
  10. 最后找到一个商业的解决方案,fontlab.com 的TransType,在 Windows 下还确实把原字体转成了两个能正常打开的字体,但是限于时间,暂时没有进一步去测试 Windows 上安装了字体后浏览器上的表现...
Topic: 

查看服务器端的 RSA 公钥指纹

话说以前碰到过一次 ssh 劫持,访问某个缓存过对方公钥机器的时候,仍然弹出一个公钥指纹确认的提示,当时没多想,就直接确认,输入用户名/口令,认证失败;猛地反省过来,急忙换了个渠道登录,把所有相关的用户名/口令对都更改了一遍。。。真是惊出一身冷汗

今天换了一台新机器登录,想到这个茬,于是乎特意找了个命令:

  1. # ssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pub

在服务端先查看一下指纹是啥,然后客户端这里首次连接的时候再确认一下

====
更新,新版本的 ssh-keygen -lf 缺省输出的是 sha256 格式的指纹,如果想看 md5 的输出需要加上 -E md5
另外,也许算法不是 rsa ,而是 ecdsa 之类,寻找对应公钥文件的时候注意一下

Topic: 
订阅 RSS - 博客