Linux

無法在 debian 擠壓上使用 IPv4 映射的 IPv6

  • April 23, 2011

我有一個正在測試 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 ~]$

IPv4 映射的 IPv6 地址不應分配給 IPv6 介面或用於 IPv6 本機通信。至少不在目前的 Linux 上。ip addr add使用, 不帶-6標誌並以普通 IPv4 表示法添加普通 IPv4 地址。

sudo ip addr add 192.168.13.236/24 dev eth3

而且,同樣,不要使用ifconfig. 它是舊的已棄用的、已損壞的並已被iproute2取代。它不會正確顯示 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) 未在 IPv6 堆棧中為環回介面 ( lo) 註冊,它也會透明地工作。它之所以有效,是因為 127.0.0.1/8 (IPv4) 是。即使您提供了 IPv6 地址,系統實際上也使用 IPv4 數據包。您可以使用 wireshark 或 tcpdump 進行檢查。當您使用綁定/偵聽 IPv6 萬用字元地址的 IPv6 套接字接收 IPv4 數據包或連接時,這也是有效的。

請注意,ICMP 和 ping 的工作方式不同,因為 ICMP 套接字的 API 在 IPv4 和 IPv6 之間完全不同。ping6實際上使用給定的地址創建了一個原始 ICMPv6 數據包,這在網路中沒有意義。IMO 這可以安全地被認為是一個錯誤,ping6在將帶有 IPv4 地址的 IPv6 數據包注入網路之前,核心應該提前失敗,或者允許這些地址存在於 IPv6 堆棧中。

引用自:https://unix.stackexchange.com/questions/11823