Mengapa saya tidak bisa melakukan ping alamat pada perangkat loopback di bawah FreeBSD?

10

Dari Wikipedia :

Alamat IP yang paling umum digunakan pada perangkat loopback adalah 127.0.0.1 untuk IPv4, meskipun alamat dalam kisaran 127.0.0.0 hingga 127.255.255.255 dipetakan ke sana.

Ini tidak benar, setidaknya di FreeBSD:

$ ping 127.1.1.1
PING 127.1.1.1 (127.1.1.1): 56 data bytes
ping: sendto: Can't assign requested address

Apakah ini perilaku yang benar?

Eugene Yarmash
sumber

Jawaban:

9

FreeBSD (juga OS X, dan saya percaya NetBSD & OpenBSD) akan menanggapi permintaan yang dikirim ke alamat yang dikonfigurasi pada antarmuka loopback, sama seperti yang akan mereka lakukan untuk alamat pada antarmuka lain - Jika Anda menginginkan jawaban, Anda harus menetapkan alamat terlebih dahulu :

mgraziano@monitor ~]$ ifconfig lo0
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
    options=3<RXCSUM,TXCSUM>
    inet6 fe80::1%lo0 prefixlen 64 scopeid 0x3 
    inet6 ::1 prefixlen 128 
    inet 127.0.0.1 netmask 0xff000000 
    nd6 options=3<PERFORMNUD,ACCEPT_RTADV>

[mgraziano@monitor ~]$ ping 127.1.1.1
PING 127.1.1.1 (127.1.1.1): 56 data bytes
ping: sendto: Can't assign requested address
^C

[mgraziano@monitor ~]$ sudo ifconfig lo0 alias 127.1.1.1 netmask 0xFFFFFFFF

[mgraziano@monitor ~]$ ifconfig lo0
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
    options=3<RXCSUM,TXCSUM>
    inet6 fe80::1%lo0 prefixlen 64 scopeid 0x3 
    inet6 ::1 prefixlen 128 
    inet 127.0.0.1 netmask 0xff000000 
    inet 127.1.1.1 netmask 0xffffffff 
    nd6 options=3<PERFORMNUD,ACCEPT_RTADV>

[mgraziano@monitor ~]$ ping 127.1.1.1
PING 127.1.1.1 (127.1.1.1): 56 data bytes
64 bytes from 127.1.1.1: icmp_seq=0 ttl=64 time=0.020 ms
^C

Pada logika di balik implementasi ini, lihat RFC 3330 :

127.0.0.0/8 - Blok ini ditugaskan untuk digunakan sebagai
alamat loopback host Internet . Datagram yang dikirim oleh protokol tingkat yang lebih tinggi ke
alamat di mana saja di dalam blok ini harus kembali ke dalam host.
Ini biasanya diimplementasikan hanya menggunakan 127.0.0.1/32 untuk loopback ,
tetapi tidak ada alamat dalam blok ini yang akan pernah muncul di jaringan
mana pun di mana pun [ RFC1700 , halaman 5].

(penekanan saya)
Linux dan Windows sedang "membantu" di sini, namun dari kursi saya menjawab permintaan yang dikirim ke alamat yang tidak ditugaskan ke host ini adalah perilaku yang tidak benar ...

voretaq7
sumber
7

Saya melihat perilaku yang sama yang Anda gambarkan di FreeBSD 8.1. Mac OS X, yang berbagi beberapa DNA dengan FreeBSD, juga sepertinya memetakan 127.0.0.1.

Windows 7 dan Linux (debian dengan kernel 2.6.26) keduanya muncul untuk memetakan rentang alamat lengkap seperti yang Anda jelaskan dalam kutipan Wikipedia (dan seperti yang ditentukan dalam RFC).

Mengutip dari RFC 3330:

127.0.0.0/8 - Blok ini ditugaskan untuk digunakan sebagai alamat loopback host Internet. Datagram yang dikirim oleh protokol tingkat yang lebih tinggi ke alamat di mana saja di dalam blok ini harus kembali ke dalam host. Ini biasanya diimplementasikan hanya menggunakan 127.0.0.1/32 untuk loopback, tetapi tidak ada alamat dalam blok ini yang akan pernah muncul di jaringan mana pun di mana pun [RFC1700, halaman 5].

Bergantung pada seberapa ketat Anda mengartikan kata "seharusnya", beberapa orang mungkin berpendapat bahwa perilaku FreeBSD / MacOS salah. Tetapi mengingat penggunaan 127.0.0.1 di mana-mana sebagai alamat loopback, saya ragu itu mungkin penting.

eaj
sumber
3
+1 Secara default, hanya 127.0.0.1 yang ditugaskan ke lo0. Meskipun Anda tentu saja dapat menambahkan sisanya; Saya tidak bisa membayangkan banyak situasi di mana itu akan menjadi masalah.
Chris S
Ini juga tergantung pada bagaimana Anda menafsirkan "loop kembali ke dalam host". Apakah itu secara inheren berarti datagram akan dikirim ke suatu tempat yang bermakna; atau hanya apa yang mengikuti dalam RFC, bahwa datagram tidak akan dikirimkan ke host lain di jaringan. (Saya setuju dengan FreeBSD dan Darwin, yang terakhir)
Chris S
Itu juga tergantung pada bagaimana Anda melihat "kebenaran" dari menjawab permintaan pada alamat yang tidak secara eksplisit diberikan kepada Anda - Saya selalu merasa bahwa jika alamat tersebut tidak diberikan kepada Anda, Anda tidak memiliki bisnis yang mengirim tanggapan seolah-olah itu milik Anda, dengan kemungkinan pengecualian dari permintaan siaran.
voretaq7
Juga memberi +1 untuk mengutip RFC yang sama yang saya lakukan :)
voretaq7
2
@ voretaq7 Saya benar-benar mengutipnya dulu. :)
eaj
0

Itu bucking tren. Jangan memiliki kotak FreeBSD yang berguna untuk mengkonfirmasi apakah FreeBSD atau konfigurasi Anda.

RFC mengatakan 127.0.0.1/24 - jadi itu harus merespons.

SuperBOB
sumber
1
Sebenarnya RFC mengatakan 127.0.0.0/8, tetapi tidak menentukan alamat spesifik mana yang digunakan: dengan konvensi, alamat yang dapat digunakan pertama dalam rentang itu (127.0.0.1) ditetapkan sebagai localhost, tetapi Anda bisa menggunakan 127.32 .194.75 dalam implementasi OS Anda sendiri jika Anda mau. (Namun, hal itu dapat membuat Anda digantung oleh sysadmin yang marah ...)
voretaq7
0

Pertanyaan sepenuhnya dijawab tentang tiga kali sekarang, jadi saya ingin menambahkan beberapa sen.

Perhatikan bahwa untuk beberapa waktu, konfigurasi ipfw default akan menghapus paket semacam ini:

./rc.firewall:  ${fwcmd} add 100 allow ip from any to any via lo0
./rc.firewall:  ${fwcmd} add 300 deny ip from 127.0.0.0/8 to any

demikian juga dengan firewall yang diaktifkan

ping: sendto: Can't assign requested address

Anda mungkin mendapatkan

[savetherbtz@PH34R ~]$ ping 127.0.0.2
PING 127.0.0.2 (127.0.0.2): 56 data bytes
ping: sendto: Permission denied

PS. Karena bisa ada server yang dibangun tanpa INET(dukungan IPv4) dan Anda bahkan tidak akan 127.0.0.1= =)

SaveTheRbtz
sumber