当前位置: 首页 > 知识库问答 >
问题:

如何计算本地ipv6地址?

龙德润
2023-03-14

所以有几个网站会为你计算你的链接本地ipv6地址,就像这里的这个。

尽管如此,它并没有给出任何有用的关于这个地址是如何计算的,也没有输入参数是什么。那么,如果一个人知道自己的ipv4地址、子网掩码和网关地址,计算链路本地ipv6地址的过程(或算法)是什么?我正在使用SCTP套接字做一个项目,该项目使用ISATAP网络隧道和LL ipv6地址用于构建ISATAP地址。

共有3个答案

葛雨华
2023-03-14

前面的回答没有注意到,在使用ISATAP时,有一个定义的过程用于从IPv4地址生成链路本地IPv6地址,并且有一个不同的过程用于从MAC地址生成链路本地IPv6地址。这两件事无关。

对于ISATAP,32位IPv4地址前面加上fe80::200:5efe或fe80::200:5efe的96位,以获得128位IPv6链路本地地址。

对于MAC到IPv6,将48位MAC地址一分为二,中间插入16位,这些位为ff:fe,然后用64位链路本地前缀fe80::将其前置,最后翻转第5个IPv6段中的第7位,以获得128位IPv6链路本地地址。

下面的代码提供了一些示例,展示了如何使用IPAddress库在Java或Go中进行转换。免责声明:我是这些库的项目经理。

这些示例还有助于可视化上述转换。

开始:

func convertToIsatap(ipv4Str string, isGlobal bool) string {
    ipv4Address := ipaddr.NewIPAddressString(ipv4Str).GetAddress().ToIPv4()
    zero := &ipaddr.IPv6AddressSegment{}
    segments := make([]*ipaddr.IPv6AddressSegment, ipaddr.IPv6SegmentCount)
    segments[1], segments[2], segments[3], segments[4] = zero, zero, zero, zero
    segments[0] = ipaddr.NewIPv6Segment(0xfe80)
    segments[5] = ipaddr.NewIPv6Segment(0x5efe)
    if isGlobal {
        segments[4] = ipaddr.NewIPv6Segment(0x200)
    }
    ipv6Address, _ := ipv4Address.GetIPv6Address(ipaddr.NewIPv6Section(segments))
    return ipv6Address.String()
}

func convertToLinkLocalIPv6(macAddr string) string {
    macAddress := ipaddr.NewMACAddressString(macAddr).GetAddress()
    ipv6LinkLocal, _ := macAddress.ToLinkLocalIPv6()
    return ipv6LinkLocal.String()
}

fmt.Println("1.2.3.4 becomes ISATAP " + 
    convertToIsatap("1.2.3.4", true))
fmt.Println("aa:bb:cc:11:22:33 becomes " + 
    convertToLinkLocalIPv6("aa:bb:cc:11:22:33"))

爪哇:

static String convertToIsatap(String ipv4Str, boolean isGlobal) {
    IPv4Address ipv4Address = new IPAddressString(ipv4Str).getAddress().toIPv4();
    IPv6AddressSegment zeroSeg = new IPv6AddressSegment(0);
    IPv6AddressSegment segments[] = 
        new IPv6AddressSegment[IPv6Address.SEGMENT_COUNT - 2];
    segments[1] = segments[2] = segments[3] = segments[4] = zeroSeg;
    segments[0] = new IPv6AddressSegment(0xfe80);
    segments[5] = new IPv6AddressSegment(0x5efe);
    if(isGlobal) {
        segments[4] = new IPv6AddressSegment(0x200);
    }
    return ipv4Address.getIPv6Address(
        new IPv6AddressSection(segments)).toString();
}

static String convertToLinkLocalIPv6(String  macStr) {
    MACAddress macAddress = new MACAddressString(macStr).getAddress();
    return macAddress.toLinkLocalIPv6().toString();
}

System.out.println("1.2.3.4 becomes ISATAP " +
    convertToIsatap("1.2.3.4", true));
System.out.println("aa:bb:cc:11:22:33 becomes " +
    convertToLinkLocalIPv6("aa:bb:cc:11:22:33"));

两个示例的输出相同:

1.2.3.4 becomes ISATAP fe80::200:5efe:102:304
aa:bb:cc:11:22:33 becomes fe80::a8bb:ccff:fe11:2233
王豪
2023-03-14

链路本地地址可以根据RFC 4862基于MAC地址,也可以根据RFC 4941随机生成。

通常情况下,这应该限制在全局范围内,但一些系统会将这种隐私扩展实现扩展到本地范围。按照serverfault上的问题进行讨论。

薛楷
2023-03-14

RFC 4291的附录A描述了从MAC地址计算修改后的EUI-64的方法。一旦修改了EUI-64,只需将其放在地址的低64位,并将fe80::放在高64位。

基本上,你翻转MAC地址的第7位,然后打包它的前24位(包括翻转的位),然后是fffe,然后是MAC地址的较低24位,总共64位。

话虽如此,您的问题是如何从IPv4地址和子网掩码派生链路本地地址。你不能这么做。IPv4地址和子网掩码(如果确实存在的话——IPv6不要求IPv4在同一接口上运行)与IPv6地址无关,二者没有任何关联。IPv4网关地址(同样,如果有)的相关性更低。

 类似资料:
  • 我检查了下面的代码以获取ipv6地址,这段代码返回了全局单播地址,比如“2001:x:x…”。但我想获得链接本地地址,比如“fe80:…”。如何使用以下代码获取链接本地地址?

  • 问题内容: 我有使用地址的应用程序(它存储它们的时间很长),因此它只了解地址。 可以将地址转换为with 吗? 问题答案: 尽管IPv4地址范围具有等效的IPv6,但是您不能将所有IPv6地址都转换为IPv4-IPv6地址比IPv4地址更多。 解决此问题的唯一明智的方法是更新您的应用程序,以便能够理解和存储IPv6地址。

  • 我无法理解为什么这个命令不起作用: 注意:我已经用把上面的链接本地地址弄错了,但我有一些有效的链接本地ipv6地址是端口号。 我得到了一个错误: 我也试着放单引号/双引号,但结果是同样的错误: 我使用的是OpenSSL 1.1.0f版本,它应该支持IPv6。 使用IPv4地址,它可以工作。

  • 此函数创建sockaddr_in6: 基本上,如果地址是IPv4地址,我会在它前面加上,并将该族设置为af_inet。 这有可能做到。如果是,我做错了什么?

  • 以下是托管Web服务器的机器的ipconfig输出: 以太网适配器局域网连接: 特定于连接的DNS后缀:链接本地IPv6地址…:fe80::f85b:4256:ee76:24a4∗IPv4地址………:10.213.254.119子网掩码………:255.255.255.0默认网关……:10.213.254.252 我可以使用以下方式访问该网站:http://10.213.254.119/test“现

  • 如何在cmd上运行csr生成命令。exe openssl req-节点-newkey rsa: 2048-keyoutwww_mydomain_com.key-outwww_mydomain_com.csr-subj"/C=BB/ST=CCC/L=DDD/O=EEE。/OU=IT/CN=mydomain.com"