Pourquoi puis-je accéder à un serveur par une adresse IP partielle?

10

Dans mon réseau, j'ai un serveur connu par l'adresse IP 10.0.0.15. Par accident, j'ai découvert que la commande: ping 10.0.15aboutit à

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

... pour que le bon serveur réponde au ping. Même quand j'essaye: ping 10.15j'obtiens un résultat comparable. De plus, telnet aux adresses partielles fonctionne comme prévu. Cependant, SSH échoue. Pourquoi les paquets envoyés à une adresse partielle arrivent-ils sur le bon serveur?

wie5Ooma
la source
ce n'est pas une adresse partielle ... donc le titre est un peu trompeur ici ...
Rory Alsop
1
ssh devrait pouvoir se connecter à une telle adresse (car elle correspond à la même valeur réellement passée aux appels de socket) mais il ne reconnaîtra pas la clé d'hôte comme correspondant à une entrée connue_hosts pour l'adresse «correcte», avec un résultat dépendant de la façon dont vous (ou votre administrateur) avez configuré la vérification des clés d'hôte.
dave_thompson_085
Pour plus de plaisir sur les représentations textuelles des adresses IP, voir ma réponse ancienne et connexe sur serverfault: serverfault.com/a/837667/355827
ilkkachu

Réponses:

18

C'est un formulaire autorisé selon les inet_aton(3)documents de fonction:

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.

Par exemple

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

Cependant, de nos jours, il serait probablement préférable d'utiliser à la place le getaddrinfoou les inet_ntopappels pour la prise en charge d'IPv6. Le truc de "Classe B" est devenu un héritage en 1994 environ maintenant que nous avons le CIDR et /24...

Hé, vous pouvez également lui donner un grand vieil entier (mais s'il vous plaît ne le faites pas)

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

(Cela peut ne pas être portable sur un autre Unix; en particulier OpenBSD ne peut pas résoudre 2130706433 ...)

branler
la source
1
Pour encore plus de plaisir, comme le prochain paragraphe du document devrait le dire (et POSIX le fait), chaque nombre est analysé comme la source C où le début 0signifie octal et 0xou 0Xsignifie hex, donc 010.020.030.040 est en fait l'adresse habituellement écrite comme 8.16.24.32 . Les hameçonneurs faisaient cela pour «cacher» l'identité de l'hôte dans des URL malveillantes; Je n'ai pas regardé récemment pour voir s'ils le font encore.
dave_thompson_085