É válido ter parte de um endereço IPv4 definido como zero?

36

Estou trabalhando em uma alteração em um aplicativo Java EE que seria autenticado com base no endereço IP do usuário usando ServletRequest.getRemoteAddr . Armazenamos intervalos de endereços IP (FROM_IP e TO_IP) em um banco de dados e o sistema seria autenticado apenas se o endereço IP de um usuário cair em um intervalo.

Agora, os testadores apontaram que o dígito 0 (zero) não deve ser permitido nos valores FROM_IP e TO_IP (em qualquer lugar). Observe que este é um aplicativo voltado para a Internet e, portanto, obteremos apenas endereços IP públicos.

Os testadores estão certos ao sugerir essa validação? Por que não podemos ter zero no valor do intervalo, como em 167.23.0.1 - 167.23.255.255?

Ritesh
fonte
11
E aqui está o link obrigatório para Como funciona a sub-rede? questão.
8
Acho surpreendente que seus testadores apresentem isso quando um endereço IPv6 pode conter uma dúzia de 0s. PS: você realmente deve ajustar seu campo de endereço IP aos endereços IPv6 se não for tarde demais. Você se salvará de dores de cabeça no futuro.
Mark Henderson
2
127.0.0.1 tem dois zeros?
John Smith
1
By the way, o meu próprio endereço IP aparecendo em whatismyipaddress.com tem 0 nele (67.xx.0.xx)
Ritesh
1
Pergunta semelhante aqui: XYZ0 é um endereço IP válido?
splattne

Respostas:

70

Não, eles estão completamente incorretos.

De fato, este é um endereço IP válido: 192.168.24.0

Como está 167.23.0.1.

A separação do endereço IP em segmentos pontilhados é uma conveniência puramente humana para exibição. É muito mais fácil lembrar do 192.168.1.42que 3232235818.

O que importa para computadores é a separação (máscara de rede). Não é válido ter um endereço de host com a seção host do endereço totalmente definida como 0 ou 1.

Portanto, 192.168.24.0, desde que a máscara de rede seja tal que alguns bits sejam configurados na parte do host. Veja os seguintes cálculos:


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

Nesse caso, a parte do endereço (lado direito) possui 2 bits definidos. Este é um endereço de host válido na sub-rede 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

Nesse caso, a parte do endereço possui 10 bits definidos e 6 bits não definidos. Este é outro endereço de host válido na mesma sub-rede.


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

Nesse caso, a parte do endereço tem zero bits definidos. Este não é um endereço de host válido na rede 192.168.24.0/24.

MikeyB
fonte
11
Vou pular para esta resposta, que está correta, para acrescentar um ponto adicional: o formato "quad dotted" para endereços IP, embora canônico, não é o único formato de representação. Tente o comando ping 2130706432, ou ping 017700000001(sim, mesmo no Windows). Você pode se surpreender com os resultados.
BMDan
5
# 1076000524 :)
jweyrich
1
Embora o que é dito aqui seja realmente verdade, também é infelizmente o caso de um grande número de interfaces de usuário que consideram um zero à direita (ou 255) ruim, independentemente do tamanho do prefixo.
Theobroma Cacao
1
192.168.0.257está incorreto, mas 192.168.257é uma representação correta de 192.168.1.1(como está 192.11010305). Veja inet_aton(3).
BMDan
2
@Raffael: a sub-rede zero foi realmente um resquício dos dias de roteamento de classe. Quando você tinha, digamos, uma rede Classe B (129.97.0.0/16), a sub-rede zero seria qualquer rede com os bits 17 → X todos definidos como zero (onde X é o comprimento da sub-rede). Portanto, a rede 129.97.0.0/24 seria uma sub-rede zero e não permitida nos primeiros dias. Hoje (felizmente) usamos o CIDR e não nos preocupamos com isso.
30711 MikeyB
16

A menos que eu esteja entendendo errado, seus testadores estão completamente errados. Endereços IP válidos certamente podem ter um 0 neles.

EEAA
fonte
12

Em geral: não, não importa se existe um 0 no endereço ou não.

No entanto, há um certo grau de verdade no que seus testadores estão dizendo. Em alguns casos, equipamentos de rede antigos ou quebrados não funcionarão corretamente em endereços com 0 nos últimos octestes. Isso ocorre devido às antigas regras de roteamento classfull. No roteamento Classfull, você pode dizer a máscara de rede a partir do primeiro octeto do endereço. Se o equipamento ainda seguir regras de roteamento classfull, é provável que ele manipule um endereço como 200.100.1.0/16 incorretamente.

pehrs
fonte
3

Digamos que você precise de 510 endereços IP em um intervalo e seu endereço de rede seja 192.1.1.0, você teria uma sub-rede / 23, da qual um dos IPs do host é um endereço IP .0, seus testadores estão errados se o endereço .0 é um endereço de host. Se você tem uma rede / 24, seria correto dizer que estava errado.

Lucas Kauffman
fonte
2

Para fornecer uma resposta muito simples: Um ou mais zeros em um endereço IP são perfeitamente válidos para endereços de host, desde que esses endereços não sejam o endereço de rede ou de broadcast.

Os endereços de rede e transmissão são endereços IP válidos, mas não podem ser utilizados pelos hosts.

joeqwerty
fonte
1
que tal um endereço de transmissão XY0.255?
Random832
2
Você pode usar o endereço de rede para um host, e isso já foi um teste comum de "leetness". Felizmente, porém, desde então, ficou fora de moda. Da mesma forma, o RFC 3021 permite o uso de endereços "broadcast" e "network" em um / 31, embora os termos sejam indiscutivelmente um tanto inaplicáveis ​​quando você está lidando apenas com dois hosts.
BMDan