YP.Lam | 树莓派 OpenThread 边界路由器配置

树莓派 OpenThread 边界路由器配置

OpenThread 边界路由器的作用是作为 Thread 网络与其他基于IP的网络(如WIFI、以太网)的桥梁。有了边界路由器的存在才让 Thread 网络中的设备成了跟手机、电脑等对等的一员(是的,基于IP就是那么自信)。

OpenThread 官方提供 Docker、 BeagleBone Black、Raspberry Pi 3B 的支持(代码中 OpenWRT 也是有支持的,只是可能还未正式稳定)。本文将尽量详细地记录 Raspberry Pi 3B 配置成边界路由器的过程。

树莓派基础配置

第一步当然是下载镜像,并且写入到SD卡。官网地址:https://www.raspberrypi.org/downloads/raspberry-pi-os/ 。Linux系统下可以直接用以下命令写入镜像:

# 注意:请根据真实情况选择磁盘,不然可能会导致你的数据丢失
sudo dd bs=4M if=2020-08-20-raspios-buster-armhf-lite.img of=/dev/mmcblk0 conv=fsync

启用wifi与ssh

使用headless的配置方式,不需要显示器与外接键盘。在SD卡的 boot 分区中创建一个空的 ssh 文件:

cd /run/media/yplam/boot
touch ssh

在刚刚那个 boot 分区新建一个 wpa_supplicant.conf 文件,输入 WIFI 网络信息:

country=CN
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
    ssid="NETWORK-NAME"
    psk="NETWORK-PASSWORD"
}

插入SD卡上电启动,如果有mdns的话直接 :

ping raspberrypi.local

获取IP,如果没有则登录路由器把它找出来,然后ssh登录,用户名pi,密码 raspberry 。

基础软件安装

sudo apt install git

OTBR编译安装

git clone https://github.com/openthread/ot-br-posix
cd ot-br-posix
./script/bootstrap
./script/setup

注意,可能需要改改 script/_dns64 中关于 dns 服务器的配置(国内无法访问)

RCP 配置

编译 RCP 固件,如 NRF52840 可以使用以下编译选项:

cd /src/openthread/
./bootstrap
make -f examples/Makefile-nrf52840 BORDER_AGENT=1 BORDER_ROUTER=1 COMMISSIONER=1 UDP_FORWARD=1 USB=1 LINK_RAW=1 BOOTLOADER=USB
cd /src/openthread/output/nrf52840/bin
arm-none-eabi-objcopy -O ihex ot-rcp ot-rcp.hex

插入 RCP 到树莓派 USB 口,查看:

ls /dev/tty*

名称为 /dev/ttyACM* 的设备即为 RCP;修改配置文件 /etc/default/otbr-agent

OTBR_AGENT_OPTS="-I wpan0 spinel+hdlc+uart:///dev/ttyACM0"

修改配置后重启系统,运行以下命令:

sudo systemctl status

如果安装正常,则可以看到相关服务正常运行:

avahi-daemon.service
otbr-agent.service
otbr-web.service

而运行下面命令可以看到OpenThread网络为 disabled 状态

sudo ot-ctl state

AP模式配置

树莓派可以配置运行在 AP 模式,其他设备可以接入树莓派提供的网络来管理 OpenThread 网络。

安装以下软件:

sudo apt-get install hostapd dnsmasq tayga
  • hostapd — 允许使用树莓派的WIFI允许在AP模式
  • dnsmasq — 提供 DHCP 与 DNS 服务
  • tayga — NAT64服务,提供外网 IPV4 地址到 IPV6 地址的转换

修改文件 /etc/dhcpcd.conf,末尾增加一行

denyinterfaces wlan0

新建文件 /etc/network/interfaces.d/wlan0

allow-hotplug wlan0
iface wlan0 inet static
    address 192.168.1.2
    netmask 255.255.255.0
    network 192.168.1.0
    broadcast 192.168.1.255

配置 /etc/hostapd/hostapd.conf,因为使用的是 PI3B+,支持5G网络,配置有所不同

# The Wi-Fi interface configured for static IPv4 addresses
interface=wlan0

