Почему я могу получить доступ к серверу по частичному IP-адресу?

10

В моей сети есть сервер, известный по IP-адресу 10.0.0.15. Случайно я обнаружил, что команда: ping 10.0.15приводит к

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

... так что правильный сервер отвечает на пинг. Даже когда я пытаюсь: ping 10.15я получаю сопоставимый результат. Кроме того, telnet к частичным адресам работает как ожидалось. Однако SSH не работает. Почему пакеты, отправленные на частичный адрес, попадают на правильный сервер?

wie5Ooma
источник
это не частичный адрес ... так что название здесь немного вводит в заблуждение ...
Рори Олсоп
1
ssh должен иметь возможность подключаться к такому адресу (поскольку он сопоставляется с тем же значением, которое фактически передается вызовам сокетов), но он не распознает ключ хоста как соответствующий записи known_hosts для «правильного» адреса, а результат зависит от того, как Вы (или ваш администратор) настроили проверку ключа хоста.
dave_thompson_085
Для получения дополнительной информации о текстовых представлениях IP-адресов см. Мой старый связанный ответ на serverfault: serverfault.com/a/837667/355827
ilkkachu

Ответы:

18

Это разрешенная форма в соответствии с inet_aton(3)функцией 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.

Например

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

Однако в наши дни было бы лучше использовать вместо них getaddrinfoили inet_ntopвызовы для поддержки IPv6. "Класс B" стал наследием еще в 1994 году или около того, теперь у нас есть CIDR и /24...

Эй, вы также можете дать ему большое старое число (но, пожалуйста, не надо)

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

(Это не может быть переносимо на другой Unix; в частности, OpenBSD не может разрешить 2130706433 ...)

thrig
источник
1
Для еще большего удовольствия, как следует из следующего пункта документа (и POSIX), каждое число анализируется как источник C, где ведущий 0означает восьмеричное и 0xили 0Xозначает шестнадцатеричное, поэтому 010.020.030.040 - это адрес, обычно записываемый как 8.16.24.32 , Фишеры делали это, чтобы «скрыть» идентификационные данные хоста во вредоносных URL; Я не смотрел недавно, чтобы увидеть, если они все еще делают.
dave_thompson_085