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

Mis*_*iev 27 linux debian ipv6 netstat ipv4

我有一台电脑:

Linux superhost 3.2.0-4-amd64 #1 SMP Debian 3.2.60-1+deb7u3 x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud)

它在所有接口上的端口 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   -               
Run Code Online (Sandbox Code Playgroud)

如上所示,我可以通过 TCP4 很好地访问它。但是,即使是这些连接也列在 下tcp6。为什么?

beg*_*ner 20

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

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


phe*_*mer 18

这是因为所有 IPv4 地址也是 IPv6 地址。留出一小部分 IPv6 地址用于 IPv4 地址的一对一映射。例如,IPv4 地址192.0.2.128可通过 IPv6 地址访问::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 地址。