Допустимо ли устанавливать часть адреса IPv4 на ноль?

36

Я работаю над изменением приложения Java EE, которое будет аутентифицироваться на основе IP-адреса пользователя с использованием ServletRequest.getRemoteAddr . Мы храним диапазоны IP-адресов (FROM_IP и TO_IP) в базе данных, и система будет аутентифицироваться, только если IP-адрес пользователя попадает в диапазон.

Теперь тестеры отметили, что цифра 0 (ноль) не должна быть разрешена в значениях FROM_IP и TO_IP (в любом месте). Обратите внимание, что это интернет-приложение, и поэтому мы будем получать только публичные IP-адреса.

Правильно ли тестировщики предлагают эту проверку? Почему у нас не может быть нуля в диапазоне значений, таких как 167.23.0.1 - 167.23.255.255?

Ritesh
источник
11
А вот обязательная ссылка на Как работает подсеть? вопрос.
8
Я нахожу удивительным, что ваши тестеры поднимают это, когда адрес IPv6 может содержать дюжину нулей. PS вам действительно следует сделать так, чтобы поле вашего IP-адреса соответствовало адресам IPv6, если еще не слишком поздно. Вы избавите себя от головной боли в будущем.
Марк Хендерсон
2
127.0.0.1 имеет два нуля?
Джон Смит
1
Кстати, мой собственный IP - адрес , показывающий на whatismyipaddress.com имеет 0 в нем (67.xx.0.xx)
Ritesh

Ответы:

70

Нет, они абсолютно неверны.

Фактически это действительный IP-адрес: 192.168.24.0

Как есть 167.23.0.1.

Разделение IP-адреса на точечные сегменты является чисто человеческим удобством для отображения. Это намного легче запомнить, 192.168.1.42чем 3232235818.

Для компьютеров важно разделение (маска сети). Недопустимо иметь адрес хоста с разделом хоста адреса, полностью установленным в 0 или 1.

Итак, 192.168.24.0 до тех пор, пока маска сети такова, что некоторые части устанавливаются в части хоста. Смотрите следующие расчеты:


michael@challenger:~$ ipcalc 192.168.24.0/16
Address:   192.168.24.0         11000000.10101000. 00011000.00000000
Netmask:   255.255.0.0 = 16     11111111.11111111. 00000000.00000000
Wildcard:  0.0.255.255          00000000.00000000. 11111111.11111111
=>
Network:   192.168.0.0/16       11000000.10101000. 00000000.00000000
HostMin:   192.168.0.1          11000000.10101000. 00000000.00000001
HostMax:   192.168.255.254      11000000.10101000. 11111111.11111110
Broadcast: 192.168.255.255      11000000.10101000. 11111111.11111111
Hosts/Net: 65534                 Class C, Private Internet

В этом случае в адресной части (справа) установлены 2 бита. Это действительный адрес хоста в подсети 192.168.0.0/16.


michael@challenger:~$ ipcalc 192.168.24.255/16
Address:   192.168.24.255       11000000.10101000. 00011000.11111111
Netmask:   255.255.0.0 = 16     11111111.11111111. 00000000.00000000
Wildcard:  0.0.255.255          00000000.00000000. 11111111.11111111
=>
Network:   192.168.0.0/16       11000000.10101000. 00000000.00000000
HostMin:   192.168.0.1          11000000.10101000. 00000000.00000001
HostMax:   192.168.255.254      11000000.10101000. 11111111.11111110
Broadcast: 192.168.255.255      11000000.10101000. 11111111.11111111
Hosts/Net: 65534                 Class C, Private Internet

В этом случае в адресной части установлено 10 битов и 6 битов не установлено. Это еще один действительный адрес хоста в той же подсети.


michael@challenger:~$ ipcalc 192.168.24.0/24
Address:   192.168.24.0         11000000.10101000.00011000. 00000000
Netmask:   255.255.255.0 = 24   11111111.11111111.11111111. 00000000
Wildcard:  0.0.0.255            00000000.00000000.00000000. 11111111
=>
Network:   192.168.24.0/24      11000000.10101000.00011000. 00000000
HostMin:   192.168.24.1         11000000.10101000.00011000. 00000001
HostMax:   192.168.24.254       11000000.10101000.00011000. 11111110
Broadcast: 192.168.24.255       11000000.10101000.00011000. 11111111
Hosts/Net: 254                   Class C, Private Internet

В этом случае в адресной части установлены нулевые биты. Это недопустимый адрес хоста в сети 192.168.24.0/24.

MikeyB
источник
11
Я перейду к этому ответу, который является правильным, чтобы добавить еще один момент: формат «точечный квад» для IP-адресов, хотя и канонический, не является единственным форматом представления. Попробуйте команду ping 2130706432или ping 017700000001(да, даже в Windows). Вы можете быть удивлены результатами.
BMDan
5
1076000524 :)
jweyrich
1
Хотя сказанное здесь действительно верно, к сожалению, существует огромное количество пользовательских интерфейсов, которые считают конечный ноль (или 255) плохим, независимо от длины префикса.
Теоброма Какао
1
192.168.0.257неверно, но 192.168.257является правильным представлением 192.168.1.1(как есть 192.11010305). См inet_aton(3).
BMDan
2
@Raffael: нулевая подсеть фактически была пережитком классных дней маршрутизации. Если у вас есть, скажем, сеть класса B (129.97.0.0/16), то нулевой подсетью будет любая сеть с битами 17 → X, все из которых установлены в ноль (где X - длина подсети). Таким образом, сеть 129.97.0.0/24 будет нулевой подсетью и будет запрещена в первые дни. В настоящее время (к счастью) мы используем CIDR и не беспокоимся об этом.
MikeyB
16

Если я не неправильно понял, ваши тестеры совершенно неправы. Действительные IP-адреса могут иметь 0.

EEAA
источник
12

В общем: нет, не имеет значения, есть ли в адресе 0 или нет.

Однако в том, что говорят ваши тестеры, есть доля правды. В некоторых случаях старое или сломанное сетевое оборудование не будет правильно работать на адресах с 0 в последних октестах. Это связано со старыми правилами классной маршрутизации. В маршрутизации Classfull вы можете узнать маску сети по первому октету адреса. Если оборудование все еще следует классическим правилам маршрутизации, оно может неправильно обработать адрес, такой как 200.100.1.0/16.

pehrs
источник
3

Допустим, вам нужно 510 IP-адресов в одном диапазоне, а ваш сетевой адрес - 192.1.1.0, у вас будет подсеть / 23, из которых один из IP-адресов вашего хоста является IP-адресом .0, ваши тестеры ошибочны, если адрес .0 это адрес хоста. Если у вас есть сеть / 24, было бы правильно сказать, что это неправильно.

Лукас Кауфман
источник
2

Чтобы дать очень простой ответ: один или несколько нулей в IP-адресе идеально подходят для адресов хоста, если эти адреса не являются сетевым или широковещательным адресом.

Сетевые и широковещательные адреса являются действительными IP-адресами, они просто не могут использоваться хостами.

joeqwerty
источник
1
как насчет широковещательного адреса XY0.255?
Random832
2
Вы можете использовать сетевой адрес для хоста, и это когда-то было обычным тестом «leetness». К счастью, с тех пор он вышел из моды. Аналогичным образом, RFC 3021 разрешает использование как «широковещательных», так и «сетевых» адресов в / 31, хотя эти термины, возможно, несколько неприменимы, когда вы имеете дело только с двумя хостами с самого начала.
BMDan