Czy poprawne jest ustawienie części adresu IPv4 na zero?

36

Pracuję nad zmianą w aplikacji Java EE, która uwierzytelniałaby się na podstawie adresu IP użytkownika przy użyciu ServletRequest.getRemoteAddr . Przechowujemy zakresy adresów IP (FROM_IP i TO_IP) w bazie danych, a system uwierzytelniałby się tylko wtedy, gdy adres IP użytkownika mieści się w zakresie.

Teraz testerzy zauważyli, że cyfra 0 (zero) nie powinna być dozwolona w wartościach FROM_IP i TO_IP (w żadnym miejscu). Pamiętaj, że jest to aplikacja internetowa, dlatego otrzymamy tylko publiczne adresy IP.

Czy testerzy mają rację, sugerując tę ​​walidację? Dlaczego nie możemy mieć zera w wartości zakresu, takiej jak 167.23.0.1 - 167.23.255.255?

Rytuał
źródło
11
A oto obowiązkowy link do strony Jak działa podsieci? pytanie.
8
Zaskakujące jest to, że twoi testerzy to podnoszą, gdy adres IPv6 może zawierać tuzin zer. PS naprawdę powinieneś dopasować pole adresu IP do adresów IPv6, jeśli nie jest za późno. Zaoszczędzisz sobie bólu głowy w przyszłości.
Mark Henderson
2
127.0.0.1 ma dwa zera?
John Smith
1
Nawiasem mówiąc, mój własny adres IP wyświetlany na whatismyipaddress.com ma 0 (67.xx.0.xx)
Ritesh
1
Podobne pytanie tutaj: Czy XYZ0 jest prawidłowym adresem IP?
splattne 12.08.11

Odpowiedzi:

70

Nie, są całkowicie niepoprawne.

W rzeczywistości jest to prawidłowy adres IP: 192.168.24.0

Jak jest 167.23.0.1.

Rozdzielenie adresu IP na segmenty kropkowane to czysto ludzka wygoda wyświetlania. O wiele łatwiej jest zapamiętać 192.168.1.42niż 3232235818.

Dla komputerów liczy się separacja (maska ​​sieci). Niepoprawne jest posiadanie adresu hosta z sekcją hosta adresu ustawioną całkowicie na 0 lub 1.

Tak więc 192.168.24.0, o ile maska ​​sieci jest taka, że ​​niektóre bity są ustawione w części hosta. Zobacz następujące obliczenia:


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

W tym przypadku część adresowa (prawa strona) ma ustawione 2 bity. To jest prawidłowy adres hosta w podsieci 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

W tym przypadku część adresowa ma 10 bitów ustawionych i 6 bitów nieustawionych. To kolejny prawidłowy adres hosta w tej samej podsieci.


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

W tym przypadku część adresowa ma ustawione bity zerowe. To nie jest prawidłowy adres hosta w sieci 192.168.24.0/24.

MikeyB
źródło
11
Przejdę do tej odpowiedzi, która jest poprawna, aby dodać dodatkowy punkt: format „kropkowanego kwadratu” dla adresów IP, chociaż kanoniczny, nie jest jedynym formatem reprezentacji. Wypróbuj polecenie ping 2130706432lub ping 017700000001(tak, nawet w systemie Windows). Wyniki mogą Cię zaskoczyć.
BMDan
5
1076000524 :)
jweyrich
1
Chociaż to, co tu powiedziano, jest prawdą, niestety jest również tak, że istnieje ogromna liczba interfejsów użytkownika, które uważają, że końcowe zero (lub 255) jest złe, niezależnie od długości prefiksu.
Theobroma Cacao
1
192.168.0.257jest niepoprawny, ale 192.168.257jest poprawną reprezentacją 192.168.1.1(jak jest 192.11010305). Zobaczyć inet_aton(3).
BMDan
2
@Raffael: zero podsieci było tak naprawdę pozostałością po klasowych dniach routingu. Gdybyś miał, powiedzmy, sieć klasy B (129.97.0.0/16) zerową podsiecią byłaby dowolna sieć z bitami 17 → X ustawionymi na zero (gdzie X jest długością podsieci). Tak więc sieć 129.97.0.0/24 byłaby zerową podsiecią i byłaby niedozwolona we wczesnych dniach. W dzisiejszych czasach (na szczęście) używamy CIDR i nie martw się o to.
MikeyB
16

O ile się nie mylę, twoi testerzy są w błędzie. Prawidłowe adresy IP mogą mieć z pewnością 0.

EEAA
źródło
12

Ogólnie: Nie, nie ma znaczenia, czy w adresie jest 0, czy nie.

Jednak w twoich testerach jest ziarno prawdy. W niektórych przypadkach stary lub uszkodzony sprzęt sieciowy nie będzie działał poprawnie na adresach z 0 w ostatnich oktetach. Wynika to ze starych klasowych reguł routingu. W routingu Classfull możesz odróżnić maskę sieci od pierwszego oktetu adresu. Jeśli sprzęt nadal przestrzega klasowych reguł routingu, prawdopodobnie nieprawidłowo obsługuje adres taki jak 200.100.1.0/16.

pehrs
źródło
3

Załóżmy, że potrzebujesz 510 adresów IP w jednym zakresie, a twój adres sieciowy to 192.1.1.0, miałbyś podsieć / 23, z których jeden z adresów IP twojego hosta to adres IP .0, testerzy mylą się, jeśli adres .0 to adres hosta. Jeśli masz sieć / 24, słusznie byłoby powiedzieć, że to źle.

Lucas Kauffman
źródło
2

Aby udzielić bardzo prostej odpowiedzi: jedno lub więcej zer w adresie IP jest doskonale poprawnych dla adresów hostów, o ile adresy te nie są adresami sieci ani rozgłaszania.

Adresy sieciowe i rozgłoszeniowe są prawidłowymi adresami IP, po prostu nie są używane przez hosty.

joeqwerty
źródło
1
co z adresem emisji XY0.255?
Random832,
2
Możesz użyć adresu sieciowego dla hosta, a zrobienie tego było kiedyś powszechnym testem „sprawności”. Na szczęście jednak od tego czasu nie jest już modne. W podobny sposób RFC 3021 zezwala na użycie zarówno adresu „rozgłoszeniowego”, jak i „sieciowego” w / 31, chociaż warunki są prawdopodobnie w pewnym sensie niestosowne, gdy mamy do czynienia tylko z dwoma hostami.
BMDan