技术

手动编辑 PEAP 认证所需要 wpa_supplicant 配置内容

参考 https://eparon.me/2016/09/09/rpi3-enterprise-wifi.html

最核心的工作:

echo -n 'password_in_plaintext' | iconv -t utf16le | openssl md4
history -d num 保持安全

配置文件内容见下:我司的 Phase 2 authentication 认证用的是 MSCHAPV2/无证书,请酌情修补

country=CN
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
ssid="SOHU.COM-2.4G"
priority=1
proto=RSN
key_mgmt=WPA-EAP
pairwise=CCMP
auth_alg=OPEN
eap=PEAP
identity="qiuyingbo"
password=hash:XXXXXXXXXXXXXXXXXXXXXX
phase1="peaplabel=0"
phase2="auth=MSCHAPV2"

}

Topic: 技术

RTL8188CUS 网卡在树莓派 Raspbian Stretch/Kernel 4.14.x 中的情况

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

三个月之后,随着 Raspbian 把内核从 4.9.x LTS 升级到下一个 LTS 4.14.x,麻烦又来了
在这三个月里又断断续续尝试了 Pi Zero W(有内置的 BCM 无线网卡),以及 Ralink 的 RT3070 USB 网卡等,当前的结论是:
a. RT3070 做 AP 最稳定
b. Pi Zero W 的内置无线网卡能用,网上甚至有让它同时做 STA + AP 的例子,但兼容性不那么好,无法支持 chromecast 的 chrome tab 串流

c. RTL8188CUS 在 4.9.x 下尚能较稳定的工作,但到了 4.14.x 下还需要摸索摸索

  1. 内核主线里有一个 rtl8192cu 的模块,来自 realtek 的驱动源码
  2. 后来主线里又有了一个 rtl8xxxu 的模块,似乎是 realtek 自己不用心维护驱动,所以社区社区自己开干。据说这个还是靠谱的,但——直到目前还没有缺省支持 0bda:8176 (需要编译时额外增加 UNTEST 选项),以及还不支持 AP Mode
  3. 为了解决 rtl8192cu 的问题,所以有了 https://github.com/pvaret/rtl8192cu-fixes.git 项目,它编译后的模块名改成了 8192cu 以避免和主线冲突;至少直到 4.9.x 内核,还是能和 hostapd patch 后的 rtl871xdrv 一起愉快的工作
  4. 但是到了 4.14.x,rtl871xdrv 出问题了,报 ioctl[RTL_IOCTL_HOSTAPD]: Operation not supported ,可参考 https://forum.odroid.com/viewtopic.php?f=146&t=29195#p208592
  5. 话说 odroid.com 这个公司似乎是专门销售网络硬件方案的,其中 WiFi module #3 就是用 realtek 的这款芯片,所以它必须解决问题。。。
  6. 然后该公司发现,使用4.14.x主线的 rtl8192cu就能用 hostapd 的 nl80211 驱动来跑 AP,甚至无需给 hostapd 2.6 打补丁:https://forum.odroid.com/viewtopic.php?f=146&t=27287
  7. 按照它给的方法,确实能启动热点,客户机也能连上,但就最近两天的情况看并不稳定

...需要时间继续检验...

Topic: 技术

将 mp3 投/cast 到 chromecast 设备上

作为一个音箱,哪怕是冠以智能音箱的名义,也是必须要能满足用户想放什么声音,就能放出什么的需求的

所以,如果玩家没有 Spotify 之类的流媒体帐号,又或者是有独家珍藏的 MP3 file,怎样在 49$ 的设备上把声音播放出来呢?Echo dot 可以作为 bluetooth speaker 和手机配对,Google Home Mini 自然就是 chromecast 了

想到树莓派非常适合做家庭媒体中心,调研了一番从 Linux 主机 cast 到 chromecast 设备的方案。。。被 Raspbian Stretch 内置的 mkchromecast 似乎必须要一个桌面环境,抛弃。。。然后发现 stream2chromecast 出乎意料的靠谱,至少目前放个 mp3 ,命令行再控制一下音量是毫无问题的。。。

下一步就是开发 Alexa skills or Google Actions 让我可以赖在沙发上指挥这个树莓派了...

再等过两天 chromecast 到货后试一下 stream2chromecast 播放视频的能力;以及要是有功夫看看 VLC 3.0 能不能在 Raspbian Stretch 上编译通过和命令行工具 cvlc 的情况

UPDATE: 2018/03/21

  1. qyt 今天提示我有一个 My Media for Amazon Alexa,上亚马逊看了一下评分,还真的很高
  2. chromecast 2Gen 到货,stream2chromecast 投 mp4 视频毫无问题;VLC 3.0 的编译放弃了,steam2chromecast 是 python 开发的已然足够方便
Topic: 技术

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

虽然搭树莓派的最初原因只是想使用 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#linux 和 https://github.com/shadowsocks/simple-obfs 非常简单,毕竟树莓派系统是一个很完整的 Debian Stretch 变种,首先安装依赖的包,然后从源码 clone 下来按说明编译和配置即可

  • sudo apt install --no-install-recommends gettext build-essential autoconf libtool libpcre3-dev asciidoc xmlto libev-dev libc-ares-dev automake libmbedtls-dev libsodium-dev
  • 。。。略去官网里的 iptables 以及 ss-redir 配置 https://github.com/shadowsocks/shadowsocks-libev#transparent-proxy

因为这个树莓派目的很简单,只是为了服务 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 进行解析

  • 参考 https://github.com/qiwihui/hiwifi-ss/issues/106 和 https://gist.github.com/willwhui/28e8896b6e4560f1cf0d32a5acf501f3 搞定
  • Google Home Mini 联网之后,我的 LG Watch Style 现在也正常通过该路由器连上 Play 并更新到 8.0 了!!

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

  • https://github.com/shadowsocks/shadowsocks-libev/issues/1252
  • http://blog.csdn.net/lvshaorong/article/details/53203674 【推荐】

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

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
    • sudo apt install libnl-3-dev libnl-genl-3-dev libssl-dev
    • wget https://w1.fi/releases/hostapd-2.6.tar.gz
    • wget https://raw.githubusercontent.com/pritambaral/hostapd-rtl871xdrv/hostapd_2_6/rtlxdrv.patch
    • tar zxf hostapd-2.6.tar.gz
    • cd hostapd-2.6
    • patch -p1 < ../rtlxdrv.patch
    • cd hostapd
    • cp defconfig .config
    • echo CONFIG_LIBNL32=y >> .config
    • echo CONFIG_DRIVER_RTW=y >> .config
    • make -j 5
    • sudo make install
  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 系列硬件通过这个无线路由上网

附录:其它相关的链接

  • https://github.com/jekader/hostapd-rtl/issues/12
    关于 8192cu 的模块加载参数,据说关闭驱动里的能源管理参数后,Wifi热点服务会更稳定
  • http://randomstuffidosometimes.blogspot.com/2016/03/rtl8192cu-and-rtl8188cus-in-station-and.html
    https://github.com/desflynn/realtek-8192cu-concurrent-softAP
    让 8192 驱动网卡同时跑 STA + AP 模式;貌似是在上述 rtl8192cu-fixes 的基础之上更改 include/autoconf.h 相关的定义即可
  • https://github.com/jekader/hostapd-rtl
    300-noscan.patch,不清楚用途
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: 技术

移动设备中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: 技术
订阅 RSS - 技术 | BT的花