Tại sao tôi không thể ping địa chỉ trên thiết bị loopback trong FreeBSD?


10

Từ Wikipedia :

Địa chỉ IP được sử dụng phổ biến nhất trên thiết bị loopback là 127.0.0.1 cho IPv4, mặc dù bất kỳ địa chỉ nào trong phạm vi 127.0.0.0 đến 127.255.255.255 đều được ánh xạ tới nó.

Điều này không đúng, ít nhất là trên 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

Đây có phải là hành vi đúng?

Câu trả lời:


9

FreeBSD (cũng là OS X và tôi tin rằng NetBSD & OpenBSD) sẽ trả lời các yêu cầu được gửi đến các địa chỉ được định cấu hình trên giao diện loopback, giống như các địa chỉ trên bất kỳ giao diện nào khác - Nếu bạn muốn trả lời trước tiên bạn cần gán địa chỉ :

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

Về logic đằng sau triển khai này, xem RFC 3330 :

127.0.0.0/8 - Khối này được chỉ định để sử dụng làm
địa chỉ vòng lặp máy chủ Internet . Một datagram được gửi bởi một giao thức cấp cao hơn tới một
địa chỉ ở bất cứ đâu trong khối này sẽ lặp lại bên trong máy chủ.
Điều này thường được triển khai bằng cách chỉ sử dụng 127.0.0.1 / 32 cho loopback ,
nhưng không có địa chỉ nào trong khối này sẽ xuất hiện trên bất kỳ mạng
nào ở bất cứ đâu [ RFC1700 , trang 5].

(nhấn mạnh của tôi)
Linux và Windows đang "hữu ích" ở đây, tuy nhiên từ ghế của tôi trả lời một yêu cầu được gửi đến một địa chỉ không được gán cho máy chủ này là hành vi không đúng ...


7

Tôi thấy hành vi tương tự như bạn mô tả trên FreeBSD 8.1. Mac OS X, chia sẻ một số DNA với FreeBSD, dường như cũng chỉ ánh xạ 127.0.0.1.

Cả Windows 7 và Linux (debian với kernel 2.6,26) đều xuất hiện để ánh xạ phạm vi địa chỉ đầy đủ như bạn mô tả trong trích dẫn Wikipedia (và theo quy định trong RFC).

Để trích dẫn từ RFC 3330:

127.0.0.0/8 - Khối này được chỉ định để sử dụng làm địa chỉ vòng lặp máy chủ Internet. Một datagram được gửi bởi một giao thức cấp cao hơn tới một địa chỉ ở bất cứ đâu trong khối này sẽ lặp lại bên trong máy chủ. Điều này thường được triển khai bằng cách chỉ sử dụng 127.0.0.1 / 32 cho loopback, nhưng không có địa chỉ nào trong khối này sẽ xuất hiện trên bất kỳ mạng nào ở bất cứ đâu [RFC1700, trang 5].

Tùy thuộc vào mức độ bạn diễn giải từ "nên", một số có thể khiến trường hợp hành vi FreeBSD / MacOS bị sai. Nhưng với việc sử dụng phổ biến 127.0.0.1 làm địa chỉ loopback, tôi nghi ngờ nó có khả năng quan trọng.


3
+1 Theo mặc định, chỉ có 127.0.0.1 được gán cho lo0. Mặc dù bạn chắc chắn có thể thêm phần còn lại; Tôi không thể tưởng tượng nhiều tình huống sẽ có vấn đề.
Chris S

Nó cũng phụ thuộc vào cách bạn diễn giải "vòng lặp lại bên trong máy chủ". Điều đó có nghĩa là datagram sẽ được gửi ở đâu đó có ý nghĩa; hoặc đơn giản là những gì diễn ra trong RFC, rằng datagram sẽ không được gửi đến một máy chủ khác trên mạng. (Tôi đồng ý với FreeBSD và Darwin, sau này)
Chris S

Nó cũng phụ thuộc vào cách bạn xem "tính chính xác" của việc trả lời các yêu cầu trên một địa chỉ không được gán rõ ràng cho bạn - Tôi luôn cảm thấy rằng nếu địa chỉ đó không được gán cho bạn thì bạn không có doanh nghiệp gửi phản hồi như thể đó là của bạn, với ngoại lệ có thể của các yêu cầu phát sóng.
voretaq7

Cũng +1 để trích dẫn cùng một RFC tôi đã làm :)
voretaq7

2
@ voretaq7 Tôi hoàn toàn trích dẫn nó đầu tiên. :)
eaj

0

Nó xô xu hướng. Không có hộp FreeBSD tiện dụng để xác nhận xem FreeBSD hay cấu hình của bạn.

RFC nói 127.0.0.1/24 - vì vậy nó sẽ được phản hồi.


1
Trên thực tế, RFC cho biết 127.0.0.0/8, nhưng không chỉ định (các) địa chỉ cụ thể nào trong phạm vi đó sẽ sử dụng: theo quy ước, địa chỉ có thể sử dụng đầu tiên trong phạm vi đó (127.0.0.1) được gán là localhost, nhưng bạn có thể sử dụng 127.32 .194,75 trong triển khai hệ điều hành của riêng bạn nếu bạn muốn. (Làm như vậy có thể giúp bạn tuy nhiên hành hình bởi quản trị hệ thống tức giận ...)
voretaq7

0

Câu hỏi được trả lời đầy đủ khoảng ba lần bây giờ, vì vậy tôi chỉ muốn thêm một số xu.

Lưu ý rằng trong một thời gian, cấu hình ipfw mặc định sẽ loại bỏ các gói loại này:

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

vì vậy với tường lửa được kích hoạt thay vì

ping: sendto: Can't assign requested address

Bạn có thể nhận được

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

Tái bút Vì có thể có máy chủ được xây dựng mà không có INET(hỗ trợ IPv4) và bạn sẽ không có 127.0.0.1=)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.