Arch Linux iwd 配置静态 IP 踩坑记:从解析错误到稳定方案

Arch Linux iwd 配置静态 IP 踩坑记:从解析错误到稳定方案 问题背景在 Arch Linux 笔记本上使用 iwdiNet Wireless Daemon管理 WiFi 接口wlan0希望将无线 IP 从 DHCP 自动获取改为静态地址例如192.168.1.3/24。最初尝试直接编辑 iwd 的已知网络配置文件/var/lib/iwd/SSID.psk添加[IPv4]段来配置静态 IP结果遭遇一系列问题先报解析错误修正格式后仍然掉线最终改用 systemd-networkd 接管静态 IP 才获得稳定连接环境Arch Linux iwd 3.x systemd-networkd systemd-resolved 谬误溯源与踩坑记录1. 错误理解Address字段格式错误做法在/var/lib/iwd/SSID.psk的[IPv4]段中写入[IPv4] Address192.168.1.3/24 Gateway192.168.1.1 DNS192.168.1.1结果重启 iwd 后报错netconfig: Unable to parse IPv4.Address原因iwd 的[IPv4]段中Address字段只接受纯 IP 地址不支持 CIDR 写法。子网掩码必须通过单独的Netmask字段指定。正确写法[IPv4] Address192.168.1.3 Netmask255.255.255.0 Gateway192.168.1.1 DNS192.168.1.12. 格式修正后仍掉线将配置改为正确格式后解析错误消失但连接在connecting (netconfig)阶段断开。日志现象netconfig_dhcp6_event_handler() condition nc-v6_configured failed原因分析iwd 内置的 netconfig 在配置静态 IPv4 时仍会尝试联动 DHCPv6。若 DHCPv6 处理不当如网络不支持 IPv6 或配置冲突会导致整个网络配置失败连接断开。这表明 iwd 的静态 IP 配置在复杂网络环境下不够稳定。3. 重启 iwd 后不会自动重连执行systemctl restart iwd后wlan0接口停留在disconnected状态。需要手动执行iwctl station wlan0 connect SSID说明iwd 默认不会自动重连已知网络其自动连接行为autoconnect需要额外配置并非重启服务即自动连接。✅ 最终稳定方案iwd systemd-networkd 分工经过多次尝试最终采用职责分离的方案iwd 只负责 WiFi 连接L2 层认证、关联等无线链路建立systemd-networkd 负责 IP 配置L3 层静态 IP、路由、DNS 等步骤 1禁用 iwd 的网络配置功能编辑/etc/iwd/main.conf[General] EnableNetworkConfigurationfalse重启 iwd 服务sudo systemctl restart iwd步骤 2配置 systemd-networkd 管理 wlan0创建配置文件/etc/systemd/network/20-wlan.network[Match] Namewlan0 [Network] DHCPno Address192.168.1.3/24 Gateway192.168.1.1 DNS192.168.1.1 [Route] Gateway192.168.1.1说明此配置风格与有线接口如20-wired.network完全一致统一管理稳定可控。步骤 3启用并重启服务sudo systemctl enable --now systemd-networkd sudo systemctl restart systemd-networkd 源码验证与实测iwd 已知网络文件正确的[IPv4]段/var/lib/iwd/SSID.pskWPA2 网络开放网络是.open先看现有内容再追加[Settings] # 原内容... [Security] Passphrase... 原内容... [IPv4] Address192.168.1.3 Netmask255.255.255.0 Gateway192.168.1.1 DNS192.168.1.1注意文件 root 权限600读写需 sudoAddress不带/24。踩坑实测错误写法与掉线日志# 错误Address 带 CIDR → 解析失败 Address192.168.1.3/24 # 日志: netconfig: Unable to parse IPv4.Address 改对后仍掉线 → DHCPv6 联动问题 日志: netconfig_dhcp6_event_handler() condition nc-v6_configured failed 状态: connecting (netconfig) → disconnected最终方案systemd-networkd 接管静态 IP/etc/iwd/main.conf关闭 iwd 的 IP 配置[General] EnableNetworkConfigurationfalse [Network] NameResolvingServicesystemd新建/etc/systemd/network/20-wlan.network[Match] Namewlan0 [Network] DHCPno Address192.168.1.3/24 Gateway192.168.1.1 DNS192.168.1.1应用并验证sudo systemctl restart systemd-networkd sudo systemctl restart iwd sleep 8 ip -4 -brief addr show wlan0 # 期望: wlan0 UP 192.168.1.3/24 networkctl status wlan0 # 期望: State: routable (configured)实测按最终方案重启后wlan0 拿到静态 192.168.1.3/24、默认路由 static、网关 ping 通、networkctl显示routable (configured)稳定不掉线。 总结与建议iwd 静态 IP 配置有局限Address字段不支持 CIDR需分开写Netmask且其 netconfig 在静态 IPv4 下可能因 DHCPv6 联动而失败。重启 iwd 不自动连接需要手动iwctl station wlan0 connect或配置 autoconnect。推荐分工方案iwd 管无线连接systemd-networkd 管 IP 配置。这样既利用 iwd 的轻量快速连接又享受 systemd-networkd 稳定可靠的网络管理。配置统一无线与有线接口均通过/etc/systemd/network/*.network配置风格一致易于维护。通过以上步骤即可在 Arch Linux 上实现 iwd WiFi 连接的静态 IP 稳定配置。 速查与复用落地结论可复用方案核心原则iwd 管 WiFi 连接L2systemd-networkd 管 IP 配置L3职责分离最稳定。iwd 侧在/etc/iwd/main.conf中设置EnableNetworkConfigurationfalse关闭其网络配置功能。网络侧新建/etc/systemd/network/20-wlan.network配置[Match] Namewlan0以及静态Address、Gateway、DNS。备选方案若仍想使用 iwd 自带的 netconfig 配置静态 IP必须在[IPv4]段中分开写Address纯地址和Netmask并接受 DHCPv6 联动可能导致的掉线风险。适用范围Arch Linux iwd 3.x systemd-networkd无线静态 IP 场景与有线接口的20-wired.network配置风格一致便于统一管理。人类开发者速查改静态 IP 三连修正 iwd 配置文件编辑/var/lib/iwd/SSID.psk在[IPv4]段使用AddressNetmask分开写不要带/24。稳定方案切换在main.conf中关闭 netconfig并新建20-wlan.network文件。验证执行systemctl restart systemd-networkd iwd然后用networkctl status wlan0确认状态为routable (configured)。对话式 AI 速查问法示例用户可能提问「iwd 无线静态 IP 怎么配Address 报 Unable to parse / 配完掉线怎么办」回答要点Address 解析错误iwd 的Address字段不支持 CIDR 写法必须拆分为Address纯 IP和Netmask。配完掉线通常是 iwd 的 netconfig 在静态 IPv4 下联动 DHCPv6 失败所致。建议关闭 iwd 的网络配置EnableNetworkConfigurationfalse改用 systemd-networkd 接管。代码 Agent 速查一键配置脚本# 配置 iwd 禁用网络配置 sudo tee /etc/iwd/main.conf EOF [General] EnableNetworkConfigurationfalse [Network] NameResolvingServicesystemd EOF 创建 systemd-networkd 无线网络配置文件 sudo tee /etc/systemd/network/20-wlan.network EOF [Match] Namewlan0 [Network] DHCPno Address192.168.1.3/24 Gateway192.168.1.1 DNS192.168.1.1 EOF 重启服务并验证 sudo systemctl restart systemd-networkd iwd ip -4 -brief addr show wlan0