Questão Os endereços IP com e sem zeros à esquerda são os mesmos?


Eu tenho um sistema de segurança e a configuração de rede permite apenas um endereço IP de três dígitos. Eu não posso configurá-lo para 192.168.2.100, em vez disso eu tenho que usar 192.168.002.100.

Esses dois endereços IP são diferentes? Preciso definir a LAN do meu roteador para ser tudo 192.168.xxx.xxx para que isso funcione corretamente? Não consigo encontrar nenhuma informação sólida sobre isso.


83


origem


Tendo em conta as respostas abaixo, 192.168.020.100 deve não ser o mesmo que 192.168.20.100, mas pode será o mesmo se o seu sistema permitir que os IPs sejam inseridos apenas dessa maneira (eu vi isso com copiadoras quando o IP é inserido dígito por dígito com setas para baixo). - Se o seu sistema tem essa peculiaridade, mesmo quando a entrada de teclado "normal" é possível (ou seja, você posso entrada technicall 192.168.2.100, mas ele reclama), então eu sugiro que você tenha uma palavra com o fornecedor (Quão confiável é o sistema de segurança se sua validação de entrada é tão ruim?) - Hagen von Eitzen
Isso realmente é uma validação bastante bizarra. Eu mudaria os sistemas de segurança, como alude a @Hagen. - Lightness Races in Orbit
Isso pode ser específico do software também. Eles são válidos com ou sem a liderança 0s, mas eu encontrei alguns aplicativos que não suportam um endereço IP que não tem 3 dígitos em cada octeto. - ps2goat
Todos os endereços IP (v4) são realmente apenas 32 bits representados de uma maneira legal. E se 192.168.002.100 é como sua ferramenta representa 0xc0a80264/3232236132 /192.168.2.100então é a mesma coisa. - Tim S.
Você pode por favor aceitar outra resposta? O que você aceitou está realmente errado (ou pelo menos incompleto) e tem 11 votos negativos. - Arjan


Respostas:


Supondo que todo o software que você está usando esteja usando ponto-decimal e sub-redes corretamente, sim, eles são os mesmos.

192.168.0.1, por exemplo, é apenas a notação ponto-decimal amigável do valor binário de ponto 11000000.10101000.00000000.00000001.

Se você digitar 192.168.0.1 ou 192.168.000.001, ambos serão iguais a 11000000.10101000.00000000.00000001


64



Os pontos são também por conveniência; o IP real é 11000000101010000000000000000001 - cpast
@cpast ou como um número hexadecimal: C0A80001 - jfs
ou como número octal (começando com 0, com ou sem pontos), e. ping 0300.0250.2.0144 para 192.168.2.100 - Sergey
ou como um número decimal 3232235521 - oldmud0
Como a resposta do @GreenstoneWalker apontou, muitos programas não irão percebê-los como iguais; um número com um zero à esquerda (que não contém os dígitos 8 ou 9) será entendido como um número de notação octal; portanto 010.000.001.063 seria interpretado como "8.0.1.51" (octal 010 = decimal 8; octal 063 = decimal 51) em vez de "10.0.1.63"! - Doktor J


Depende da ferramenta.

Para a maioria dos propósitos, os dois serão os mesmos, mas nem sempre.

Por exemplo, se você usar um número de 3 dígitos começando com um zero (ou um de dois dígitos começando com zero, obrigado @ Dietrich-Epp), o ping assumirá que os números são octal.

Microsoft Windows [Version 6.3.9600]
(c) 2013 Microsoft Corporation. All rights reserved.

C:\Users>ping 011.012.013.014

Pinging 9.10.11.12 with 32 bytes of data:
Request timed out.
Request timed out.
Request timed out.
Request timed out.

Ping statistics for 9.10.11.12:
    Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),

99



Não tanto ping, mas a rotina subjacente que ele usa inet_addr() - cde
Isso também está acontecendo no OSX. - Johann Philipp Strathausen
Não é porque tem três dígitos, é porque o número tem um zero à esquerda. Você pode testar isso tentando pingar 09.09.09.09, o que não funciona porque 9 não é válido em octal. - Dietrich Epp


Depende das ferramentas ou funções que qualquer programa usa para analisar o endereço fornecido. Tanto a Microsoft quanto o Linux, bem como outros sistemas operacionais, usam POSIX compatível inet_addr() rotina para analisar endereços.

Muitos programas TCP / IP, como Ping e FTP, usam a função sockets inet_addr () para converter sequências de endereços IP em endereços de 4 bytes. Essa função aceita um endereço IP na notação decimal, octal e hexadecimal padrão.
  Microsoft KB115388 Ping e FTP Resolver endereço IP com zero à esquerda como octal

A função inet_addr () converte o endereço de host da Internet cp da notação de números e pontos IPv4 em dados binários na ordem de bytes da rede.

