OpenWrt漫游设置(速成)
Wi-Fi 技术在经历多次更迭以后,现在已经来到了第六代。但是除了速度的提升以外,其他方面的变化实在是感知不强(方向错了!)。在最关键的信号覆盖部分,Wi-Fi6 更是和以前可以说是么有任何区别。
由于我家是住别墅的,路由器信号覆盖问题在我这里由其严重。在以前,让家里覆盖 Wi-Fi 的方法简单粗暴:哪里没网在哪里插个路由器。每个路由器设置不同的名称(ssid)自己手动选。这种方式虽然解决了从 0 到 1 的问题,但解决方式实在是不够优雅简洁。
你也可以把家里的 Wi-Fi 名称改成一样的。这样简洁了,但是不优雅。有些设备不会在不同的路由器之间自动切换,会自己切换的也做不到完全无缝切换。
当然了,优雅的解决方式也不是没有,那就是快速漫游技术。
什么是快速漫游
在说明什么是快速漫游之前我需要先阐明一个误区:快速漫游和你家里用的组网方式没!有!关!系!
无论你家里是 AC+AP 还是更加亲民的 MESH 组网,它们利用的漫游协议是一!样!的!
更准确来说,组网方式解决的是路由器和 ap 之间互相通讯的问题,而快速漫游解决的是你的手机在不同 Wi-Fi 节点中切换的问题,他们就不是一个层面上的东西!
很多人认为路由器是 mesh 的,那么手机就可以漫游了。这是一个错误的观点!如果路由器支持 mesh 但是不支持漫游协议,那么他的漫游效果和两家不同品牌的路由器混搭没!有!区!别!(不过现在的 mesh 一般都有漫游,吧
)
快速漫游
快速漫游不是一个单独的协议。它其实包含了三个单独的协议,802.11k, 802.11v, 802.11r, 分别达成了漫游的一部分功能。尽管这些协议早在 2008 年就已经问世,但由于当时没有太大用处,也不是强制性的协议,直到 10 多年后的今天才受到了关注。关于每个协议的细节可以参考苹果的科普,比我讲的肯定要好多了
https://support.apple.com/zh-cn/HT202628
在这三个协议中,最重要也是最指标性的就是 802.11r 了。其他两个更多是向你的手机提供关于漫游方面的建议,建议予不予以采用完全是取决于手机优化(不调,好不?发布!)。而 802.11r 是实实在在的一个认证协议,大幅缩短了切换过程中所需的时间。不完全准确的解释:以前切换是先和前一个 wifi 断开,然后连上新的 wifi。而现在,是先连上新的 wifi 然后和前一个 wifi 断开
802.11r 和以往认证方式所需时间对比
802.11r 还有些别名:Fast BSS Transition, Fast Transition, FT。这些可能会在你读 log 或者查英文资料的时候用得到。
这篇文章接下来也会详细说明关于手动配置 802.11r 中会遇到的一些坑。
OpenWRT
当然了,看到这个标题点进来的人应该都对快速漫游有一定了解了,不是来听我 bb 浅显的知识的。玩 openwrt(op)的大佬也估计知道 80211r 在 op 里面就是一个开关,选了就行。然而事实并没有那么简单。我翻遍了中文互联网,发现没有一篇文章的教程是对的。我想我这篇可能是第一个……
关于如何安装 OpenWRT 我就不多赘述了,网上教程很多,过程也很麻烦,每个路由器都不一样。我就简单介绍一下我的设备
WSR-2533DHPL
WSR-600DHP
两台都是日拍上捡的垃圾,运行的是 op 官方系统 21.02.3。两个机器都是日本特供货,国内估计见不着,没有广告嫌疑。(不得不吐槽一下日本路由器原厂固件那简直就是垃圾中的战斗机,tp-link 都自愧不如)
配置快速漫游
第一步
原版 op 固件为了节省空间,自带的 wpad 库是残血的。因为我们需要用到满血 wpad 的一些功能,需要先安装满血库。如果你的 op 自带了 wpad-openssl 或者 wpad-wolfssl(国人自己编译的很多都是),那可以跳过这步。
中文界面也是一样
进入 System -> Software
先在 installed 里找到自带的 wpad,卸载
接着点击 update lists,随后在 available 里搜索 wpad-wolfssl,最后安装即可。
在安装过程中不要刷新或者断电,静静地等就行,国内可能慢点。主要是,我以前这么做变砖了……(现在我都是 ssh 命令行操作了,不信任 web)
第二步
进入 Network -> Wireless,找到你想支持快速漫游的那个无线网络,点击 edit 编辑
选择你想要修改的 Wi-Fi
进入 wireless security 选项,这里也是我们的重点
重点!!!
进入这里我们能看到大大的 “ 802.11r Fast Transition ” 选项。是不是以为勾选了这个就万事大吉了?No no no~通过本文中提供的方法和技巧,您可以轻松地优化和保护您的无线网络,以获得更好的连接和安全性。 看到勾选了以后下面跳出来的选项了吗?OpenWRT 不当人的一点就是,它这里给的默认值是坏的,你如果不做调整,别说快速漫游了,还会报错,增加切换所需时间
。这些选项我们一个一个来看
NAS ID:每个设备对应一个唯一的 ID,不能重复。这里不填就行,会自动生成的
Mobility Domain:用于认证的一个统一的四位号码。所有无线网络填一样的就行。建议填 1111 或者 1221 这种从左从右读起来都一样的,不然可能会和别的公司的设备不兼容(big endian little endian 自行百度 )
Reassociation Deadline:这里的默认数值是 1000,需要改成 20000
FT protocol:选择 FT over the Air
Generate PMK locally: 如果你的加密方式是 WPA3,不要勾选。如果你的加密方式是 WPA2,可以选择勾选。
下面那些就默认即可
以上任何一个选项填写不正确都有可能导致快速漫游不工作。这里我们重点讲解一下 Reassociation Deadline 和 FT protocol 两个
Reassociation Deadline 意思为重新连接期限。这个数值在 Cisco 和 UniFi 的设备上默认数值都是 20000(20 秒),但不知道为什么 op 却把这个数值设定为了 1000(1 秒)。经测试,1000 会在苹果手机上会疯狂报错(Rekeying PTK for STA xx:xx:xx:xx:82:11 but driver can’t safely do that.),而 20000 则没问题。
FT protocol 决定了快速漫游的技术细节。可选方式为 over the Air 和 over DS。设备漫游的过程中是需要和新的 wifi 节点交换验证信息的。如果是 over the Air 方式,设备需要自行把验证信息传送给新的节点;而在 over DS 方式里,设备只需要和当前的节点说一声,当前节点就会把验证信息通过网线直接发送给新的节点,设备直接换过去就行了。看起来 over DS 方式更加的高大上,但现实它却是个陷阱:没有设备支持 over DS!就算是苹果也只支持 over the Air,更不提各自优化的各大安卓厂商了。
这部分在外网的讨论详见这篇帖子:https://forum.openwrt.org/t/802-11r-fast-transition-how-to-understand-that-ft-works/110920
至此,配置方面就告一段落了。如果你跟着这篇文章走了一遍,并且你的手机也支持 802.11r,那么你已经做到了真正的全屋快速漫游!
验证
然而我们求知的步伐不能在此停下。即使设置好了 802.11r,我们怎么才能知道它是否真的在工作呢?同样的,我在网上找了一圈,发现所有的文章也都是草草了事,验证方法也是或基于玄学,或浮于表面。那只能我亲自上场教学一下如何科学地验证漫游是否在工作,且如果出现了问题,你也能迅速定位问题所在。
验证需要以下几个工具:
支持快速漫游的手机(iPhone 是肯定可以,安卓你很难知道它支不支持)
手机安装监测 Wi-Fi 漫游的软件。第一推荐 WiFiman,是个 ubiquiti 的配套软件,很好用,信息显示也很全。其次可以用 tplink 的网络百宝箱,也还算好用。安卓端还推荐一个 wifi analyzer 软件,可以用来分析信号
电脑 ssh 连接路由器。很多人喜欢用 putty,不过我喜欢直接命令行 ssh。这里涉及命令行,要用到专业知识,不过都是复制粘贴,难度不大。可能比较劝退,我就不解释了,如果有不懂的请百度
准备好以后我们就可以开始了。可以先快速在 wifi analyzer 里看一看协议里有没有 +FT。如果没有的话可能路由器设置有问题,或者你的手机不支持。苹果用户没有,或者安卓用户没找到这个软件也没关系,不影响我们之后的步骤。
首先我们需要 ssh 连接路由器更改几个设置。输入以下几条命令
rootOpenWrt:~# uci set wireless.radio0.log_level=1
rootOpenWrt:~# uci commit wireless
rootOpenWrt:~# wifi up
rootOpenWrt:~# grep _level /var/run/hostapd-phy0.conf # 保证你的输出和下面对的上就行
logger_syslog_level=1
logger_stdout_level=1
这里我们做的是让 openwrt 的 log 打印更多东西。原本关于快速漫游的信息在 log 里是不显示的。
准备工作已经做好,现在你需拿出手机,打开监测漫游的软件,在房间里走来走去让手机漫游个几次。
网络百宝箱
在手机漫游的过程中,设备漫游的相关信息也会在路由器的 log 里被记录下来。这时候只要我们查看 log 数据就可以知道手机是否使用了快速漫游。
回到 ssh 窗口,输入 logread 命令并按下回车。这时你的命令行会打印一大堆 log。如果你发现 log 结尾有这样的内容
daemon.debug hostapd: wlan0: STA e0:…:30 WPA: FT authentication already completed – do not start 4-way handshake
那么你的快速漫游已经成功了。但是如果你发现你的 log 有这样的内容
Wed Nov 3 21:45:48 2021 daemon.debug hostapd: wlan0: STA 70:8a:09:df:f1:bc WPA: sending 1/4 msg of 4-Way Handshake
Wed Nov 3 21:45:48 2021 daemon.debug hostapd: wlan0: STA 70:8a:09:df:f1:bc WPA: received EAPOL-Key frame ( 2/4 Pairwise )
Wed Nov 3 21:45:48 2021 daemon.debug hostapd: wlan0: STA 70:8a:09:df:f1:bc WPA: sending 3/4 msg of 4-Way Handshake
Wed Nov 3 21:45:48 2021 daemon.debug hostapd: wlan0: STA 70:8a:09:df:f1:bc WPA: received EAPOL-Key frame ( 4/4 Pairwise )
那说明你的手机没有使用快速漫游,而是用了传统的龟速切换方式。要么你的手机不支持 802.11r,要么你的配置和你的手机不兼容。如果有别的报错的话,可以通过报错信息查看问题出在哪里。
有些小伙伴可能会说:诶不对啊,我看别人都是通过延迟和丢包看漫游有没有成功的呀!
在我看来,这种方法就是玄学。有丢包不一定是漫游的问题,没有丢包也可能是手机优化好(iPhone 就是如此)。不过玄学也不是没有可取之处。基本上正常连接无丢包的话,漫游时出现了 1 次丢包,90% 概率快速漫游没有工作;出现 2 次丢包,概率就是 99%。
总结
我觉得这篇文章对于 802.11r 讲解的也是比较全面了,如果有什么我说的不周到的、有疑问的也请在评论区提出
。快速漫游的 k v 协议在 openwrt 里也是个坑,不过没有 r 那么深,如果感兴趣的人多的话我也可能深入讲解一下。
我本来也是个小白,本着求知的心态在外网学习了一圈终于是搞懂了许多根本没有官方解释的深坑,但也还有很多东西等着我去学习。撰写这篇文章的时间点是 2022/8/20,本人这篇教学仅对这个时间点负责,很多问题以后 openwrt 也可能会修复(也可能不会)。
~