無法在 debian 擠壓上使用 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 ~]$
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 堆棧中。