netstat: ¿por qué los demonios IPv4 escuchan los puertos enumerados solo en -A inet6?

22

Tengo una computadora con:

Linux superhost 3.2.0-4-amd64 #1 SMP Debian 3.2.60-1+deb7u3 x86_64 GNU/Linux

Ejecuta Apache en el puerto 80 en todas las interfaces, y no aparece en netstat -planA inet, sin embargo, inesperadamente se puede encontrar en 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   -               

Puedo alcanzarlo por TCP4 muy bien, como se ve arriba. Sin embargo, incluso estas conexiones se enumeran a continuación tcp6. ¿Por qué?

Mischa Arefiev
fuente
1
Todas las direcciones IPv4 se asignan directamente a las direcciones IPv6 (pero no al revés). Ver: en.wikipedia.org/wiki/IPv6#IPv4-mapped_IPv6_addresses
Patrick
44
por favor deja de usar netstat? murió hace una década . Use iproute2 'sss
mikeserv

Respuestas:

16

De manera predeterminada, si no especifica la dirección del Listenparámetro Apache , maneja la dirección ipv6 usando IPv4-mapped IPv6direcciones. Puedes echar un vistazo en Apache ipv6

La salida de netstatno significa que Apache no esté escuchando en la dirección IPv4. Es una IPv4-mapped IPv6direccion.

principiante
fuente
Hay otros servicios que escuchan direcciones IPv4 pero que netstat enumera como tcp6, por ejemplo, ElasticSearch
Mischa Arefiev
Supongo que leíste el enlace de wikipedia proporcionado por @Patrick. Todos los servicios que utilizan la dirección IPv6 asignada a IPv4 se mostrarán en tcp6la salida de netstat.
principiante
14

La razón de esto es porque todas las direcciones IPv4 también son direcciones IPv6. Se apartó un pequeño rango de direcciones IPv6 para ser utilizado para la asignación individual de direcciones IPv4. Por ejemplo, 192.0.2.128se puede acceder a la dirección IPv4 a través de la dirección IPv6 ::ffff:192.0.2.128. Esto se hizo para que todas las aplicaciones que solo admitan IPv6 puedan escuchar en direcciones IPv4. Tenga en cuenta que esto no se puede usar para una dirección IPv6 (no asignada) para hablar con una dirección IPv4 sin otras cosas involucradas, ya que IPv4 no sabrá cómo manejar la dirección IPv6 (puede usar NAT u otras soluciones aunque).

Dado que todas las direcciones IPv4 están representadas en IPv6, al solicitar netstatuna lista de aplicaciones que utilizan IPv6, también obtendrá IPv4.
Podría representarse 10.0.176.93como ::ffff:10.0.176.93, o incluso ::ffff:a00:b05d, pero los desarrolladores de la aplicación optaron por mostrarlo como una dirección IPv4 de notación punteada regular.

Patricio
fuente
Gracias, pero esto no responde por qué no aparecen cuando lo hacen regularmente-A inet
Mischa Arefiev
Supongo que la razón por la que las conexiones de escucha solo se enumeran como sockets tcp6 es porque realmente son sockets IPv6, pero con la característica adicional de que también aceptan conexiones IPv4, si están configuradas para hacerlo. Los sockets están vinculados a INADDR_ANY6, y cuando entra una conexión IPv4, la dirección se asigna a una dirección IPv6 con el prefijo :: ffff: 0000/96. Este es el único uso para estas direcciones asignadas; no deben usarse en el cable.
Johan Myréen