netstat — 为什么 IPv4 守护进程仅侦听 -A inet6 中列出的端口?

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。为什么?

答案1

默认情况下,如果您没有为 ApacheListen参数指定地址,它将使用地址处理 ipv6 地址IPv4-mapped IPv6。你可以看看阿帕奇ipv6

的输出netstat并不意味着 Apache 没有侦听 IPv4 地址。这是一个IPv4-mapped IPv6地址。

答案2

原因是所有 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 地址。

相关内容