¿Por qué puedo acceder a un servidor mediante una dirección IP parcial?

10

En mi red tengo un servidor conocido por la dirección IP 10.0.0.15. Por accidente, descubrí que el comando: ping 10.0.15resulta en

64 bytes from 10.0.0.15: icmp_seq=1 ttl=64 time=9.09 ms

... entonces el servidor correcto responde al ping. Incluso cuando lo intento: ping 10.15obtengo un resultado comparable. Además, telnet a las direcciones parciales funciona como se esperaba. Sin embargo, SSH falla. ¿Por qué los paquetes enviados a una dirección parcial llegan al servidor correcto?

wie5Ooma
fuente
no es una dirección parcial ... así que el título es un poco engañoso aquí ...
Rory Alsop
1
ssh debería poder conectarse a dicha dirección (porque se asigna al mismo valor que realmente se pasa a las llamadas de socket) pero no reconocerá la clave del host como coincidente con una entrada conocido_hosts para la dirección 'adecuada', con un resultado que depende de cómo usted (o su administrador) ha configurado la comprobación de la clave del host.
dave_thompson_085
Para obtener más diversión sobre las representaciones de texto de las direcciones IP, consulte mi respuesta anterior relacionada con serverfault: serverfault.com/a/837667/355827
ilkkachu

Respuestas:

18

Esa es una forma permitida de acuerdo con la inet_aton(3)función docs:

DESCRIPTION
       inet_aton() converts the Internet host address cp from  the  IPv4  num‐
       bers-and-dots  notation  into  binary  form (in network byte order) and
       stores it in the structure that inp  points  to.   inet_aton()  returns
       nonzero  if the address is valid, zero if not.  The address supplied in
       cp can have one of the following forms:

       a.b.c.d   Each of the four  numeric  parts  specifies  a  byte  of  the
                 address;  the  bytes  are  assigned in left-to-right order to
                 produce the binary address.

       a.b.c     Parts a and b specify the  first  two  bytes  of  the  binary
                 address.   Part  c  is  interpreted  as  a  16-bit value that
                 defines the rightmost two bytes of the binary address.   This
                 notation  is  suitable for specifying (outmoded) Class B net‐
                 work addresses.

       a.b       Part a specifies the first byte of the binary address.   Part
                 b is interpreted as a 24-bit value that defines the rightmost
                 three bytes of the binary address.  This notation is suitable
                 for specifying (outmoded) Class C network addresses.

       a         The  value  a is interpreted as a 32-bit value that is stored
                 directly into the binary address without any byte  rearrange‐
                 ment.

P.ej

$ perl -MSocket=inet_aton,inet_ntoa -E 'say inet_ntoa(inet_aton("10.0.15"))'
10.0.0.15
$ perl -MSocket=inet_aton,inet_ntoa -E 'say inet_ntoa(inet_aton("10.15"))'
10.0.0.15
$ 

Sin embargo, en estos días probablemente sería mejor usar el getaddrinfoo inet_ntopllama a soporte para IPv6. El material de "Clase B" se convirtió en legado en 1994 más o menos ahora que tenemos CIDR y /24...

Oye, también puedes darle un gran número entero (pero no lo hagas)

$ perl -MSocket=inet_aton,inet_ntoa -E 'say inet_ntoa(inet_aton("2130706433"))'
127.0.0.1
$ getent hosts 2130706433
127.0.0.1       2130706433
$ ssh 2130706433
The authenticity of host '2130706433 (127.0.0.1)' can't be established.
...

(Esto puede no ser portátil a otro Unix; en particular OpenBSD no puede resolver 2130706433 ...)

thrig
fuente
1
Para divertirse aún más, como debería decir el siguiente párrafo del documento (y POSIX lo hace), cada número se analiza como fuente C, donde el principal 0significa octal y / 0xo 0Xhexadecimal, por lo que 010.020.030.040 es en realidad la dirección generalmente escrita como 8.16.24.32 . Los phishers solían hacer esto para 'ocultar' la identidad del host en URL maliciosas; No he mirado recientemente para ver si todavía lo hacen.
dave_thompson_085