如何正确配置 OpenWrt WPA3 + 802.11kvr

在优化家里Wi-Fi过程中,发现不管是中文英文,无线漫游、802.11kvr相关的视频帖子要么是简单的复制粘贴,要么夹杂在大量无效信息内,所以今天给大家总结一下我学到的东西。

很多Android手机不支持漫游,想退出,还来得及。

准备工作

  1. 安装支持 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 最完整也最小体积

  2. 回想一下你目前网络架构,你都准备用无线 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
    
  3. 顺便说一下这个 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 重新生成配置。

  1. 802.11k, 官方 OpenWrt Luci没有此项设置,需手动添加option ieee80211k '1'来开启。国内很多 OpenWrt 是有luci配置选项的。

  2. 802.11v, 同上。

    option ieee80211v '1' 是多余的设置已被弃用

    wnm_sleep_mode WiFi 客户端待机睡眠模式

    bss_transition AP 会发生指令给 WiFi 客户端,推荐最佳信号的 AP 供链接,但是客户端连不连,AP 就管不到了。

    time_advertisement 广播同步时间,好像就是字面意思,无线数据包中包含时区信息,我也不清楚,OpenWrt邮件是这么说的,我觉得没啥用,不启用了。

  3. 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 Airoption 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'
    

测试能否成功漫游

一般来说拿个iPhone,在两个AP直接来回晃悠就行了。 晃悠完了,来到 AP 看日志。

  1. 第一次连接AP,会出现 EAPOL-4WAY-HS-COMPLETED

  2. 漫游成功会出现 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

openwrt

2160 Words

2022-11-24 03:50 +0000

comments powered by Disqus