运维笔记:NetworkManager shared 模式给共享客户端固定 IP

💡 原文中文,约4000字,阅读约需10分钟。
📝

内容提要

在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 不会动态发出,避免冲突。

🏷️

标签

➡️

继续阅读