一部のIPアドレスでサーバーにアクセスできるのはなぜですか?


10

私のネットワークには、IPアドレス10.0.0.15で認識されるサーバーがあります。偶然にも、次のコマンドping 10.0.15

64 bytes from 10.0.0.15: icmp_seq=1 ttl=64 time=9.09 ms

...したがって、正しいサーバーがpingに応答します。私が試したときでもping 10.15、同等の結果が得られます。また、部分アドレスへのTelnetは期待どおりに機能します。ただし、SSHは失敗します。一部のアドレスに送信されたパケットが正しいサーバーに到着するのはなぜですか?


部分的な住所ではありません...したがって、タイトルはここで少し誤解を招くようになります...
Rory Alsop

1
sshはそのようなアドレスに接続できるはずです(実際にソケット呼び出しに渡されるのと同じ値にマップされるため)が、ホストキーを「適切な」アドレスのknown_hostsエントリと一致するものとして認識しません。あなた(またはあなたの管理者)がホストキーチェックを設定しました。
dave_thompson_085

:IPアドレスのテキスト表現の追加楽しみのために、serverfaultの上で私の古い、関連の回答を参照serverfault.com/a/837667/355827を
ilkkachu

回答:


18

これはinet_aton(3)関数のドキュメントに従って許可されたフォームです:

DESCRIPTION
       inet_aton() converts the Internet host address cp from  the  IPv4  num‐
       bers-and-dots  notation  into  binary  form (in network byte order) and
       stores it in the structure that inp  points  to.   inet_aton()  returns
       nonzero  if the address is valid, zero if not.  The address supplied in
       cp can have one of the following forms:

       a.b.c.d   Each of the four  numeric  parts  specifies  a  byte  of  the
                 address;  the  bytes  are  assigned in left-to-right order to
                 produce the binary address.

       a.b.c     Parts a and b specify the  first  two  bytes  of  the  binary
                 address.   Part  c  is  interpreted  as  a  16-bit value that
                 defines the rightmost two bytes of the binary address.   This
                 notation  is  suitable for specifying (outmoded) Class B net‐
                 work addresses.

       a.b       Part a specifies the first byte of the binary address.   Part
                 b is interpreted as a 24-bit value that defines the rightmost
                 three bytes of the binary address.  This notation is suitable
                 for specifying (outmoded) Class C network addresses.

       a         The  value  a is interpreted as a 32-bit value that is stored
                 directly into the binary address without any byte  rearrange‐
                 ment.

例えば

$ perl -MSocket=inet_aton,inet_ntoa -E 'say inet_ntoa(inet_aton("10.0.15"))'
10.0.0.15
$ perl -MSocket=inet_aton,inet_ntoa -E 'say inet_ntoa(inet_aton("10.15"))'
10.0.0.15
$ 

しかし、最近では、代わりにgetaddrinfoまたはを使用しinet_ntopてIPv6サポートを行う方が良いでしょう。「クラスB」のものは1994年にレガシーになり、CIDRと/24...

ちょっと古い整数を与えることもできます(ただし、しないでください)。

$ perl -MSocket=inet_aton,inet_ntoa -E 'say inet_ntoa(inet_aton("2130706433"))'
127.0.0.1
$ getent hosts 2130706433
127.0.0.1       2130706433
$ ssh 2130706433
The authenticity of host '2130706433 (127.0.0.1)' can't be established.
...

(これは他のunixに移植できない可能性があります。特にOpenBSDは2130706433を解決できません...)


1
さらにおもしろいのは、ドキュメントの次のパラグラフで(そしてPOSIXでも)言われているように、各数値はCソースのように解析され、先頭が08進数0xまたは0X16 進数を意味するため、010.020.030.040は実際には通常8.16.24.32と書かれているアドレスです。フィッシャーはこれを悪用して、悪意のあるURLのホストIDを「隠す」ことができました。私は最近彼らがまだそうであるかどうかを確認していません。
dave_thompson_085
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.