使用网络和广播 IPv4 地址进行正常单播流量

使用网络和广播 IPv4 地址进行正常单播流量

鉴于目前 IPv4 地址已耗尽,我想尝试使用 /29 前缀的网络和广播地址。

这可能吗?

我从 Hetzner 租用了一个 /29,并将各个 IP 分配给在专用服务器上运行的虚拟机。

服务器本身具有来自不同子网的另一个 IPv4 地址。

答案1

这是仅适用于 Linux 的答案(但至少提出的第二种方法不是专门针对 Linux 的,因此可能也可以与其他操作系统一起使用)。

这里有三种方法可用于 Linux 服务器(此处充当路由器)和运行 Linux 的虚拟机。第一种方法只是为了帮助介绍第三种方法。应该使用第二种或第三种方法,而不是第一种方法。所有这三种方法可以一起使用(即:一些虚拟机使用一种方法,其他虚拟机使用另一种方法,Linux 服务器充当路由器时也是如此)。

在下面的例子中,我将假设 IP 地址块为 192.0.2.0/29,并且此块中的服务器 IP 为 192.0.2.1/29,该 IP 直接设置在桥接接口上(虚拟化软件通常这样做),名为bridge0。虚拟机将有一个eth0界面。


像往常一样在 Linux 上配置标准 /29 LAN,但删除第一个和最后一个 IP 地址的特殊广播角色

  • 优点:...有助于介绍第三种方法。
  • 缺点:使用技巧,每次网络接口被管理性地关闭然后打开或 IP 地址发生变化时都必须再次执行此操作。必须应用接口已启动,可能出现轻微的交通中断。

一旦添加了地址并启动了接口,当地的路由表接收两个广播地址:网络块的第一个和最后一个:

# ip address add 192.0.2.2/29 dev eth0
# ip link set dev eth0 up
# ip route show table local dev eth0
broadcast 192.0.2.0 proto kernel scope link src 192.0.2.2 
local 192.0.2.2 proto kernel scope host src 192.0.2.2 
broadcast 192.0.2.7 proto kernel scope link src 192.0.2.2 

只需删除这两个额外的播送条目删除了网络和广播地址的特殊角色,将它们转换为通信中的普通单播 IP 地址:

# ip route flush table local dev eth0 type broadcast
# ip route show table local dev eth0
local 192.0.2.2 proto kernel scope host src 192.0.2.2 

在完成之前,此系统可能无法与 192.0.2.0 和 192.0.2.7 正常通信。系统必须具有自定义配置设置才能在启动时或打开接口时执行此操作(up例如/etc/network/interface对于一些类似 Debian 的系统)。

和往常一样,向服务器添加默认路由:

# ip route add default via 192.0.2.1

对于使用 192.0.2.0 和 192.0.2.7 的系统,也执行了同样的操作。这些系统可能会出现与任何其他系统,直到广播路由被删除。

就是这样。但是,如果接口关闭/打开或其 IP 地址发生变化,则必须再次执行此操作,因为每次发生这种情况时,内核都会自动重新添加本地表中的广播路由。

如果某些虚拟机无法接受此设置(例如:不运行 Linux)或以下选择,则应对它们以及使用 192.0.2.0 和 192.0.2.7 的虚拟机(因此涉及至少 3 个虚拟机)进行隔离(PVLAN)(例如是否可以在 Linux 桥上启用端口隔离?)。


对 /29 LAN 中的任何 IP 地址使用 /32 地址和 /32 路由

  • 优点:与某些主机提供商描述的故障转移 IP 设置非常相似(这里的例子不太清楚),因此可能已经有适用于各种操作系统的文档。
  • 缺点:要求每个对等体设置一条路由。

虽然接口仍然是第 2 层的(虚拟)以太网接口,并且仍然会像往常一样使用 ARP 来解析底层的 IPv4 地址,但所有路由都将像第 3 层点对点路由一样添加。

例如,在使用 192.0.2.0 IP 地址的系统上,地址将按如下方式添加:

# ip address add 192.0.2.0/32 dev eth0

不会在主要的路由表,并且只有范围主机路线当地的表。路线主要的现在必须手动添加路由表:

# ip route add 192.0.2.1/32 dev eth0

前两个命令(/32 地址 + 一个 /32 路由,可能到路由器)可以选择缩写为一个命令,如下所示:

# ip address add 192.0.2.0 peer 192.0.2.1/32 dev eth0

好处是,当接口关闭/启动时,内核会自动重新添加路由。

仍然必须像往常一样添加默认路由:

# ip route add default via 192.0.2.1

如果该虚拟机必须与其他虚拟机通信,只需根据需要添加其特定的 /32 路由:

# ip route add 192.0.2.2/32 dev eth0
# ip route add 192.0.2.3/32 dev eth0
# ip route add 192.0.2.4/32 dev eth0
# ip route add 192.0.2.5/32 dev eth0
# ip route add 192.0.2.6/32 dev eth0
# ip route add 192.0.2.7/32 dev eth0

兼顾两者的优势:设置 /32 地址,手动添加 /29 路由

  • 优点:简单
  • 缺点:我看不出有什么缺点,只是我不知道非 Linux 的对应产品。

添加一个 /32 地址(同样,没有特殊的播送路线会自动添加到当地的路由表)并使用通常的 /29 路由手动完成,该路由不会自动添加到主要的内核的路由表:

# ip address add 192.0.2.3/32 dev eth0
# ip route add 192.0.2.0/29 dev eth0
# ip route add default via 192.0.2.1

# ip route show table local dev eth0
local 192.0.2.3 proto kernel scope host src 192.0.2.3 

结果与第一种情况相同,只是 Linux 内核没有自动在当地的路由表,这样当发生 down/up 等更改时就不必删除它们。然后必须手动重新添加 LAN 路由。

相关内容