일부 IP 주소가 서버에 액세스할 수 있는 이유는 무엇입니까?

일부 IP 주소가 서버에 액세스할 수 있는 이유는 무엇입니까?

내 네트워크에는 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 10.15비슷한 결과가 나타납니다. 또한 일부 주소에 대한 원격 로그인은 예상대로 작동합니다. 그러나 SSH는 실패합니다. 부분 주소로 전송된 패킷이 올바른 서버에 도달하는 이유는 무엇입니까?

답변1

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
$ 

그러나 이제는 IPv6 지원으로 전환 getaddrinfo하거나 inet_ntopIPv6 지원을 요구하는 것이 더 좋습니다. "클래스 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.
...

(이것은 다른 유닉스로 이식되지 않을 수 있습니다. 특히 OpenBSD는 2130706433을 확인할 수 없습니다...)

관련 정보