เหตุใดฉันสามารถเข้าถึงเซิร์ฟเวอร์ด้วยที่อยู่ 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
เพื่อความสนุกสนานที่มากขึ้นดังที่ย่อหน้าถัดไปของ doc ควรจะบอกว่า (และ POSIX ทำ) แต่ละตัวเลขจะถูกแยกวิเคราะห์เหมือนแหล่งข้อมูล C ซึ่งนำหน้า0หมายถึงเลขฐานแปดและ0xหรือ0Xหมายถึงเลขฐานสิบหกดังนั้น 010.020.030.040 . ฟิชเชอร์เคยทำเช่นนี้เพื่อ 'ซ่อน' ตัวตนของโฮสต์ใน URL ที่เป็นอันตราย ฉันไม่ได้ดูเมื่อเร็ว ๆ นี้เพื่อดูว่าพวกเขายังคงทำ
dave_thompson_085
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.