如何正确配置 OpenWrt WPA3 + 802.11kvr
在优化家里Wi-Fi过程中,发现不管是中文英文,无线漫游、802.11kvr相关的视频帖子要么是简单的复制粘贴,要么夹杂在大量无效信息内,所以今天给大家总结一下我学到的东西。
很多Android手机不支持漫游,想退出,还来得及。
准备工作
安装支持 wps3 802.11kvr mesh 的 package1.
官方2只说了请安装完整版本 hostapd or wpad,你是装 hostapd 完整版还是 wpad 完整版。并且你猜哪个版本是完整版? wpad? wpad-wolfssl? wpad-openssl? wpad-mesh-wolfssl?
解释:这些包的源码都是一样的只是包含的组件不一样,推荐不要动 hostapd,只升级 wpad。推荐使用 wpad-wolfssl 因为它包含 wpa3+mesh+802.11r 最完整也最小体积。
回想一下你目前网络架构,你都准备用无线 802.11kvr 漫游了,说明你有多个AP,那你的 AP 开启 AP 模式了吗?
你先看这个中文教程开启AP模式再说吧,简单来说就是:改LAN IP -> 关 LAN DHCP -> 禁用 firewall, dnsmasq and odhcpd 服务.
因为 AP 不参加 DHCP,已连接设备列表只能看到mac+ip, 官方给了方法:手动把主路由 DHCP 记录导出到 AP 的 /etc/ethers 文件中。DHCP设备清单导出命令是:
cat /tmp/dhcp.leases | awk '{print $2" "$4}'
已禁用的 firewall, dnsmasq, odhcpd 服务会在升级固件后重新启用,可以把这个脚步添加到 系统->启动->本地启动脚本(看提示,不要粘贴到最后一行)。
# these services do not run on dumb APs for i in firewall dnsmasq odhcpd; do if /etc/init.d/"$i" enabled; then /etc/init.d/"$i" disable /etc/init.d/"$i" stop fi done
顺便说一下这个 Dumb AP 页面3,网页最底下有个
option igmp_snooping '1'
这个igmp指的是IPTV,DLNA 组播流,如果你的交换机不支持这个 snooping,组播流会淹没你的Wi-Fi,每时每刻都在给你的 Wi-Fi 推组播流,降低你的无线性能。snooping 开启后,只有在有人用到组播流的时候,才会推组播流,其它时候会被OpenWrt交换机或独立交换机掐掉组播流。
开始配置
写的越来越多了,直接开启吧~
TLDR:SSH进路由运行下面脚本
uci set wireless.default_radio0.ieee80211k=1
uci set wireless.default_radio0.wnm_sleep_mode=1
uci set wireless.default_radio0.bss_transition=1
uci set wireless.default_radio0.ieee80211r=1
uci set wireless.default_radio0.mobility_domain=8888
uci set wireless.default_radio0.ft_over_ds=0
uci set wireless.default_radio0.ft_psk_generate_local=0
uci set wireless.default_radio1.ieee80211k=1
uci set wireless.default_radio1.wnm_sleep_mode=1
uci set wireless.default_radio1.bss_transition=1
uci set wireless.default_radio1.ieee80211r=1
uci set wireless.default_radio1.mobility_domain=8888
uci set wireless.default_radio1.ft_over_ds=0
uci set wireless.default_radio1.ft_psk_generate_local=0
uci commit wireless
wifi reload
上面的命令会将下面的参数会写到 /etc/config/wireless
option ieee80211k '1'
option wnm_sleep_mode '1'
option bss_transition '1'
option ieee80211r '1'
option mobility_domain '8888'
option ft_over_ds '0'
option ft_psk_generate_local '0'
如果上面参数已经被你改坏掉了,可以删除 /etc/config/wireless
,使用 wifi config
重新生成配置。
802.11k, 官方 OpenWrt Luci没有此项设置,需手动添加
option ieee80211k '1'
来开启。国内很多 OpenWrt 是有luci配置选项的。802.11v, 同上。
option ieee80211v '1'
是多余的设置已被弃用wnm_sleep_mode
WiFi 客户端待机睡眠模式bss_transition
AP 会发生指令给 WiFi 客户端,推荐最佳信号的 AP 供链接,但是客户端连不连,AP 就管不到了。time_advertisement
广播同步时间,好像就是字面意思,无线数据包中包含时区信息,我也不清楚,OpenWrt邮件是这么说的,我觉得没啥用,不启用了。802.11r, 这个设置官方OpenWrt 已经集成到Luci网页里了。
重要:开了802.11r,部分设备会不兼容 WPA3 或者 WPA3-mixed,可能和系统版本无关,也可能无关,没有太多的数据,没办法找出规律,可以参考官方OpenWrt issue。
进入WEBUI,按照下面进行修改
- 802.11r
打勾
- NAS ID
不填
- 移动域/Mobility Domain
可以不填
- 重关联截止时间/Reassociation Deadline 填
20000
- FT protocol/FT 协议 选
FT over the Air
- 本地生成 PMK/Generate PMK locally
取消勾
- 剩下所有参数全部默认不修改。
WPA3 必须
取消勾
本地生成 PMK/Generate PMK locally,用户问了hostapd的人,必须option ft_psk_generate_local '0'
iOS 用户必须将 FT 改为 FT over the Air,
option ft_over_ds '0'
, 这个参数是从Cisco那边抄过来的,链接里还提到了option reassociation_deadline '20000'
option max_inactivity '60'
可以试试加了有没有(副)效果。iOS 提示
hostapd: nl80211: kernel reports: key addition failed
这个错误,OpenWrt开发者提到目前在TODO流程中NAS ID 为啥不填,OpenWrt Guide要求填,开发者说不填,OpenWrt会用mac代替,因为开发者改代码速度比官方Guide快而已,开发者在论坛回帖子,回复时想起来有个bug,立马提patch。
OpenWrt 开发者给出了他的参数,供参考。
config wifi-iface 'Xxx_radio1' option device 'radio1' option network 'lan' option mode 'ap' option ssid 'Xxx' option encryption 'sae' option key '***' option ieee80211w '2' option ieee80211r '1' option ft_psk_generate_local '0' option ft_over_ds '0' option ieee80211k '1' option bss_transition '1' option ieee80211v '1' option disassoc_low_ack '0'
- 802.11r
测试能否成功漫游
一般来说拿个iPhone,在两个AP直接来回晃悠就行了。 晃悠完了,来到 AP 看日志。
第一次连接AP,会出现
EAPOL-4WAY-HS-COMPLETED
漫游成功会出现
AP-STA-CONNECTED
老版本 OpenWrt 可能没有这个提示,需要手动调整
option log_level '1'
uci set wireless.radio0.log_level=1 uci set wireless.radio1.log_level=1 uci commit wireless wifi reload
这个提示说明漫游成功
WPA: FT authentication already completed - do not start 4-way handshake
经验
Wi-Fi 配置文件在
/etc/config/wireless
Wi-Fi 运行配置在
/var/run/hostapd-phy0.conf
/var/run/hostapd-phy1.conf
所有有关Wi-Fi的配置基本都在这里,很多自动生成的配置不保存在wireless里,只存在hosapd conf里。
很多 OpenWrt 参数可能会改变,修改前记得查源码4,查手册2,查官方论坛5
手机 Wi-Fi 网络工具APP
因为APP重名比较多,直接写包名+显示名 Android:
com.ubnt.usurvey
WiFiman, 最好看,好用。
net.techet.netanalyzerlite.an
Network Analyzer, 一般好用,功能多一点。
com.vrem.wifianalyzer
WiFi Analyzer (open-source), 扫描Wi-Fi的信息,可以看有没有开FT(漫游)。
iPhone:
com.dayananetworks.networkutilities
Network Utilities & Analyzer 功能足够多,但是因为 iPhone 不显示本地设备mac,聊胜于无。
还有一个工具,不好看,但功能最多。
net.he.NetworkUtility
or net.he.networktools
HE.NET Network Tools
BONUS: OpenWrt一键AP命令
懂自己在做什么的,可以一键复制粘贴,不懂的,请一行一行复制粘贴。
打开SSH,路由先联网,设置路由时间。 安装wpad-wolfssl软件包
opkg update
opkg remove wpad-mini
opkg remove wpad-basic
opkg remove wpad-basic-wolfssl
opkg install wpad-wolfssl
自定义下面脚本,IP地址、Wi-Fi密码等
uci set dhcp.lan.ignore=1
uci set dhcp.lan.dhcpv6=disabled
uci set dhcp.lan.ra=disabled
uci set network.lan.ipaddr='192.168.44.44'
uci set network.lan.gateway='192.168.44.1'
uci set network.lan.dns='192.168.44.1'
uci set network.globals.ula_prefix=''
uci set wireless.radio0.channel=auto
uci set wireless.radio0.disabled=0
uci set wireless.radio0.country=CN
uci set wireless.default_radio0.ssid=Gargoyle
uci set wireless.default_radio0.encryption=sae-mixed
uci set wireless.default_radio0.key=password
uci set wireless.default_radio0.ieee80211k=1
uci set wireless.default_radio0.wnm_sleep_mode=1
uci set wireless.default_radio0.bss_transition=1
uci set wireless.default_radio0.ieee80211r=1
uci set wireless.default_radio0.mobility_domain=8888
uci set wireless.default_radio0.ft_over_ds=0
uci set wireless.default_radio0.ft_psk_generate_local=0
uci set wireless.radio1.channel=auto
uci set wireless.radio1.disabled=0
uci set wireless.radio1.country=CN
uci set wireless.default_radio1.ssid=Gargoyle
uci set wireless.default_radio1.encryption=sae-mixed
uci set wireless.default_radio1.key=password
uci set wireless.default_radio1.ieee80211k=1
uci set wireless.default_radio1.wnm_sleep_mode=1
uci set wireless.default_radio1.bss_transition=1
uci set wireless.default_radio1.ieee80211r=1
uci set wireless.default_radio1.mobility_domain=8888
uci set wireless.default_radio1.ft_over_ds=0
uci set wireless.default_radio1.ft_psk_generate_local=0
uci set system.@system[0].hostname=Router
uci set system.@system[0].zonename=Asia/Shanghai
uci set system.@system[0].timezone=CST-8
uci commit
/etc/init.d/dnsmasq disable
/etc/init.d/odhcpd disable
/etc/init.d/firewall disable
reboot