树莓派 Zero W——随身钥匙扣

前言

原创文章,转载引用务必注明链接。水平有限,如有疏漏,欢迎指正。
本文使用Markdown写成,为获得更好的阅读体验和正确的格式显示,请访问我的博客原文:
http://www.cnblogs.com/sjqlwy/p/zero_w_server
由于最近比较忙,就不详述介绍了,直奔主题,想要更多了解zero_w的可以查看别人的分享。

1、 What Do I Want?

前段时间例行重装系统,突然发现,不管如何过了一段时间电脑里面就会出来一堆软件残留或者系统垃圾,作为一个有轻度洁癖的强迫症电脑使用者,突发奇想,可不可以把一些软件放在随身小服务器上,即插即用。如此想了一下,列出大致需求:
随身服务器要求:

  • 体积小
  • 功耗低
  • 供电方便(使用MicroUSB供电,则可以方便地使用通用数据线由连接电脑或者充电宝)
  • 具备蓝牙BLE(设想通过BLE设备与主机组网,4.x以上蓝牙功耗低、传输距离远、传输速率可以接受;可选Wifi,无需Ethernet接口)
  • 性能够用
  • 主流操作系统及mainline kernel支持

2、Why RPi Zero W?

明确了对随身服务器的硬件要求,查阅市面上常见的开发板目录,最后筛选出以下几块开发板:

  • RapberryPi Zero W

    完美符合所有硬件要求,尺寸稍大。操作系统支持完善。
    ~¥200;单核1GHz ARM CPU | 512MB |

  • NanoPi Neo Air

    友善之臂良心企业,采用全志H3方案,发热稍大,尺寸超讨喜。操作系统支持尚可。
    ~¥169;四核1.2GHz ARM CPU | 512MB | 8GB eMMC | 需要外置天线

  • Intel Edison Breakout Kit

    体积小巧,性能优异,功耗极低,Intel品质保证。操作系统支持一般。
    ~¥599,推荐选择DFRobot出品的IO拓展板;单核500MHz x86 CPU | 1G | 4G eMMC | 没有GPU。

  • Orange Pi Zero Plus2

    性能应该比H3更强,但是多的HDMI接口其实用不到。设计还是不如NanoPi大胆,不过比落入窠臼的BananaPi强多了。但是因为个人原因不喜欢OPi,此外他家的软件支持呵呵呵,好在通用资源丰富。

    ~¥149。四核 ARM CPU | 512MB | 无半载存储 | 自带天线

  • OrangePi 2G-IoT

    体积稍大,无奈软件驱动支持有待观察。具体性能不知,应该不会很强。具体可参考评测。

    ~¥69。OPi就是价格杀手,但是我不想买第二次。

注:以上价格仅供参考。
喜好程度:RPi > NanoPi > Edison>OrangePi。原本准备从DFRobot买块基板配合Edison使用,优点在于功耗低、性能强、接口丰富;缺点在于体积稍大、有排针不方便、操作系统只有官方的Yocto比较完善,但是软件包较少。
恰在此时,想起云汉社区有Zero W的试用活动,就抱着试试看的态度申请了一下,没想到次日知会我通过了,第三天就寄到了我手上,很是惊喜。

3、项目方案

  • 连接方式多
    • Bluetooth
    • Wifi
    • OTG Cable
  • 提供服务广
    • AD Blocker(Pi-Hole)
    • DNS Accelerate(Pi-Hole?)
    • Proxy(Shadowsocks)
    • Programming Learning(Python)
    • Web Server(Lighthttpd)
    • Web Camera(DietPi-Cam)
    • Wifi Hotspot
  • 控制方便
    • Web Control Interface(PHP)
    • Physical Control (Via GPIO)

4、Connection Methods

基本就是Zero W上电之后,与主机自动零配置组网,首选蓝牙BLE,适用性强,通过主机共享上网。其次通过Wifi或者MicroUSB数据线与主机连接。

4.1、Bluetooth PAN

Bluetooth Personal Area Networking,蓝牙个人区域网。W与主机蓝牙组网,通过主机共享网络连接。分为主机使用Linux和Windows两种情况,实现过程中遇到了问题,待完成后补充。

4.2、Wifi

