FreeBSD에서 루프백 장치의 주소를 Ping 할 수없는 이유는 무엇입니까?


10

에서 위키 백과 :

루프백 장치에서 가장 일반적으로 사용되는 IP 주소는 IPv4의 경우 127.0.0.1이지만 127.0.0.0에서 127.255.255.255 범위의 주소가 매핑됩니다.

적어도 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

이것이 올바른 행동입니까?

답변:


9

FreeBSD (OS X 및 NetBSD & OpenBSD)는 다른 인터페이스의 주소와 마찬가지로 루프백 인터페이스의 구성된 주소로 전송 된 요청에 응답 할 것입니다. 응답을 원하면 먼저 주소를 할당해야합니다 :

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

이 구현의 논리에 대해서는 RFC 3330을 참조하십시오 .

127.0.0.0/8-이 블록은 인터넷 호스트
루프백 주소 로 사용되도록 할당됩니다 . 상위 레벨 프로토콜
에서이 블록 내의 주소로 전송 된 데이터 그램 은 호스트 내부에서 루프백해야합니다.
이것은 일반적으로 단지 127.0.0.1/32 루프백을 사용하여 구현됩니다 ,
하지만,이 블록 내에 주소는 과거의 어떤 네트워크에 표시되지 않아야
어디서든 [ RFC1700 , 5 페이지].

(강조 표시)
Linux와 Windows는 여기에서 "도움이됩니다". 그러나이 호스트에 할당되지 않은 주소로 전송 된 요청에 응답하는 내 의자에서 올바른 동작이 아닙니다 ...


7

FreeBSD 8.1에서 설명한 것과 같은 동작을 봅니다. FreeBSD와 DNA를 공유하는 Mac OS X도 127.0.0.1 만 매핑하는 것 같습니다.

Windows 7 및 Linux (2.6.26 커널을 사용하는 데비안)는 모두 Wikipedia 견적에 설명 된대로 (RFC에 규정 된대로) 전체 주소 범위를 매핑하는 것으로 보입니다.

RFC 3330에서 인용하려면 :

127.0.0.0/8-이 블록은 인터넷 호스트 루프백 주소로 사용되도록 할당됩니다. 상위 레벨 프로토콜에서이 블록 내의 주소로 전송 된 데이터 그램은 호스트 내부에서 루프백해야합니다. 이것은 일반적으로 루프백을 위해 127.0.0.1/32 만 사용하여 구현되지만이 블록 내의 주소는 어느 네트워크에도 나타나지 않아야합니다 [RFC1700, 페이지 5].

"should"라는 단어를 얼마나 엄격하게 해석 하느냐에 따라 일부는 FreeBSD / MacOS 동작이 잘못 될 수 있습니다. 그러나 루프백 주소로 127.0.0.1을 유비쿼터스로 사용하면 문제가 될지 의심됩니다.


3
+1 기본적으로 lo0에는 127.0.0.1 만 할당됩니다. 당신은 확실히 나머지를 추가 할 수 있지만; 중요한 상황을 상상할 수 없습니다.
Chris S

또한 "호스트 내부 루프백"을 해석하는 방법에 따라 다릅니다. 본질적으로 데이터 그램이 의미있는 곳으로 전달 될 것임을 의미합니까? 또는 단순히 RFC에서 따르는 것이므로 데이터 그램이 네트워크의 다른 호스트로 전달되지 않습니다. (저는 FreeBSD와 후자의 다윈에 동의합니다)
Chris S

또한 귀하에게 명시 적으로 할당되지 않은 주소에 대한 응답 요청의 "정확성"을 보는 방법에 따라 다릅니다. 주소가 귀하에게 할당되지 않은 경우 귀하의 비즈니스 인 것처럼 응답을 보내는 비즈니스가 없다고 항상 느꼈습니다. 브로드 캐스트 요청을 제외하고는 가능합니다.
voretaq7

내가했던 것과 같은 RFC를 인용 한 것도 +1입니다.
voretaq7

2
@ voretaq7 나는 그것을 먼저 인용했다. :)
eaj

0

트렌드를 버리고 있습니다. FreeBSD 또는 구성 여부를 확인하는 데 편리한 FreeBSD 상자가 없습니다.

RFC는 127.0.0.1/24라고 말하고 있으므로 응답해야합니다.


1
실제로 RFC는 127.0.0.0/8이지만 해당 범위에서 사용할 특정 주소를 지정하지 않습니다. 일반적으로 해당 범위에서 사용 가능한 첫 번째 주소 (127.0.0.1)는로 지정 localhost되지만 127.32를 사용할 수 있습니다 원하는 경우 자체 OS 구현에서 .194.75. (그러나 그렇게하면 화난 sysadmins에 의해 당신을
잡힐

0

질문은 지금까지 세 번 정도 완전히 대답되었으므로 센트를 추가하고 싶었습니다.

꽤 오랜 시간 동안 기본 ipfw 설정은 이러한 종류의 패킷을 삭제합니다.

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

방화벽 대신 방화벽을 사용

ping: sendto: Can't assign requested address

당신은 얻을 수 있습니다

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

추신. 원인없이 INET(IPv4 지원) 없이 서버를 구축 할 수 있으며 짝수도 가질 수 없습니다 127.0.0.1)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.