Linux

netstat — 為什麼 IPv4 守護程序只監聽 -A inet6 中列出的埠?

  • October 30, 2017

我有一台電腦:

Linux superhost 3.2.0-4-amd64 #1 SMP Debian 3.2.60-1+deb7u3 x86_64 GNU/Linux

它在所有介面上的 80 埠上執行 Apache,但它沒有顯示在 中netstat -planA inet,但意外地可以在以下位置找到netstat -planA inet6

Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp6       0      0 :::5672                 :::*                    LISTEN      2402/beam.smp   
tcp6       0      0 :::111                  :::*                    LISTEN      1825/rpcbind    
tcp6       0      0 :::9200                 :::*                    LISTEN      2235/java       
tcp6       0      0 :::80                   :::*                    LISTEN      2533/apache2    
tcp6       0      0 :::34611                :::*                    LISTEN      1856/rpc.statd  
tcp6       0      0 :::9300                 :::*                    LISTEN      2235/java       
...
tcp6       0      0 10.0.176.93:80          10.0.76.98:53704        TIME_WAIT   -               
tcp6       0      0 10.0.176.93:80          10.0.76.98:53700        TIME_WAIT   -               

如上所示,我可以通過 TCP4 到達它。但是,即使這些連接也列在下面tcp6。為什麼?

預設情況下,如果您不為 ApacheListen參數指定地址,它將使用地址處理 ipv6 地址IPv4-mapped IPv6。你可以看看Apache ipv6

的輸出netstat並不意味著 Apache 沒有監聽 IPv4 地址。這是一個IPv4-mapped IPv6地址。

這是因為所有的 IPv4 地址也是 IPv6 地址。預留一小部分 IPv6 地址用於 IPv4 地址的一對一映射。例如,192.0.2.128可以通過 IPv6 地址訪問 IPv4 地址::ffff:192.0.2.128。這樣做是為了讓任何僅支持 IPv6 的應用程序仍然可以偵聽 IPv4 地址。請注意,這不能用於 IPv6 地址(未映射)與 IPv4 地址通信而不涉及其他事情,因為 IPv4 不知道如何處理 IPv6 地址(您可以使用 NAT,或其他解決方案儘管)。

由於所有 IPv4 地址都以 IPv6 表示,因此當要求netstat列出使用 IPv6 的應用程序時,您還將獲得 IPv4。

它可以表示10.0.176.93::ffff:10.0.176.93,甚至::ffff:a00:b05d,但應用程序開發人員選擇將其顯示為正常的點表示法 IPv4 地址。

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