私のネットワークには、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は失敗します。一部のアドレスに送信されたパケットが正しいサーバーに到着するのはなぜですか?
これは、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を解決できません...)