为什么在 Linux 中使用 nmcli 设置静态地址时需要子网前缀?

为什么在 Linux 中使用 nmcli 设置静态地址时需要子网前缀?

这是概念问题。我理解为什么需要子网掩码来实现网络上数据包的正确寻址。但是,我不明白为什么 NetworkManager 在为这样的连接分配静态地址时需要知道架构 (/24):

nmcli con add type ethernet con-name test-lab ifname ens9 ip4 10.10.10.10/24

那么为什么呢?如果传达的是 /32 模式或者根本没有传达模式,会发生什么情况呢?

答案1

首先,NetworkManager 的要求与几乎所有其他操作系统的要求完全相同。Windows 要求您输入子网掩码;macOS 要求您输入子网掩码;同样,NetworkManager 也要求您输入子网掩码。

唯一的区别是 NM 更喜欢使用 CIDR“前缀长度”简写格式的网络掩码,而许多其他操作系统则要求使用点分十进制格式。但在 NM 中输入“/24”与在 Windows 中输入“255.255.255.0”相同。

(此外,它不被称为“模式”。它是前缀长度。)


因此,鉴于“/24”与“网络掩码 255.255.255.0”具有完全相同的含义,现在应该清楚为什么 NetworkManager 需要知道这个值:这就是它知道哪些地址属于其子网的方式,即哪些地址是“本地”的(可在第 2 层访问)以及哪些地址是“远程”的(需要网关)。

澄清一下:网络掩码不是用来检查你自己的地址的——当然,你自己的地址在定义上是本地的。相反,网络掩码用于检查其他与您通信的主机的地址。例如,当您将数据包发送到 8.8.8.8 或 10.10.10.9 时,您的 IP 堆栈需要知道在以太网报头中使用哪个目标 MAC 地址。

因此,在您的示例中,您指定的地址是 10.10.10.10它属于 /24 大小的网络(具体来说,10.10.10.0/24)。如果您运行ip route,您会注意到 /24 会导致 Linux 创建一个自动路由表条目,声明整个 10.10.10.0/24 地址范围可直接在“ens9”接口上访问,而无需网关。

$ ip route show
10.10.10.0/24 dev ens9 proto kernel scope link

这意味着例如 10.10.10.9 是“本地”(同一子网),如果您向其发送任何数据包,您的主机将直接通过“ens9”进行 ARP 查询其 MAC 地址,而无需使用网关。


NM 可以自动检测网络掩码吗?如果您使用 DHCP 进行地址分配,那么路由器将提供正确的网络掩码作为其 DHCP 提供的一部分。

NM 能否自动检测网络掩码对于静态地址? 否。IP 主机之间没有其他“内置”协调协议。网络的存在只是因为其所有设备恰好都以相同的方式配置。

(即使对于 IPv6 网络也是如此。它们确实有 ICMPv6 路由器通告作为 DHCP 的替代方案,但这仍然是必须设置路由器的功能。完全由非路由主机组成的网络仍然无法发现“正确的”网络掩码。)

事实上,如果某些主机不是以相同的方式配置。例如,如果您不小心让一台设备使用较短的前缀长度(/20 或 /16 而不是 /24),那么可能要过几年才会有人注意到。

您可以使用“/32”或“255.255.255.255”网络掩码吗?从技术上讲,这是可行的(有时在数据中心也可以做到),但您的路由必须略有不同。并非所有操作系统都允许以太网这样做(Linux 允许,但 Windows 不允许)。您应该打开一个单独的线程以获取有关在 LAN 上使用 /32 的更多信息。

相关内容