需要解决的问题包括W连接路由与主机形成局域网;Zero连接主机共享的无线网;Zero连接路由,主机通过Zero联网。Station->STA指连接其他设备的工作模式,比如手机、电脑连接路由器;Access Point->AP指可以被其他设备连接的模式,如路由器。 更多信息可以参考我的博客UP Board USB无线网卡选购指南。

4.2.1、Zero W连接路由器

要处理三个问题,一是首次上电如何自动连接无线网;二是如何在多网络自动切换;三是如何连接隐藏网络。

既往初次设置无线网络,我一般使用dietpi系统,烧录之后修改boot分区里的dietpi文件。

现在新版的Raspbian提供了另外的选择,根据树莓派官网的更新日志:

If a wpa_supplicant.conf file is placed into the /boot/ directory, this will be moved to the /etc/wpa_supplicant/ directory the next time the system is booted, overwriting the network settings; this allows a Wifi configuration to be preloaded onto a card from a Windows or other machine that can only see the boot partition.

注意不是烧录后首次而是只要存在下次都会覆盖

至此,我们使用WiFi config generator小工具生成一个wpa_supplicant.conf文件,放在/boot分区下即可。

参考WPA supplicant | ArchWiki 、 wpa_supplicant.conf | manual 以及《Linux无线网络设置(wpa_supplicant的使用)》,我们可以增加priority字段和scan_ssid=1字段实现多网络切换连接隐藏ssid的无线网络

network={
    ssid="home"
    scan_ssid=1
    priority=5
    key_mgmt=WPA-PSK
    psk="very secret passphrase"
}

注:

  • 优先级越高越先连接。
  • 可用通过wpa_passphrase MYSSID passphrase >> /etc/wpa_supplicant/example.conf增加一个新网络连接,>>代表附加内容,>代表覆盖内容。

除此之外可用wicd连接隐藏无线网,我之前讲过。

对于dietpi,不知道是否自动处理boot分区的wpa配置文件,我之前是使用/etc/network/interfaces文件移动至/boot分区,创建软链接的方法。

4.2.2、Zero W连接主机虚拟热点。

这里使用绿色版软媒Wifi助手,比猎豹免费wifi和360wifi功能略少,但是起码够用,最重要的是没有广告啊!!!

4.2.3 主机通过Zero W联网

我们通过执行iw list命令,可以看到Zero板载的无线网卡支持多种工作模式(不支持monitor监听模式):

此外,支持同时开启多种模式:

所以设想Zero连接Wifi,然后建立热点为其他设备提供上网服务理论上是可行的。参考这篇帖子,同时开启STA和AP模式,方法参考博士的帖子。参考这里让连接Zero热点的设备联网。

注意AP和STA在同一channel,开启hostapd会有短暂断网。Via 博士

RaspAP项目使用网页控制hostapd所建立的热点。

4.3、OTG数据线直连

参考我之前写的文章:《一根数据线玩转Zero》,通过常用的MicroUSB数据线连接W与主机,共享主机网络,方便但是偶尔不稳定。

5、随身服务器

我们这里使用个人强烈推荐的DietPi发行版,当然你也可以使用树莓派基金会推荐的Raspbian Lite以及优秀的Armbian发行版。简介以及基本安装使用请参考我的博客文章,不再赘述。

5.1 广告屏蔽

既往使用过AD Safe净网大师/ADM阿呆喵,最初用的是前者,但是使用过程中有种不祥的预感,直觉告诉我这软件可能会侵犯隐私,而且体积越发臃肿,所以弃用换了ADM,甚是满意,只是开启https广告拦截配合chrome浏览器会提示证书错误,无法正常访问网页,然后现在https广告还是很多的。
这里我们使用Pi-Hole项目来屏蔽广告。
slogan

  • 官方主页
  • 项目主页

最早是在Reddit树莓派讨论区(相当于国外版百度贴吧)看到Pi-Hole(注册商标)项目,开发活跃,讨论热烈,而且现在越来越完善了。
Pi-Hole号称A Black Hole for Internet Advertisements,是一个支持多平台、全网范围的广告拦截工具,本质是提供DNS解析服务,因此所有设备都能获得广告拦截效果。此外它还有一个易于管理的网页控制界面。

