树莓派做路由器 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: 技术