Por que posso acessar um servidor por um endereço IP parcial?

10

Na minha rede, tenho um servidor conhecido pelo endereço IP 10.0.0.15. Por acidente, descobri que o comando: ping 10.0.15resulta em

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

... para que o servidor correto responda ao ping. Mesmo quando tento: ping 10.15obtenho um resultado comparável. Além disso, o telnet para os endereços parciais funciona conforme o esperado. No entanto, o SSH falha. Por que os pacotes enviados para um endereço parcial chegam ao servidor correto?

wie5Ooma
fonte
não é um endereço parcial ... então o título é um pouco enganador aqui ...
Rory Alsop
1
O ssh deve conseguir se conectar a um endereço desse tipo (porque ele mapeia para o mesmo valor realmente transmitido às chamadas de soquete), mas não reconhecerá a chave do host como correspondendo a uma entrada known_hosts para o endereço 'adequado', com o resultado dependendo de como você (ou seu administrador) configurou a verificação de chave do host.
precisa saber é o seguinte
Para se divertir adicional sobre representações de texto de endereços IP, ver a minha, a resposta mais velho relacionado no serverfault: serverfault.com/a/837667/355827
ilkkachu

Respostas:

18

Esse é um formulário permitido de acordo com a inet_aton(3)função 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.

Por exemplo

$ 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
$ 

No entanto, atualmente, seria melhor usar o getaddrinfoou inet_ntopsolicita suporte ao IPv6. O material "Classe B" se tornou legado em 1994, agora que temos o CIDR e /24...

Ei, você também pode fornecer um número inteiro grande e antigo (mas, por favor, não)

$ 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.
...

(Isso pode não ser portátil para outro unix; em particular, o OpenBSD não pode resolver 2130706433 ...)

agitar
fonte
1
Para uma diversão ainda maior, como o próximo parágrafo do documento deve dizer (e o POSIX), cada número é analisado como fonte C, onde inicial 0significa octal e 0xou 0Xsignifica hex, então 010.020.030.040 é realmente o endereço geralmente escrito como 8.16.24.32 . Os phishers costumavam fazer isso para "ocultar" a identidade do host em URLs maliciosos; Não olhei recentemente para ver se ainda o fazem.
precisa saber é o seguinte