Mengapa saya bisa mengakses server dengan alamat IP parsial?

10

Di jaringan saya, saya memiliki server yang dikenal dengan alamat IP 10.0.0.15. Secara tidak sengaja, saya menemukan bahwa perintah: ping 10.0.15menghasilkan

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

... jadi server yang benar merespons ping. Bahkan ketika saya mencoba: ping 10.15Saya mendapatkan hasil yang sebanding. Juga, telnet ke alamat parsial berfungsi seperti yang diharapkan. Namun, SSH gagal. Mengapa paket yang dikirim ke alamat sebagian tiba di server yang benar?

Wooma
sumber
itu bukan alamat parsial ... jadi judulnya agak menyesatkan di sini ...
Rory Alsop
1
ssh harus dapat terhubung ke alamat seperti itu (karena memetakan ke nilai yang sama benar-benar diteruskan ke panggilan soket) tetapi ia tidak akan mengenali kunci host sebagai mencocokkan entri yang dikenal_hosts untuk alamat 'tepat', dengan hasil tergantung pada bagaimana Anda (atau admin Anda) telah mengonfigurasi pemeriksaan kunci host.
dave_thompson_085
Untuk kesenangan tambahan tentang representasi teks dari alamat IP, lihat jawaban saya yang lebih lama dan terkait di serverfault: serverfault.com/a/837667/355827
ilkkachu

Jawaban:

18

Itu adalah formulir yang diizinkan sesuai dengan inet_aton(3)fungsi dokumen:

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.

Misalnya

$ 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
$ 

Namun akhir-akhir ini akan lebih baik menggunakan getaddrinfoatau inet_ntopmemanggil dukungan IPv6. Barang-barang "Kelas B" menjadi warisan kembali pada tahun 1994 atau sekarang setelah kita memiliki CIDR dan /24...

Hei, Anda juga bisa memberikan bilangan bulat tua yang besar (tapi tolong jangan)

$ 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.
...

(Ini mungkin tidak portabel untuk unix lain; khususnya OpenBSD tidak dapat menyelesaikan 2130706433 ...)

thrig
sumber
1
Untuk lebih menyenangkan lagi, seperti yang harus dikatakan oleh para paragraf berikutnya (dan POSIX), setiap angka diuraikan seperti sumber C di mana terkemuka 0berarti oktal dan 0xatau 0Xberarti hex, jadi 010.020.030.040 sebenarnya alamat yang biasanya dituliskan sebagai 8.16.24.32 . Phisher biasa melakukan ini untuk 'menyembunyikan' identitas host di URL jahat; Saya belum melihat baru-baru ini untuk melihat apakah mereka masih melakukannya.
dave_thompson_085