![对同一台服务器计算机上不同接口的 IP 地址有什么要求?](https://linux22.com/image/227235/%E5%AF%B9%E5%90%8C%E4%B8%80%E5%8F%B0%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%AE%A1%E7%AE%97%E6%9C%BA%E4%B8%8A%E4%B8%8D%E5%90%8C%E6%8E%A5%E5%8F%A3%E7%9A%84%20IP%20%E5%9C%B0%E5%9D%80%E6%9C%89%E4%BB%80%E4%B9%88%E8%A6%81%E6%B1%82%EF%BC%9F.png)
https://wiki.archlinux.org/title/Internet_sharing
2.1 静态IP地址
在服务器计算机上,为连接到其他计算机的接口分配静态 IPv4 地址。该地址的前 3 个字节不能与另一个接口的前 3 个字节完全相同,除非两个接口的网络掩码都严格大于 /24。
# ip link set up dev net0 # ip addr add 192.168.123.100/24 dev net0 # arbitrary address
“此地址的前 3 个字节不能与另一个接口的前 3 个字节完全相同,除非两个接口的网络掩码都严格大于 /24”是什么意思?这是否意味着服务器计算机上不同接口的网络不能重叠?
为什么有这样的要求?
谢谢。
答案1
这个描述实际上是正确的,但在技术上是不正确的,而且模糊且写得不好。
对于 C 类网络,IP 地址的前三个字节是网络地址。许多网络是C类,但也有本描述省略的A类和B类网络以及“网络掩码严格大于/24”,因此至少是遗漏错误。但由于其他原因它也是错误的。
为了以技术上更准确、更详细的方式描述这一点,IP 地址分为两部分:网络地址和机器地址。它们由网络掩码隔离。网络掩码 /24 对应于 IP 地址 255.255.255.0。例如,如果 IP 地址是 192.168.100.1/24,则网络地址(应用网络掩码)将为192.168.100.0
,机器地址部分将为.1
。 B 类网络地址为 /16 或 255.255.0.0,网络地址为192.168
,机器地址部分为.100.1
。类似地,A 类地址对应于网络掩码 /8。
/ 后面的数字表示 IP 地址左侧属于网络地址的位数。 /2 和 /32 之间的网络掩码大小在技术上是可行的,但只有 /8 和 /29 之间才是实用的。
因此,问题中的文本暗示的是,同一台计算机上不能有两个具有相同网络地址的接口。传统上,如果您这样做,那么从机器发出的网络流量将不知道使用哪个接口来访问网络。
然而,即使这样也是错误的。通过给予接口优先级来解决此问题是可能的(而且很简单),以便始终选择其中一个接口作为主要接口。但是,从外部发送到第二个接口的流量更愿意由第一个接口应答,并且外部计算机不希望从与流量发送到的 IP 地址不同的 IP 地址获得响应。
但即使这个问题也可以解决。现代操作系统允许按接口标记传入流量,以便响应在其传入的同一接口上发送出去,从而完全有可能拥有两个具有两个不同 IP 地址但具有相同网络地址(并且位于同一网络地址)的接口。网络)功能齐全。
此外,还可以使用绑定和组合将同一网络上同一 IP 地址下的多个接口分组在一起。这必须得到主机操作系统和上游交换机的支持。这样做有两个原因:1)允许冗余接口,因此如果一个接口出现故障,其他接口可以接管2)允许接口之间共享带宽,以将主机的带宽增加到超出单个接口的最大吞吐量。
总之,问题中引用的陈述在过去的某个时间可能是部分正确的,当时操作系统内的 IP 路由要简单得多,并且不存在绑定和分组。但即便如此,该声明的措辞也非常糟糕,没有包括网络地址可能小于 /24 的情况,也没有解释原因。在今天的网络中,这种说法是完全错误的。
另请注意,即使是非常早期的 Linux 版本也支持将多个接口路由到同一网络(尽管其配置已更改多次),并且非常早期的 Linux 版本还支持绑定和组合。这两个功能可能早于 Arch Linux,因此除非本段断章取义地解释了这一点,否则它可能永远不会正确。
话虽如此,配置多个接口使用同一网络是复杂而棘手的,因此在简单的配置中,每个接口有必要具有不同的网络地址,这使得该声明实用,即使不正确。