Linux
netstat — 為什麼 IPv4 守護程序只監聽 -A inet6 中列出的埠?
我有一台電腦:
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
。為什麼?
預設情況下,如果您不為 Apache
Listen
參數指定地址,它將使用地址處理 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 地址。