Ist es gültig, einen Teil einer IPv4-Adresse auf Null zu setzen?

36

Ich arbeite an einer Änderung in einer Java EE-Anwendung, die sich basierend auf der IP-Adresse des Benutzers mithilfe von ServletRequest.getRemoteAddr authentifizieren würde . Wir speichern IP-Adressbereiche (FROM_IP und TO_IP) in einer Datenbank und das System authentifiziert sich nur, wenn die IP-Adresse eines Benutzers in einen Bereich fällt.

Jetzt haben Tester darauf hingewiesen, dass die Ziffer 0 (Null) in FROM_IP- und TO_IP-Werten (an keiner Stelle) zulässig sein sollte. Beachten Sie, dass es sich um eine Internetanwendung handelt und wir daher nur öffentliche IP-Adressen erhalten.

Haben Tester Recht, wenn sie diese Validierung vorschlagen? Warum kann der Bereichswert nicht Null sein, wie in 167.23.0.1 - 167.23.255.255?

Ritesh
quelle
11
Und hier ist der obligatorische Link zu Wie funktioniert das Subnetting? Frage.
8
Ich finde es überraschend, dass Ihre Tester dies ansprechen, wenn eine IPv6-Adresse ein Dutzend Nullen enthalten kann. PS Sie sollten Ihr IP-Adressfeld wirklich an IPv6-Adressen anpassen, wenn es nicht zu spät ist. Sie werden sich in Zukunft Kopfschmerzen ersparen.
Mark Henderson
2
127.0.0.1 hat zwei Nullen?
John Smith
1
Übrigens hat meine eigene IP-Adresse, die auf whatismyipaddress.com angezeigt wird, 0 (67.xx.0.xx)
Ritesh
1
Ähnliche Frage hier: Ist XYZ0 eine gültige IP-Adresse?
Splattne

Antworten:

70

Nein, sie sind völlig falsch.

Tatsächlich ist dies eine gültige IP-Adresse: 192.168.24.0

Wie ist 167.23.0.1.

Die Trennung der IP-Adresse in gepunktete Segmente ist eine rein menschliche Annehmlichkeit für die Anzeige. Es ist viel leichter zu merken 192.168.1.42als 3232235818.

Was für Computer wichtig ist, ist die Trennung (Netzmaske). Es ist nicht gültig, eine Host-Adresse zu haben, deren Host-Abschnitt vollständig auf 0 oder 1 gesetzt ist.

Also 192.168.24.0, solange die Netzmaske so ist, dass im Host-Teil einige Bits gesetzt werden. Siehe folgende Berechnungen:


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

In diesem Fall sind im Adressteil (rechts) 2 Bits gesetzt. Dies ist eine gültige Hostadresse im Subnetz 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

In diesem Fall sind im Adressteil 10 Bits gesetzt und 6 Bits nicht gesetzt. Dies ist eine weitere gültige Hostadresse im selben Subnetz.


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

In diesem Fall sind für den Adressteil Null-Bits gesetzt. Dies ist keine gültige Hostadresse im Netzwerk 192.168.24.0/24.

MikeyB
quelle
11
Ich werde auf diese richtige Antwort springen, um einen zusätzlichen Punkt hinzuzufügen: Das "gepunktete Quad" -Format für IP-Adressen ist zwar kanonisch, aber nicht das einzige Darstellungsformat. Probieren Sie den Befehl ping 2130706432oder ping 017700000001(ja, auch unter Windows). Sie werden von den Ergebnissen überrascht sein.
BMDan
5
1076000524 :)
Jweyrich
1
Während das, was hier gesagt wird, in der Tat wahr ist, ist es leider auch so, dass es eine große Anzahl von Benutzeroberflächen gibt, die eine nachgestellte Null (oder 255) ungeachtet der Präfixlänge für schlecht halten.
Theobroma Cacao
1
192.168.0.257ist falsch, ist aber 192.168.257eine korrekte Darstellung von 192.168.1.1(wie sie ist 192.11010305). Sehen inet_aton(3).
BMDan
2
@ Raffael: Subnetz Null war eigentlich ein Überbleibsel von den klassenbesten Routingtagen. Wenn Sie beispielsweise ein Klasse-B-Netzwerk (129.97.0.0/16) hätten, wäre das Null-Subnetz ein beliebiges Netzwerk mit den Bits 17 → X, die alle auf Null gesetzt sind (wobei X die Länge des Subnetzes ist). Das Netzwerk 129.97.0.0/24 wäre also ein Null-Subnetz und in den Anfangszeiten nicht zulässig. Heutzutage verwenden wir (zum Glück) CIDR und machen uns darüber keine Sorgen.
MikeyB
16

Wenn ich nicht falsch verstanden habe, liegen Ihre Tester absolut falsch. Gültige IP-Adressen können durchaus eine 0 enthalten.

EEAA
quelle
12

Im Allgemeinen: Nein, es spielt keine Rolle, ob die Adresse eine 0 enthält oder nicht.

In dem, was Ihre Tester sagen, steckt jedoch ein Körnchen Wahrheit. In einigen Fällen funktionieren alte oder defekte Netzwerkgeräte bei Adressen mit 0 in den letzten Oktesten nicht richtig. Dies ist auf die alten Regeln für das Routing zurückzuführen. Beim Classfull-Routing können Sie die Netzmaske ab dem ersten Oktett der Adresse erkennen. Wenn das Gerät immer noch den Regeln für erstklassiges Routing folgt, wird es wahrscheinlich eine Adresse wie 200.100.1.0/16 falsch verarbeiten.

pehrs
quelle
3

Angenommen, Sie benötigen 510 IP-Adressen in einem Bereich und Ihre Netzwerkadresse ist 192.1.1.0. Sie hätten ein / 23-Subnetz, von dem eine Ihrer Host-IPs eine .0-IP-Adresse ist. Ihre Tester sind falsch, wenn die .0-Adresse ist ist eine Hostadresse. Wenn Sie ein / 24-Netzwerk haben, ist es richtig zu sagen, dass es falsch ist.

Lucas Kauffman
quelle
2

Um eine sehr einfache Antwort zu geben: Eine oder mehrere Nullen in einer IP-Adresse sind für Host-Adressen vollkommen gültig, solange diese Adressen nicht die Netzwerk- oder Broadcast-Adresse sind.

Netzwerk- und Broadcast-Adressen sind gültige IP-Adressen und können von Hosts nicht verwendet werden.

Joeqwerty
quelle
1
Was ist mit einer Broadcast-Adresse von XY0.255?
Random832
2
Sie können die Netzwerkadresse für einen Host verwenden, und dies war einst ein allgemeiner Test für "Leetness". Zum Glück ist es seitdem nicht mehr in Mode. In ähnlicher Weise erlaubt RFC 3021 die Verwendung von "Broadcast" - und "Netzwerk" -Adressen in a / 31, obwohl die Begriffe möglicherweise nicht zutreffen, wenn Sie nur mit zwei Hosts zu tun haben.
BMDan