我有一台电脑:
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 地址。