web-dev-qa-db-ja.com

先行ゼロの有無にかかわらずIPアドレスは同じですか?

セキュリティシステムがあり、ネットワーク設定で3桁のIPアドレスしか許可されていません。 192.168.2.100に設定することはできません。代わりに192.168.002.100を使用する必要があります。

この2つのIPアドレスは異なりますか?これが正しく機能するためには、ルータのLANをすべて192.168.xxx.xxxに設定する必要がありますか?これに関する確かな情報は見つかりません。

88
Brock Vond

それはツールによります。

ほとんどの目的で、この2つは同じになりますが、必ずしもそうとは限りません。

たとえば、ゼロから始まる3桁の数字(またはゼロから始まる2桁の数字、Thanks @ Dietrich-Epp)を使用すると、pingは数字が8進数であると見なします。

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),
101

あなたが使っているすべてのソフトウェアがドット10進数とサブネットを正しく使っていると仮定すれば、はい、それらは同じです。

たとえば、192.168.0.1は、ドット2進値11000000.10101000.00000000.00000001のフレンドリなドット10進表記のみです。

192.168.0.1と入力しても192.168.000.001と入力しても、どちらも11000000.10101000.00000000.00000001に相当します。

65
Austin T French

与えられたアドレスを解析するために与えられたプログラムが使うツールや機能に依存します。 MicrosoftとLinuxの両方と他のOSはアドレスを解析するために POSIX 互換inet_addr()ルーチンを使います。

PingやFTPなどの多くのTCP/IPプログラムは、inet_addr()ソケット関数を使用してIPアドレス文字列を4バイトアドレスに変換します。この関数は、標準の10進数、8進数、および16進数でIPアドレスを受け入れます。
Microsoft KB115388のPingおよびFTPでは、先頭のゼロが8進数であるIPアドレスが解決されます

Inet_addr()関数は、インターネットホストアドレスcpをIPv4の数字とドットの表記法からネットワークバイト順のバイナリデータに変換します。

上記のすべての形式で、ドット付きアドレスの構成要素は、10進数、8進数(先行の0を含む)、または16進数(先行の0を含む)で指定できます。これらの形式のアドレスは、まとめて IPv4 の数字とドットの表記法で呼ばれます。厳密に4つの10進数を使用する形式は、IPv4のドット付き10進表記法(または場合によってはIPv4のドット付き4進表記法)と呼ばれます。
inet_addr(3):インターネットアドレス変更ルーチン - Linuxのmanページ

そのため、特定のシステムでは各オクテットに3桁の10進数表記が必要になる場合がありますが、これは一般的ではないため、正しいIPアドレスが入力されるように注意する必要があります。

もちろん、各タイプに有効な数字だけが機能します。範囲外の8進数、16進数、または10進数も失敗するか、問題を引き起こす可能性があります。 8進数088、16進数0xGG、または10進数280はすべて無効な例です。

37
cde

軌道上の明るさの競合 などが指摘しているように、

INET(3)のマニュアルページ には、「IPv4の数字とドットの表記を2進形式に変換するための標準関数」とinet_addrおよびinet_atonが説明されています。それは言う

...ドット付きアドレスの構成要素は、10進数、8進数(先行する0を含む)、または16進数(先行する0Xを含む)で指定できます。

したがって、技術的には、NOのように、先行ゼロを含むIPアドレスは、(常に)先行ゼロを含まないIPアドレスと同じではありません。しかし、あなたの場合では、192.168.2.100192.168.002.100は同一です。なぜなら002 == 2だからです。

各コンポーネントの長さが正確に3文字であることを要求し、先頭にゼロが誤って要求されているユーザーインターフェイスはすべて機能しません。

13

いくつかの実装は先行ゼロのオクテットを10進数であると考える他の実装はそれらを8進であると見なします。八重奏が0から7までの範囲にある限り、これは違いを生じません。そのため、例えば両方の実装で192.168.002.100192.168.2.100として解釈されます。

しかし、アドレスを192.168.010.100として入力すると、実装に応じて192.168.10.100または192.168.8.100として解釈される可能性があります。実装が存在することも稀ではありません。これは先行ゼロを構文エラーと見なすことになります。さらに、何らかの理由で正規表現を使用する必要があるとソフトウェアが主張するシナリオがあります。これらすべての理由から、私はあなたがIPアドレスを書くとき先行ゼロを避けることをお勧めします。

あなたがIPアドレスを解析する必要があるソフトウェアを書くならば、私は先行ゼロを受け入れることをお勧めしますが、それが起こるとき適切な場所に警告を出力します。

ちょっと関係がありますが、ドット表記で4つより少ないコンポーネントを持つことを可能にする実装があります。 4つより少ない構成要素があるとき、最後の構成要素は8ビットより多くあり、そして以前の構成要素はちょうど8ビットである。例えば、192.168.612は実際には192.168.2.100を書くための有効な方法です。しかし、その表記法を使用することはお勧めできません。

6
kasperd

これには注意してください。 itと同じであるべきですが、ではありません!
私はこれについての説明を見つけることができませんでしたが、私は絶対に先行ゼロの有無にかかわらずWindowsとLinuxのIPアドレスで同じではないと言うことができます!多分これはhexやbinaryのような他のフォーマットからの変換と関係があります。

windowsとLinuxでの私の経験からは、これはツールに依存していませんが、OSに依存しています。

  • 注: "10.08.0.1"と10.09.0.1は見つかりませんでした
  • 注: "10.010.0.1"は10.8.0.1に解決されました

linux/debian7/8:ツール "ping"と "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: "ping"と "telnet"ツールで同じ結果

(すみません、私は手元に英語のウィンドウを持ってはいけない、エラーはホストが見つからなかったことを伝えます)

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
vchrizz

ちょっとしたコツ:場合によっては、IPアドレスにゼロプレフィックスを使用することが重要です。一例として、Apacheの.htaccess拒否ルールがあります。

あなたが好きなものを使うなら

deny from 11.22.33.22

Apacheはとてもばかげているため、以下のIPからのアクセスもブロックされます。

111.22.33.22

11.22.33.221

211.22.33.221

そして一般的に、が含まれるIPアドレス11.22.33.22

ですから、ブロックするつもりのないIPをブロックしないようにするには、次のようにします。

deny from 011.022.033.022

apacheが11.22.33.22のIPアドレスからのアクセスのみをブロックするようにします。

0
Nick Gar