在 Linux 中,如何在启动时根据接口的 IPv4 地址自动为其分配 IPv6 地址?

在 Linux 中,如何在启动时根据接口的 IPv4 地址自动为其分配 IPv6 地址?

在 CentOS 6 机器上,我有一台带有 2 个 NIC 的服务器,eth0 和 eth1。eth0 的地址为 192.168.0.1。

我想创建一个脚本,它可以解析 eth0 的 IP 地址,并在启动时为 eth1 分配一个类似的 IPv6 地址。

在这种情况下,我希望 eth1 具有地址 fc00::192:168:0:1/64。

我知道为了分配这个地址,我必须运行命令

ip address add fc00::192:168:0:1/64 dev eth1

但是,我正在尝试找到一种方法,根据 eth0 的 IP 计算要分配给 eth1 的 IP,并在启动时运行该脚本。

我之所以这样做而不是静态地为两个接口分配地址,是因为我试图将此服务器变成虚拟机模板并使用新的 IP 设置自动部署它。不幸的是,我使用的工具实际上不支持 IPv6。

所以我想我的问题有两个部分:

  • 如何计算要分配的 IPv6 地址?
  • 如何在启动时计算该地址并将其分配给 eth1?

答案1

不确定这是否是个好主意,但抛开谨慎,我会做类似的事情:

hexip='fe80::'
ip=$(ip addr show eth0 | grep 'inet\b' | awk '{print $2}' | cut -d '/' -f1 | sed 's/\./:/g')
hexip="${hexip}${ip}"

ip address add "$hexip/64" dev eth1 

您需要在运行级别 3 之后运行的某些启动文件中使用它。我认为 /etc/rc.local 可以做到这一点?

答案2

这不是对您的问题的回答,而是来自具有丰富 IPv6 经验的人的一些建议......

这个想法可能看起来很有用,但在实践中,只需取 IPv4 地址的最后一部分并在 中手动配置它就容易得多ifcfg-eth0

我的一台机器是83.247.10.7,它所在的 IPv6 子网是2001:9e0:803::/64。此机制将为其提供2001:9e0:803:0:83:247:10:7。我只需手动提供即可2001:9e0:803::7。简单多了 :) 以下是我的ifcfg-eth0

DEVICE=eth0
BOOTPROTO=static
ONBOOT=yes

IPADDR=83.247.10.7
NETMASK=255.255.255.224

IPV6INIT=yes
IPV6ADDR=2001:9e0:803::7/64

这两行额外的代码不会杀死你,并且比一些试图自动执行这些琐碎事情的脚本要好得多。

问题中的例子使用了fc00::一个不存在的子网,在现实生活中你不会看到它,这确实让这个想法看起来不错。对于真实的地址,这个想法不会有太大帮助,甚至可能让情况变得更糟……

答案3

您实际上可以简单地将您的 IPv4 地址附加到 IPv6 前缀;IPv6 支持这种混合表示法。2001:0DB8::192.168.1.1 是一个完全有效的 IPv6 地址,无需将其转换为十六进制或替换点。

当然,您想测试这一点 - 仅仅因为它是有效的 IP 并不意味着 CentOS 可以正确处理它。

答案4

一个可能改进的建议。

提取 IPv4 地址的子网位和主机 ID 位。使用主机 ID 位作为 IPv6 主机的偏移量;使用子网位作为要使用的适当 IPv6 前缀的某些映射的查找。这样,您就可以灵活地匹配网络拓扑。

但实际上这应该都是 IPAM 解决方案的一部分,虚拟机应该使用 DHCP 和 DHCPv6 来接收寻址。但由于这是一个虚拟设备,因此可能依赖于您无法期望拥有的基础设施。

相关内容