基于802.11的无线mesh网状网络
802.11s 是一个无需建立基础设施就可以连接无线设备的开源标准. 它在 Layer 2 上运行,并确保所有节点可以在桥接二层网络上看到彼此(就像他们都插入到交换机上一样). 任何 Layer 3 基础设施都可以在此之上工作. IP router 和 DHCP clients 都能很好运行. 可以根据用例实现更复杂的基础设施。(例如 Batman, Bird, OLSR 等),这些增强的包更多地针对城市级别规模的大型基础设施方案,而不是典型的家庭mesh应用。相比之下,基本的 802.11s 网格适用于家庭mesh的应用场景。
该视频是使用OpenWRT构建简单网状网络的一个很好的入门教程: https://www.youtube.com/watch?v=kMgs2XFClaM
现状
802.11s 在 OpenWrt 19.07 及更高版本稳定工作, 包括身份验证和加密, 假设有硬件/驱动程序支持 并且已经安装了 wpad-mesh-openssl
(或同等的工具wpad-mesh-wolfssl)。
有一个ARP中继错误 (在v19.07.4确认),这意味着处于mesh网格中只有在Mesh Portal (MPP)的无线范围内的Mesh-Points才正常工作. 参见: https://forum.openwrt.org/t/bug-report-802-11s-mesh-v19-07-4/78524/4
什么是网状网络?
网状网络是多点对多点的第二层宏路由回程,用于实现网状对等设备之间的互联。网状对等设备通常是非用户设备,如路由器、接入点、CPE 等。
一般来说,手机、平板电脑、笔记本电脑等用户设备无法连接到网状网络,而是通过网状网关(一种特殊类型的网状对等设备)实现连接。
提示 您确定需要网状网络吗?
如果您正在寻找一种解决方案,使您的用户设备能够 从一个接入点无缝漫游到另一个接入点 ,您要找的不是网状网络
一些制造商出于营销目的,使用 “Mesh “一词来描述其非标准、闭源、专有的 “漫游 “功能,这给许多人在进入网络基础设施的国际标准和开源固件世界时造成了极大的困惑。
- 网状网络的公认标准是 ieee802.11s。
- 用户设备快速漫游的公认标准是 ieee802.11r。
这是两个完全不相关的标准。
有关配置快速漫游的详细信息,请参阅:dawn
802.11s Mesh
802.11s 可在 OpenWrt 19.07 及更高版本中可靠运行,包括身份验证和加密,前提是有硬件/驱动程序支持、已安装 “wpad-mesh-openssl”(或同等软件)和 “mesh11sd “软件包。 另请参见:The Mesh11sd Project
802.11s 接口需要设置许多操作参数,然后 接口才会启动并成为网状网络的一部分。
mesh11sd 软件包可监控并动态设置和重置这些必要的网格参数。
一直以来,在无线配置中无法设置所需的网状网参数(因为接口尚未建立)被一些人解释为 “ARP 中继错误”,因为所有网状网节点之间的第 2 层(mac 路由)网络永远不会同时处于活动状态。
配置
如果需要运行加密的mesh网络, 需要安装支持mesh加密的wpad版本.
在写这篇文档的时候, 需要以下的wpad版本之一:
- wpad-mesh-openssl (精简版以节省空间)
- wpad-openssl (完整大版本)
- wpad-mesh-wolfssl (精简版以节省空间)
- wpad-wolfssl (完整大版本)
- wpad-mesh-mbedtls(精简版本以节省空间)
- wpad-mbedtls (完整大版本)
如果默认安装了这些,就需要删除这些加密功能较少的组件:
# opkg remove wpad-mini # opkg remove wpad-basic # opkg remove wpad-basic-wolfssl # opkg remove wpad-basic-openssl # opkg remove wpad-basic-mbedtls
安装依赖项 (改为wpad-mesh-openssl
),才能提供mesh网络的加密,wolfssl是性能更好适合嵌入式设备轻量化的加密库,openssl是常见的主流加密库:
# opkg install wpad-mesh-wolfssl
或者
# opkg install wpad-mesh-openssl
或者
# opkg install wpad-mesh-mbedtls
这样安装只是提供mesh网络的加密
建议安装wpad-wolfssl
# opkg install wpad-wolfssl
或者
# opkg install wpad-openssl
或者
# opkg install wpad-mbedtls
就可以把加密提供于mesh、ap等所有网络中了
说明:
wpad-basic-*
仅支持 802.11r 和 802.11w。wpad-mesh-*
仅支持 802.11r/w and 802.11s。wpad-*
,例如wpad-wolfssl
是wpad
的完整版 提供支持 802.11k/v/r/w and 802.11s。wpad
的 完整版 意味着没有进行任何修剪以减小其大小。
无线网络配置
编辑 /etc/config/wireless
并确定:
radio0
没有设置为 disabled,或者disabled设置为0radio0
在每个设备上都配置兼容 (相同的channel等)- 按下面的形式增加
iface
:
config wifi-iface 'mesh' option device 'radio0' #设置无线网卡设备 option disabled '0' option network 'lan' option ifname 'mesh0' option mode 'mesh' #mesh模式 option mesh_id 'your-mesh-name' # 可以任意字符串, 所有同一个mesh_id的节点连接成一个网格(如果有密码还要加上密码) option encryption 'sae' # 如果无需加密就设置为 'none' option key 'your-secret-password'
注意: 客户端设备的访问是通过桥接‘ap’和‘mesh’接口来实现的,这一点很重要,选项option network 'lan' 的作用是把 'mesh' 接口桥接到了 'lan'。 您要加入mesh网络的每个设备都必须以相同的方式进行配置,即相同的mesh_id,相同的通道channel,相同的密钥。 这种无线wireless配置可能足以满足组建两三个较近的mesh节点的“mesh”网络。 但是,由大量mesh网状节点组成的有机、自主自我管理的mesh网络需要额外的配置。
此配置应该足以启动mesh网络,因此您现在可以重新初始化wifi并查看它是否有效:
重载网络
# /etc/init.d/network reload
查看它是否有效
# wifi # iw dev mesh0 info
应该可以看到类似于以下内容的输出:
Interface mesh0 ifindex 10 wdev 0x3 addr 12:34:56:78:9a:bc type mesh point wiphy 0 channel 2 (2417 MHz), width: 20 MHz, center1: 2417 MHz txpower 28.00 dBm multicast TXQ: qsz-byt qsz-pkt flows drops marks overlmt hashcol tx-bytes tx-packets 0 0 129166 0 0 0 0 9107016 129167
如果你想在你的mesh网格上运行一个像OLSR这样的路由协议,就禁用 802.11s的内置路由选项 option mesh_fwding '0'
.
对于网格参数的完整列表,您可以检查以下变量的值 mac80211.sh Source:
- MP_CONFIG_INT
- MP_CONFIG_BOOL
- MP_CONFIG_STRING
或者也可以用以下命令
# iw dev <devname> get mesh_param
来获取可用mesh网格参数表, 不过没文档.
然后重启无线网络看它的工作情况:
# wifi # logread -l 20 -f # iw dev wlan0 station dump
无线硬件支持
支持 802.11s (type mesh) 取决于无线驱动程序. 大多数最新的开源驱动程序都是可以的.
使用以下方法来确定你的硬件是否支持 802.11s mesh.
iw list | grep "Supported interface modes" -A 9 ... Supported interface modes: * IBSS * managed * AP * AP/VLAN * WDS * monitor * mesh point * P2P-client * P2P-GO ...
例如: ath9k的路由器
iw list ... valid interface combinations: * #{ managed, WDS } <= 2048, #{ AP, mesh point } <= 8, #{ P2P-client, P2P-GO } <= 1, #{ IBSS } <= 1, total <= 2048, #channels <= 1, STA/AP BI must match * #{ IBSS, AP, mesh point } <= 1, total <= 1, #channels <= 1, STA/AP BI must match, radar detect widths: { 20 MHz (no HT), 20 MHz } ...
例如: ath9k_htc的USB外设
iw list ... valid interface combinations: * #{ managed, P2P-client } <= 2, #{ AP, mesh point, P2P-GO } <= 2, total <= 2, #channels <= 1 ...
使用命令行方式
iw 是一种新的基于 nl80211 的wireless devices命令行实用配置工具.more...
创建新的 interface “mesh0”
iw phy phy0 interface add mesh0 type mp mesh_id mymesh
确认新 interface 存在
ifconfig -a | grep mesh0 mesh0 Link encap:Ethernet HWaddr 00:18:39:14:48:B5
打开你的 mesh0 interface
ifconfig mesh0 up
为接口配置IP地址。 如: 10.0.0.x
ifconfig mesh0 10.0.0.1
默认情况下, mesh points 会使用 channel 1 并自动尝试创建具有相同mesh ID和channel的mesh节点的对等连接.
验证
使用iw命令显示对等链路或mesh网格中可达节点的表
iw dev $MESH_IFACE station dump iw dev $MESH_IFACE mpath dump
例如:
iw dev $MESH_IFACE station dump Station 00:15:6d:84:14:10 (on mesh) inactive time: 1320 ms rx bytes: 352 rx packets: 4 tx bytes: 174 tx packets: 2 signal: -61 dBm tx bitrate: 1.0 MBit/s mesh llid: 32577 mesh plid: 15969 mesh plink: ESTAB Station 00:15:6d:84:14:09 (on mesh) inactive time: 3370 ms rx bytes: 1064 rx packets: 12 tx bytes: 545 tx packets: 7 signal: -53 dBm tx bitrate: 1.0 MBit/s mesh llid: 41036 mesh plid: 24435 mesh plink: ESTAB
封锁处于mesh网格中单个节点
需要 iw-full 包!
通过MAC地址封锁处于mesh网格中的节点
iw dev $MESH_IFACE station set $MAC_TO_BLOCK plink_action block
验证以上是否生效 (iw dev $MESH_IFACE station dump)
mesh plink: BLOCKED
解除:
iw dev $MESH_IFACE station set $MAC_TO_UNBLOCK plink_action open
根据 this source plink_action 不会在mesh网格链接的重连中持久化。