# Use the 802.11 Netlink interface driver
driver=nl80211

# The user-defined name of the network
ssid=BorderRouter-AP

# Use the 5GHz band
hw_mode=a

# Use channel 6
channel=40

# Enable 802.11n
ieee80211n=1

# Enable WMM
wmm_enabled=1

require_ht=1
ht_capab=[HT40-][DSSS_CCK-40]

# Accept all MAC addresses
macaddr_acl=0

# Use WPA authentication
auth_algs=1

# Require clients to know the network name
ignore_broadcast_ssid=0

# Use WPA2
wpa=2

# Use a pre-shared key
wpa_key_mgmt=WPA-PSK

# The network passphrase
wpa_passphrase=12345678

# Use AES, instead of TKIP
rsn_pairwise=CCMP

修改 /etc/default/hostapd

DAEMON_CONF="/etc/hostapd/hostapd.conf"
sudo systemctl unmask hostapd
sudo systemctl start hostapd

修改 /etc/systemd/system/hostapd.service

[Unit]
Description=Hostapd IEEE 802.11 Access Point
After=sys-subsystem-net-devices-wlan0.device
BindsTo=sys-subsystem-net-devices-wlan0.device

[Service]
Type=forking
PIDFile=/var/run/hostapd.pid
ExecStart=/usr/sbin/hostapd -B /etc/hostapd/hostapd.conf -P /var/run/hostapd.pid

[Install]
WantedBy=multi-user.target

在 /etc/rc.local 的 exit 0 之前添加

sudo service hostapd start

重启树莓派,可以看到多了一个名叫 BorderRouter-AP 的 wifi 网络可以加入。

配置 dnsmasq

修改 /etc/dnsmasq.conf

# The Wi-Fi interface configured for static IPv4 addresses
interface=wlan0

# Explicitly specify the address to listen on
listen-address=192.168.1.2

# Bind to the interface to make sure we aren't sending things elsewhere
bind-interfaces

# Forward DNS requests to the Google DNS
server=119.29.29.29

# Don't forward short names
domain-needed

# Never forward addresses in non-routed address spaces
bogus-priv

# Assign IP addresses between 192.168.1.50 and 192.168.1.150 with a 12 hour lease time
dhcp-range=192.168.1.50,192.168.1.150,12h

修正 /lib/systemd/system/bind9.service 与 dnsmasq 的冲突

After=network.target dnsmasq.service

配置 tayga

修改 /etc/tayga.conf 关于以下配置项

prefix 64:ff9b::/96
dynamic-pool 192.168.255.0/24
ipv6-addr 2001:db8:1::1
ipv4-addr 192.168.255.1

启用 tayga

sudo systemctl enable tayga

使能网络转发

sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"
sudo sh -c "echo 1 > /proc/sys/net/ipv6/conf/all/forwarding"

为了重启后能生效,修改配置文件 /etc/sysctl.conf,更改对应项配置

使能 NAT44

sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

使能 wlan0 与 eth0 之间的转发

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

保存iptables配置

sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"

在 /etc/rc.local 的 exit 前增加

iptables-restore < /etc/iptables.ipv4.nat

重启系统,查看各服务是否正常启动,譬如 ping -6 一个外网 IP

ping -6 64:ff9b::***

创建 OpenThread 网络

sudo ot-ctl panid 0xc80b
sudo ot-ctl extpanid f37fcf5bc5cbe195
sudo ot-ctl masterkey e35efdce91b5d2ad6ee96350c31e56d3
sudo ot-ctl pskc 7beafb2ea25f3f8ce244b1e92a79a623
sudo ot-ctl networkname MyOT
sudo ot-ctl channel 11
sudo ot-ctl ifconfig up
sudo ot-ctl thread start
sudo ot-ctl state

sudo ot-ctl prefix add fd11:22::/64 pasor
sudo ot-ctl netdata register

需要注意的是后面两行如果不运行,OpenThread网络中的设备将无法访问外网。

至此,OpenThread网络配置完成,可以通过 ping 外网 ip 进行测试(通过nat64)。