Frage Ist es zulässig, einen Teil einer IPv4-Adresse auf Null zu setzen?


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

Nun haben Tester darauf hingewiesen, dass die Ziffer 0 (Null) in den Werten FROM_IP und TO_IP (an keiner Stelle) erlaubt sein sollte. Beachten Sie, dass dies eine Internetanwendung ist und wir daher nur öffentliche IP-Adressen erhalten.

Stimmt der Tester dieser Validierung zu? Warum können wir nicht Null in dem Bereichswert wie in 167.23.0.1 - 167.23.255.255 haben?


36
2017-07-15 23:00


Ursprung


Und hier ist der obligatorische Link zum Wie funktioniert Subnetting? Frage. - kce
Ich finde es überraschend, dass Ihre Tester dies aufbringen, wenn eine IPv6-Adresse ein Dutzend Nullen enthalten kann. P.S. 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♦
127.0.0.1 hat zwei Nullen? - John Smith
Übrigens, meine eigene IP-Adresse erscheint auf whatismyipaddress.com hat 0 drin (67.xx.0.xx) - Ritesh
Ähnliche Frage hier: Ist X.Y.Z.0 eine gültige IP-Adresse? - splattne


Antworten:


Nein, sie sind völlig inkorrekt.

In der Tat ist dies eine gültige IP-Adresse: 192.168.24.0

Wie es 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, sich daran zu erinnern 192.168.1.42 als 3232235818.

Was für Computer wichtig ist, ist die Trennung (Netzmaske). Es ist nicht zulässig, eine Host-Adresse mit dem Host-Abschnitt der Adresse vollständig auf 0 oder 1 festgelegt zu haben.

Also, 192.168.24.0 solange die Netzmaske so ist, dass einige Bits im Host-Teil gesetzt werden. Siehe die folgenden 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 hat der Adressteil (rechte Seite) 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 hat der Adressteil 10 Bits gesetzt und 6 Bits nicht gesetzt. Dies ist eine andere 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 hat der Adressteil null gesetzte Bits. Dies ist keine gültige Host-Adresse im Netzwerk 192.168.24.0/24.


70
2017-07-15 23:19



Ich werde auf diese Antwort, die korrekt ist, springen, um einen zusätzlichen Punkt hinzuzufügen: das "gepunktete Quad" -Format für IP-Adressen, obwohl kanonisch, ist nicht das einzige Darstellungsformat. Probieren Sie den Befehl aus ping 2130706432, oder ping 017700000001 (Ja, sogar unter Windows). Sie werden von den Ergebnissen überrascht sein. - BMDan
1076000524 :) - jweyrich
Während das, was hier gesagt wird, tatsächlich wahr ist, ist es auch unglücklicherweise der Fall, dass es eine große Anzahl von Benutzerschnittstellen gibt, die denken, dass eine abschließende Null (oder 255) schlecht ist, ungeachtet der Präfixlänge. - Theobroma Cacao
192.168.0.257 ist falsch, aber 192.168.257 ist eine korrekte Darstellung von 192.168.1.1 (wie es ist 192.11010305). Sehen inet_aton(3). - BMDan
@Raffael: Subnetz-Null war eigentlich ein Überbleibsel aus den klassischen Routing-Tagen. Wenn Sie beispielsweise ein Netzwerk der Klasse B (129.97.0.0/16) hatten, 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). Also wäre das Netzwerk 129.97.0.0/24 ein Null-Subnetz und in den frühen Tagen nicht erlaubt. Heutzutage (glücklicherweise) benutzen wir CIDR und machen uns darüber keine Sorgen. - MikeyB


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


16
2017-07-15 23:20





Im Allgemeinen: Nein, es spielt keine Rolle, ob in der Adresse eine 0 steht oder nicht.

Allerdings gibt es ein Körnchen Wahrheit in dem, was Ihre Tester sagen. In einigen Fällen funktionieren alte oder beschädigte Netzwerkgeräte bei Adressen mit 0 in den letzten Oktesten nicht ordnungsgemäß. Dies liegt an den alten klassenmäßigen Routing-Regeln. Im Classfull-Routing können Sie die Netzmaske vom ersten Oktett der Adresse unterscheiden. Wenn das Gerät weiterhin klassenmäßigen Routing-Regeln folgt, wird es wahrscheinlich eine Adresse wie 200.100.1.0/16 falsch behandeln.


12
2017-07-16 00:22





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


3
2017-07-16 00:00





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

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


2
2017-07-16 02:11



Was ist mit einer Broadcast-Adresse von X.Y.0.255? - Random832
Meine Antwort geändert. Danke, dass du das eingefangen hast. - joeqwerty
Sie können die Netzwerkadresse für einen Host verwenden, und dies war einmal ein üblicher Test für "Leetness". Glücklicherweise ist es seitdem nicht mehr in Mode. In ähnlicher Weise erlaubt RFC 3021 die Verwendung von sowohl "Broadcast" und "Netzwerk" -Adressen in a / 31, obwohl die Begriffe wohl etwas unanwendbar sind, wenn Sie nur mit zwei Hosts zu tun haben. - BMDan