Dlaczego mogę uzyskać dostęp do serwera za pomocą częściowego adresu IP?

10

W mojej sieci mam serwer znany pod adresem IP 10.0.0.15. Przez przypadek odkryłem, że polecenie: ping 10.0.15powoduje

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

... więc właściwy serwer odpowiada na ping. Nawet kiedy próbuję: ping 10.15otrzymuję porównywalny wynik. Ponadto telnet na adresy częściowe działa zgodnie z oczekiwaniami. Jednak SSH nie działa. Dlaczego pakiety wysyłane na częściowy adres docierają na właściwy serwer?

wie5Ooma
źródło
to nie jest częściowy adres ... więc tytuł jest tu trochę mylący ...
Rory Alsop
1
ssh powinien być w stanie połączyć się z takim adresem (ponieważ jest odwzorowywany na tę samą wartość, która faktycznie została przekazana do wywołań gniazd), ale nie rozpozna klucza hosta jako pasującego do wpisu znanego_hosta dla „właściwego” adresu, z wynikiem zależnym od tego, jak Ty (lub Twój administrator) skonfigurowałeś sprawdzanie klucza hosta.
dave_thompson_085
Aby uzyskać dodatkową zabawę w przypadku tekstowych reprezentacji adresów IP, zobacz moją starszą, pokrewną odpowiedź na serverfault.com: serverfault.com/a/837667/355827
ilkkachu

Odpowiedzi:

18

Jest to dozwolona forma zgodnie z inet_aton(3)dokumentacją funkcji:

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.

Na przykład

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

Jednak w dzisiejszych czasach prawdopodobnie lepiej byłoby użyć getaddrinfolub inet_ntopwzywa do obsługi IPv6. Materiał „klasy B” stał się dziedzictwem mniej więcej w 1994 roku, teraz gdy mamy CIDR i /24...

Hej, możesz też nadać mu dużą starą liczbę całkowitą (ale proszę nie)

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

(To może nie być przenośne na inny uniks; w szczególności OpenBSD nie może rozwiązać 2130706433 ...)

gałązka
źródło
1
Dla jeszcze większej zabawy, jak powinien powiedzieć następny akapit dokumentu (i POSIX robi), każda liczba jest analizowana jak źródło C, gdzie wiodące 0oznacza ósemkowe i / 0xlub 0Xszesnastkowe, więc 010.020.030.040 to w rzeczywistości adres zwykle zapisany jako 8.16.24.32 . Phisherzy robili to w celu „ukrycia” tożsamości hosta w złośliwych adresach URL; Nie szukałem ostatnio, czy nadal tak jest.
dave_thompson_085