Почему я могу получить доступ к серверу по частичному 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 не работает. Почему пакеты, отправленные на частичный адрес, попадают на правильный сервер?


это не частичный адрес ... так что название здесь немного вводит в заблуждение ...
Рори Олсоп

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


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