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

afo*_*377 2 networking linux static-ip ip subnet

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

nmcli con add type ethernet con-name test-lab ifname ens9 ip4 10.10.10.10/24
Run Code Online (Sandbox Code Playgroud)

那么为什么,以及如果 /32 模式或根本没有模式通信会发生什么?

use*_*686 5

首先,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
Run Code Online (Sandbox Code Playgroud)

这意味着例如 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 的更多信息。