Em todos os formulários acima, os componentes do endereço pontilhado podem ser especificados em decimal, octal (com um 0 à esquerda) ou hexadecimal, com 0X à esquerda. Endereços em qualquer um desses formulários são denominados coletivamente IPv4 notação de números e pontos. O formulário que usa exatamente quatro números decimais é chamado de notação decimal pontilhada IPv4 (ou às vezes: notação quad-dotada IPv4).
inet_addr (3): Rotinas de mudança de endereço na Internet - Página man do Linux

Assim, seu sistema específico pode exigir uma notação decimal de três dígitos para cada octeto, mas isso não é universal, e deve-se ter cuidado para garantir que o endereço IP correto seja inserido.

Naturalmente, apenas números válidos para cada tipo funcionarão. Números octais, hexadecimais ou decimais fora da faixa também falharão ou causarão problemas. Octal 088, hexadecimal 0xGG ou decimal 280 são todos exemplos inválidos.


35



+1 para função subjacente. Para adicionar, essa função fará com que a análise de IP falhe se um byte válido (por exemplo, .88) for preenchido com zero, pois 8 não é um número válido em octal. - March Ho
No Windows XP (e antes disso), a função aceitará números octais inválidos e ainda tentará convertê-los. Isso pode levar a um comportamento não muito óbvio. A partir do Vista, os números inválidos são tratados como nomes de domínio e o Windows tentará fazer uma pesquisa de DNS para eles. Que é um comportamento muito estranho também, mas isso pelo menos não causará nenhum problema. - Tonny
@tonny é porque POSIX inet_addr () retorna -1 para valores inválidos, que são aproximadamente 255. A rotina mais nova, como mencionada na man page do Linux, tem melhor tratamento de erros. - cde
@cde Eu nunca me preocupei em aprofundar isso na mecânica do inet_addr (). Eu vou tomar sua palavra para isso :-) - Tonny


Como Raças de leveza em órbita e outros apontaram,

o INET(3) página man descreve inet_addr e inet_aton, as funções padrão usadas para converter a "notação de números e pontos IPv4 em forma binária". Diz

... componentes do endereço pontilhado podem ser especificados em decimal, octal (com um 0 líder), ou hexadecimal, com um 0X inicial).

Então, tecnicamente NÃO, um endereço IP com zeros à esquerda não é (sempre) o mesmo que um sem zeros à esquerda. No seu caso, no entanto, 192.168.2.100 e 192.168.002.100 são idênticos, porque 002 == 2.

Qualquer interface de usuário que requeira que cada componente tenha exatamente três caracteres de comprimento, com zeros à esquerda incorretamente solicitados é interrompido.


12



A ideia de que "zeros à esquerda" são necessários (em alguns equipamentos) não parece estar em disputa; Qual é a base para chamar isso de "incorreto-obrigatório" / "quebrado"? Só porque viola o INET (3) / inet_addr / inet_aton? Implementações que requerem tais zeros provavelmente estão usando outro código que pode se comunicar bem, portanto, não sendo "quebrado". (Eu vi impressoras fazer isso.) Existe uma base para dizer que o INET (3) página man é mais "certo" / um recurso mais autoritário do que outros documentos oficiais, como RFCs e outros citados por este documento preliminar? - TOOGAM


Algumas implementações consideram octetos com zeros à esquerda como decimal, outras implementações os consideram octal. Enquanto o octeto estiver no intervalo de 0 a 7, isso não fará diferença. Então, por exemplo, 192.168.002.100 ser interpretado como 192.168.2.100 em ambas as implementações.

Mas se você digitar um endereço como 192.168.010.100 poderia ser interpretado como 192.168.10.100 ou 192.168.8.100 dependendo da implementação. Também não é improvável que implementações existam, o que consideraria zeros à esquerda como um erro de sintaxe. Além disso, há cenários em que o software pode insistir que você tenha que usar a representação canônica por um motivo ou outro. Por todas essas razões, recomendo evitar zeros à esquerda quando você escreve um endereço IP.

Se você escrever um software que precise analisar um endereço IP, eu recomendaria aceitar zeros à esquerda, mas emitiria um aviso para um local apropriado quando isso acontecesse.

Ligeiramente relacionado existem implementações que permitem que você tenha menos de quatro componentes na notação pontilhada. Quando há menos de quatro componentes, o último componente tem mais de 8 bits e os componentes anteriores têm exatamente 8 bits. Por exemplo 192.168.612 seria realmente uma maneira válida de escrever 192.168.2.100. Mas, novamente, usar essa notação não é recomendado.


5





Apenas uma pequena dica: Em alguns casos, é importante usar prefixos zero nos endereços IP. Um exemplo, é o Apache .htaccess nega regras.

Se você usa algo como

deny from 11.22.33.22

O Apache é tão estúpido que também bloqueia o acesso dos seguintes IPs:

111.22.33.22

11.22.33.221

211.22.33.221

