Est-il valide d'avoir une partie d'une adresse IPv4 définie sur zéro?

36

Je travaille actuellement sur une modification d'une application Java EE qui s'authentifierait en fonction de l'adresse IP de l'utilisateur à l'aide de ServletRequest.getRemoteAddr . Nous stockons des plages d'adresses IP (FROM_IP et TO_IP) dans une base de données et le système ne s'authentifierait que si l'adresse IP d'un utilisateur se situait dans une plage.

Maintenant, les testeurs ont fait remarquer que le chiffre 0 (zéro) ne devrait pas être autorisé dans les valeurs FROM_IP et TO_IP (n'importe où). Notez qu'il s'agit d'une application orientée Internet et que nous n'obtiendrons que des adresses IP publiques.

Les testeurs ont-ils raison de suggérer cette validation? Pourquoi ne pouvons-nous pas avoir zéro dans la valeur de plage comme dans 167.23.0.1 - 167.23.255.255?

Ritesh
la source
11
Et voici le lien obligatoire vers le document Comment fonctionne le sous-réseau? question.
8
Je trouve surprenant que vos testeurs en parlent, lorsqu'une adresse IPv6 peut contenir une douzaine de 0. PS, vous devriez vraiment adapter votre champ d’adresses IP aux adresses IPv6 s’il n’est pas trop tard. Vous vous épargnerez des maux de tête à l'avenir.
Mark Henderson
2
127.0.0.1 a deux zéros?
John Smith
1
En passant, ma propre adresse IP apparaissant sur whatismyipaddress.com en contient 0 (67.xx.0.xx)
Ritesh
1
Question similaire ici: XYZ0 est-il une adresse IP valide?
Splattne

Réponses:

70

Non, ils sont complètement incorrects.

En fait, c'est une adresse IP valide: 192.168.24.0

Tel quel 167.23.0.1.

La séparation de l'adresse IP en segments en pointillés est un avantage purement humain pour l'affichage. C'est beaucoup plus facile à retenir 192.168.1.42que 3232235818.

Ce qui compte pour les ordinateurs, c'est la séparation (masque de réseau). Il n'est pas valide d'avoir une adresse d'hôte avec la section hôte de l'adresse entièrement définie sur 0 ou 1.

Ainsi, 192.168.24.0 tant que le masque de réseau est tel que certains bits sont définis dans la partie hôte. Voir les calculs suivants:


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

Dans ce cas, la partie adresse (côté droit) a 2 bits définis. C'est une adresse d'hôte valide dans le sous-réseau 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

Dans ce cas, la partie adresse a 10 bits définis et 6 bits non définis. Ceci est une autre adresse d'hôte valide dans le même sous-réseau.


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

Dans ce cas, la partie adresse a zéro bit défini. Ce n'est pas une adresse d'hôte valide dans le réseau 192.168.24.0/24.

MikeyB
la source
11
Je vais sauter sur cette réponse, qui est correcte, pour ajouter un point supplémentaire: le format "quad pointillé" pour les adresses IP, bien que canonique, n’est pas le seul format de représentation. Essayez la commande ping 2130706432, ou ping 017700000001(oui, même sous Windows). Vous pourriez être surpris par les résultats.
BMDan
5
1076000524 :)
jweyrich Le
1
Bien que ce qui est dit ici soit effectivement vrai, il est malheureusement également le cas d'un grand nombre d'interfaces utilisateur qui pensent qu'un zéro final (ou 255) est mauvais, quelle que soit la longueur du préfixe.
Theobroma Cacao
1
192.168.0.257est incorrect, mais 192.168.257est une représentation correcte de 192.168.1.1(tel quel 192.11010305). Voir inet_aton(3).
BMDan
2
@Raffael: le sous-réseau zéro était en fait une retenue des jours d'acheminement de classe. Par exemple, lorsque vous avez un réseau de classe B (129.97.0.0/16), le sous-réseau à zéro est un réseau avec les bits 17 → X tous mis à zéro (X étant la longueur du sous-réseau). Ainsi, le réseau 129.97.0.0/24 serait un sous-réseau nul et non autorisé dans les premiers jours. De nos jours (heureusement), nous utilisons CIDR et ne vous inquiétez pas pour cela.
MikeyB
16

À moins que je ne comprenne mal, vos testeurs ont complètement tort. Les adresses IP valides peuvent certainement contenir un 0.

EEAA
la source
12

En général: Non, peu importe qu'il y ait ou non un 0 dans l'adresse.

Cependant, il y a un grain de vérité dans ce que disent vos testeurs. Dans certains cas, les équipements réseau anciens ou défectueux ne fonctionneront pas correctement sur les adresses avec 0 dans les derniers octets. Cela est dû aux anciennes règles de routage classfull. Dans le routage Classfull, vous pouvez distinguer le masque de réseau du premier octet de l'adresse. Si l'équipement respecte toujours les règles de routage de classe, il risque de ne pas gérer correctement une adresse telle que 200.100.1.0/16.

pehrs
la source
3

Supposons que vous avez besoin de 510 adresses IP dans une plage et que votre adresse réseau est 192.1.1.0, vous auriez un sous-réseau / 23, dont l'une des adresses IP de votre hôte est une adresse IP .0. Vos testeurs se trompent si l'adresse .0 est une adresse d'hôte. Si vous avez un réseau / 24 il serait juste de dire que c'était faux.

Lucas Kauffman
la source
2

Pour fournir une réponse très simple: un ou plusieurs zéros dans une adresse IP sont parfaitement valables pour les adresses d’hôte tant que ces adresses ne sont pas l’adresse de réseau ou de diffusion.

Les adresses réseau et de diffusion sont des adresses IP valides, elles ne sont tout simplement pas utilisables par les hôtes.

joeqwerty
la source
1
Qu'en est-il d'une adresse de diffusion de XY0.255?
Random832
2
Vous pouvez utiliser l'adresse réseau pour un hôte, ce qui était autrefois un test commun de "légèreté". Heureusement, depuis, il est bien tombé en vogue. Dans le même esprit, la RFC 3021 autorise l’utilisation des adresses "broadcast" et "network" dans un / 31, bien que les termes soient sans doute quelque peu inapplicables lorsque vous ne traitez que avec deux hôtes.
BMDan