要想实现去广告及加速网址解析,只需要把设备的DNS设置为Zero的地址即可。此外还可以结合SS服务器增加一些设置如防DNS投毒。

5.2、Scientific 上网

更新Pi-hole的过程中从外网下载更新文件失败,再加上一些网站打不开,所以准备让Zero W作为二级代理连接我位于太平洋彼岸的VPS服务器,并为局域网提供指路服务。
由于墙越来越厉害,国外搭建OpenVPN特征流量会被识别,根本无法连接,所以你看国内免流服务都是租用国内服务器搭建OV。

  1. 我们这里选择Shadowsocks,并且使用SSR而不是原版SS,一是SSR一个端口支持socks4|5/http代理,有些时候还是很重要的。此外面对不断升级的墙技术,SSR优势在于混淆,所以稳定性优于,速度慢于原版SS。不过原版SS也逐渐添加许多新特性(前段时间的撕逼。。。)
  2. SS有诸多程序语言版本,比如Python/C/Go等,我们这里使用shadowsocks-libev版的,其使用C语言,特别适合于Zero W这种性能一般的设备。
  3. 最后就是选用chacha20加密协议,这是因为Zero W所使用的ARM处理器不支持硬件aes加解密,使用以上加密方式时会占用大量系统资源,chacha20加密协议是谷歌?提出,针对ARM优化的,像手机/ARM开发板适用。该加密特性由libsolid库提供。

5.2.1 安装SSR

SSR-libev项目地址:https://github.com/shadowsocksr/shadowsocksr-libev
由SS-libev fork而来,安装教程未更新请参考原版。
这里使用的Raspbian|DietPi基于Debian 8(Jessie),根据教程我们添加jessie-backports软件源,并执行apt -t jessie-backports install shadowsocks-libev安装相应软件包,然而无论运行什么命令都会提示Illegal instruction,搜索之后怀疑是软件仓库里的预编译包虽然是armhf架构,但是不兼容Zero W。最后选择下载源码进行编译安装。

https://github.com/tennfy/shadowsocks-libev/blob/master/debian_shadowsocks_tennfy.sh

关于backports源:
You are running Debian stable, because you prefer the Debian stable tree. It runs great, there is just one problem: the software is a little bit outdated compared to other distributions. This is where backports come in.
Backports are packages taken from the next Debian release (called "testing"), adjusted and recompiled for usage on Debian stable.

5.2.2 交叉编译

使用过程中发现使用ARM编译软件包还是很慢,所以准备用x86小主机进行交叉编译。
pass
参考:http://blog.csdn.net/xukai871105/article/details/24932611

http://shumeipai.me/archives/59.html

http://www.cnblogs.com/xieyajie/p/4699724.html

arm-linux-gnueabihf-gcc

5.2.3 ss-local与ss-redir

pass

测试socks5代理是否成功:

curl --socks5 127.0.0.1:1080 www.google.com

由于正常情况下谷歌是无法访问的,如果代理成功则会返回内容。

5.2.4 Privoxy:socks5转http代理

默认情况下,ss是socks代理,而有些情况下,我们需要http代理。

curl -x 127.0.01:1080 www.google.com

默认-x参数使用http代理,此时无法返回内容。我们参考shadowsocksR for windows,看到一个名为privoxy的工具,实现了一个端口同时兼容socks4/5、http协议,好在Linux下也有该工具。但是由于我们使用的ss-local并不支持该特性,所以要使用privoxy额外占用一个端口,当然privoxy作用不止于此,这是后话,按下不表。可用参考linux下使用privoxy将socks转为http代理 。

# 安装privoxy
apt install privoxy
# 更改配置文件,实现socks5转http
echo 'forward-socks5   /               127.0.0.1:1080 .' >> /etc/privoxy/config
echo 'listen-address 0.0.0.0:8118' >> /etc/privoxy/config
# 重启服务并测试是否成功开启http代理
systemctl restart privoxy.serivce
curl -x 127.0.01:8118 www.google.com
把地址改为 0.0.0.0:8118,表示外网也可以通过本机IP作http代理。

至此,我们实现了Zero W开机自动连接SS服务器,并对局域网提供socks5/http代理,可选透明代理。