e, em geral, qualquer endereço IP que inclui 11.22.33.22

Então, só para ter certeza de que você não irá bloquear nenhum IP que você não quisesse bloquear, você deve usar:

deny from 011.022.033.022

para ter certeza de que o Apache bloqueará o acesso somente a partir do endereço IP 11.22.33.22.


0



Interessante. Você pode fornecer uma referência para isso? - Scott
A referência é a experiência pessoal e muitas tentativas e erros, depois de encontrar muitos visitantes bloqueados como resultado de não usar zeros à esquerda. Outra maneira de evitar proibições erradas é usar o IP no formato CIDR. Por exemplo, 11.22.33.22/32 em vez de apenas 11.22.33.22 - Nick Gar


tenha cuidado com isso. isto DEVEMOS ser o mesmo, mas é NÃO!
Eu não poderia encontrar uma explicação para isso, mas eu posso definitivamente dizer que no Windows e Linux endereços IP com e sem zeros à esquerda não são os mesmos! talvez isso tenha a ver com a conversão de outros formatos como hex ou binário.

da minha experiência com o windows e linux não é ferramenta dependend mas os dependend parece porque estou executando em algum problema usando ips como 10.08.03.100:

  • note: "10.08.0.1" e 10.09.0.1 não foram encontrados
  • note: "10.010.0.1" está resolvido para 10.8.0.1

linux / debian7 / 8: mesmos resultados com a ferramenta "ping" e "snmpget"

user@test:~$ ping 10.7.0.1
PING 10.7.0.1 (10.7.0.1) 56(84) bytes of data.
^C
--- 10.7.0.1 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

user@test:~$ ping 10.07.0.1
PING 10.07.0.1 (10.7.0.1) 56(84) bytes of data.
^C
--- 10.07.0.1 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

user@test:~$ ping 10.8.0.1
PING 10.8.0.1 (10.8.0.1) 56(84) bytes of data.
^C
--- 10.8.0.1 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

user@test:~$ ping 10.08.0.1
**ping: unknown host 10.08.0.1**
user@test:~$ ping 10.9.0.1
PING 10.9.0.1 (10.9.0.1) 56(84) bytes of data.
^C
--- 10.9.0.1 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

user@test:~$ ping 10.09.0.1
ping: unknown host 10.09.0.1
user@test:~$ ping 10.10.0.1
PING 10.10.0.1 (10.10.0.1) 56(84) bytes of data.
^C
--- 10.10.0.1 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

user@test:~$ ping 10.010.0.1
PING 10.010.0.1 (10.8.0.1) 56(84) bytes of data.
^C
--- 10.010.0.1 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 1001ms

windows7 / 8/10: mesmos resultados com a ferramenta "ping" e "telnet"

(desculpe, eu não tenho um windows em inglês na mão, erro diz que o host não pode ser encontrado)

C:\Users\user>ping 10.7.0.1

Ping wird ausgeführt für 10.7.0.1 mit 32 Bytes Daten:
STRG-C
^C
C:\Users\user>ping 10.07.0.1

Ping wird ausgeführt für 10.7.0.1 mit 32 Bytes Daten:
STRG-C
^C
C:\Users\user>ping 10.8.0.1

Ping wird ausgeführt für 10.8.0.1 mit 32 Bytes Daten:
STRG-C
^C
C:\Users\user>ping 10.08.0.1
Ping-Anforderung konnte Host "10.08.0.1" nicht finden. Überprüfen Sie den Namen,

C:\Users\user>ping 10.9.0.1

Ping wird ausgeführt für 10.9.0.1 mit 32 Bytes Daten:
STRG-C
^C
C:\Users\user>ping 10.09.0.1
Ping-Anforderung konnte Host "10.09.0.1" nicht finden. Überprüfen Sie den Namen,

C:\Users\user>ping 10.10.0.1

Ping wird ausgeführt für 10.10.0.1 mit 32 Bytes Daten:
STRG-C
^C
C:\Users\user>ping 10.010.0.1

Ping wird ausgeführt für 10.8.0.1 mit 32 Bytes Daten:
STRG-C
^C

0



Um zero inicial geralmente indica octal. Com efeito, octal 010 é decimal 8 e 08 e 09 são números octais inválidos. Então sim, a resposta (atualmente) aceita pelo AthomSfere está errada (ou pelo menos incompleta). Veja seus comentários e algumas das outras respostas. - Arjan
Ugh, esse tratamento de 10.010.0.1 é absolutamente horrível. No Microsoft Windows, o ping 10.070.0.1 é tratado como 10.56.0.1 e 10.080.0.1 apresenta um erro instantâneo, "A solicitação de ping não pôde encontrar o host 10.080.0.1. Verifique o nome e tente novamente." - TOOGAM
Sim, @TOOGAM, octal 070 é decimal 56. E octal 080 não é um número válido. - Arjan