运维笔记:NetworkManager shared 模式给共享客户端固定 IP
内容提要
在Manjaro Linux上,通过NetworkManager的shared模式将笔记本的enp8s0网口共享给下游设备上网。默认DHCP动态分配IP,为固定设备IP为10.42.0.2,需在/etc/NetworkManager/dnsmasq-shared.d/目录下创建配置文件,添加dhcp-host静态绑定,然后重连共享连接使配置生效,最后客户端重新获取IP即可。
延伸解读
为什么固定IP要选10.42.0.2
NetworkManager的shared模式固定使用10.42.0.1作为网关,默认DHCP动态池为10.42.0.10-254。选择10.42.0.2作为静态IP,既避开了动态池范围,又紧邻网关,便于记忆和管理。这种设计避免了与动态分配的IP冲突,确保设备始终获得同一地址,为后续端口转发和固定访问提供了稳定基础。
配置目录与系统dnsmasq的区别
shared模式启动的dnsmasq实例使用--conf-file=/dev/null,完全忽略系统/etc/dnsmasq.conf,其配置入口是/etc/NetworkManager/dnsmasq-shared.d/目录。该实例由NetworkManager管理,生命周期与共享连接绑定,重载配置需重连连接而非重启dnsmasq.service。切勿启用系统dnsmasq.service,否则会与内置实例抢占53/67端口,导致DHCP和DNS冲突。
客户端重获IP的必要性
静态绑定配置完成后,客户端不会立即获得新IP,必须重新发起DHCP请求。Linux客户端可执行dhclient -r && dhclient,嵌入式设备或手机则需拔插网线或重启。验证时可通过查看租约文件、ping和arp表确认绑定生效。这一步常被忽略,导致配置看似正确却未生效。
Q&A
NetworkManager shared 模式下,如何给下游设备固定 IP?
在 /etc/NetworkManager/dnsmasq-shared.d/ 目录下创建配置文件,添加 dhcp-host 静态绑定,格式为 dhcp-host=<MAC>,<IP>,<hostname>,infinite,然后重连共享连接使配置生效,最后客户端重新获取 IP。
NetworkManager shared 模式的 DHCP 配置文件放在哪里?
配置文件放在 /etc/NetworkManager/dnsmasq-shared.d/ 目录下,而不是 /etc/dnsmasq.conf。因为 NM 内置的 dnsmasq 实例使用 --conf-dir 参数指定该目录。
为什么不能通过 systemctl restart dnsmasq 来重载 shared 模式的 DHCP 配置?
因为 shared 模式的 dnsmasq 实例由 NetworkManager 管理,生命周期挂在共享连接上,不归 dnsmasq.service 管。重载配置需要重连共享连接,而不是重启系统服务。
dhcp-host 配置中 infinite 参数有什么作用?
infinite 表示永久租约,使指定 IP 永远属于该设备,不会过期。
配置静态绑定后,客户端 IP 会自动变成固定 IP 吗?
不会。静态绑定只在客户端下次续约或重连时生效,需要客户端重新获取 IP(如拔插网线或重启设备)。
如何验证 dnsmasq 配置语法是否正确?
使用命令 sudo dnsmasq --test --conf-file=/dev/null --conf-dir=/etc/NetworkManager/dnsmasq-shared.d 进行语法检查,输出 syntax check OK 表示配置正确。
为什么固定 IP 选择 10.42.0.2 而不是动态池内的地址?
因为 10.42.0.2 在默认动态池 10.42.0.10-254 之外,dnsmasq 不会动态发出,避免冲突。