无法在 debian squeeze 上使用 IPv4 映射的 IPv6

无法在 debian squeeze 上使用 IPv4 映射的 IPv6

我有一个正在测试 ipv6 的挤压盒...eth3 是接口...如果我设置一个“正常”ipv6 地址 ( ::101:c0a8:3132/120),我会看到预期的结果ifconfig...

eth3      Link encap:Ethernet  HWaddr 00:02:b3:9a:af:6d  
          inet6 addr: fe80::202:b3ff:fe9a:af6d/64 Scope:Link
          inet6 addr: ::101:c0a8:3132/120 Scope:Global

但如果我配置一个IPv4 映射的 IPv6 地址,我看不到部分地址...

[mpenning@hotcoffee EX4200_PC5448]$ sudo ip -6 addr del ::101:c0a8:3132/120 dev eth3
[mpenning@hotcoffee EX4200_PC5448]$ sudo ip -6 addr add ::ffff:192.168.13.236/120 dev eth3
[mpenning@hotcoffee EX4200_PC5448]$ ifconfig eth3
eth3      Link encap:Ethernet  HWaddr 00:02:b3:9a:af:6d  
          inet6 addr: 192.168.13.236/120 Scope:Global
          inet6 addr: fe80::202:b3ff:fe9a:af6d/64 Scope:Link

该地址不应该显示为::ffff:192.168.13.236/120而不是吗192.168.13.236/120

当分配 IPv4 映射的 IPv6 地址时,我也遇到了 ping 问题,所以现在我想知道这是否与 ifconfig 中的意外显示有关,或者另一端出现问题。

编辑:

使用ip addr show eth3...

[mpenning@hotcoffee ~]$ ip addr show eth3
5: eth3: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000
    link/ether 00:02:b3:9a:af:6d brd ff:ff:ff:ff:ff:ff
    inet6 ::ffff:192.168.13.236/120 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::202:b3ff:fe9a:af6d/64 scope link 
       valid_lft forever preferred_lft forever
[mpenning@hotcoffee ~]$

答案1

IPv4 映射的 IPv6 地址不应分配给 IPv6 接口或用于 IPv6 本机通信。至少在当前的 Linux 上不是这样。使用ip addr add, 不带-6标志并以正常 IPv4 表示法添加正常 IPv4 地址。

sudo ip addr add 192.168.13.236/24 dev eth3

并且再次强调,不要使用ifconfig.这是老的,已弃用,破损和被取代经过ip路由2。它不会正确显示 IPv6 地址,也不会在没有别名的情况下在同一接口上显示多个 IPv4 地址。


我将在下面的评论中澄清讨论,因为它太大,无法作为另一条评论发布。

将 IPv4 地址添加到 IPv6 堆栈是没有意义的,即使将它们转换为 IPv4 映射的 IPv6 地址也是如此。 IPv6协议栈处理IPv6地址并传输IPv6数据包; IPv4堆栈处理IPv4地址并传输IPv4数据包。

将地址添加到接口并 ping 它可能会起作用,可能是因为在将地址添加到接口的内核代码中缺少一些健全性检查。

IPv4 映射的 IPv6 地址的存在使得您可以使用 IPv6 套接字(重要提示:即应用程序级别)与 IPv4 主机进行通信。您无需将 IPv4 映射的 IPv6 地址添加到接口即可使用 IPv6 与其进行通信。尝试一下:

ssh ::ffff:127.0.0.1

即使 ::ffff:127.0.0.1 (IPv6) 未在环回接口 ( lo) 的 IPv6 堆栈中注册,它也会透明地工作。它之所以有效,是因为 127.0.0.1/8 (IPv4) 有效。即使您提供了 IPv6 地址,系统实际上也使用 IPv4 数据包。您可以使用wireshark 或tcpdump 检查这一点。当您使用绑定/侦听 IPv6 通配符地址的 IPv6 套接字接收 IPv4 数据包或连接时,这也有效。

请注意,ICMP 和 ping 的工作方式不同,因为 ICMP 套接字的 API 在 IPv4 和 IPv6 之间完全不同。ping6实际上使用给定的地址创建了一个原始 ICMPv6 数据包,这在线路中没有意义。在我看来,这可以安全地视为一个错误,ping6在将带有 IPv4 地址的 IPv6 数据包注入线路或允许此类地址存在于 IPv6 堆栈中之前,两者和内核都应该更早失败。

相关内容