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


22

我有一台计算机,具有:

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
所有IPv4地址都直接映射到IPv6地址(反之亦然)。请参阅:en.wikipedia.org/wiki/IPv6#IPv4-mapped_IPv6_addresses
Patrick

4
请停止使用netstat?它死了- 十年前。使用了iproute2ss
mikeserv

Answers:


16

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

的输出netstat并不表示Apache未在IPv4地址上侦听。这是一个IPv4-mapped IPv6地址。


还有其他服务在侦听IPv4地址,但被netstat列为tcp6,例如ElasticSearch
Mischa Arefiev 2014年

我猜您已阅读@Patrick提供的Wikipedia链接。所有使用IPv4映射的IPv6地址的服务将显示tcp6在netstat的输出中。
beginer

14

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


谢谢,但是这不能回答为什么他们在正常工作时不会弹出-A inet
Mischa Arefiev 2014年

我想将侦听连接仅列为tcp6套接字的原因是因为它们确实是IPv6套接字,但具有附加功能,即它们也接受IPv4连接(如果配置为这样做)。套接字绑定到INADDR_ANY6,并且当IPv4连接进来时,该地址将映射到前缀为:: ffff:0000/96的IPv6地址。这是这些映射地址的唯一用途。请勿在电线上使用它们。
约翰·迈伦(JohanMyréen),
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.