Por que não consigo executar ping em um endereço no dispositivo de loopback no FreeBSD?

10

Da Wikipedia :

O endereço IP mais usado no dispositivo de loopback é 127.0.0.1 para IPv4, embora qualquer endereço no intervalo 127.0.0.0 a 127.255.255.255 esteja mapeado para ele.

Isso não é verdade, pelo menos no 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

Esse comportamento é correto?

Eugene Yarmash
fonte

Respostas:

9

O FreeBSD (também OS X, e acredito que o NetBSD e o OpenBSD) responderá às solicitações enviadas aos endereços configurados na interface de loopback, da mesma forma que responderiam a endereços em qualquer outra interface - Se você deseja uma resposta, precisa atribuir o endereço primeiro :

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

Sobre a lógica por trás dessa implementação, consulte RFC 3330 :

127.0.0.0/8 - Este bloco é atribuído para uso como o
endereço de loopback do host da Internet . Um datagrama enviado por um protocolo de nível superior para um
endereço em qualquer lugar dentro desse bloco deve retornar dentro do host.
Isso geralmente é implementado usando apenas 127.0.0.1/32 para loopback ,
mas nenhum endereço dentro deste bloco deve aparecer em nenhuma rede em qualquer
lugar [ RFC1700 , página 5].

(ênfase minha)
Linux e Windows estão sendo "úteis" aqui, no entanto, da minha cadeira, respondendo a uma solicitação que foi enviada para um endereço não atribuído a este host, não é um comportamento correto ...

voretaq7
fonte
7

Eu vejo o mesmo comportamento que você descreve no FreeBSD 8.1. O Mac OS X, que compartilha um pouco de DNA com o FreeBSD, também parece apenas mapear 127.0.0.1.

O Windows 7 e o Linux (debian com kernel 2.6.26) parecem mapear todo o intervalo de endereços conforme descrito na citação da Wikipedia (e conforme prescrito na RFC).

Para citar a RFC 3330:

127.0.0.0/8 - Este bloco é atribuído para uso como o endereço de loopback do host da Internet. Um datagrama enviado por um protocolo de nível superior para um endereço em qualquer lugar dentro desse bloco deve retornar dentro do host. Isso geralmente é implementado usando apenas 127.0.0.1/32 para loopback, mas nenhum endereço dentro deste bloco deve aparecer em nenhuma rede em qualquer lugar [RFC1700, página 5].

Dependendo de quão estritamente você interpreta a palavra "deveria", alguns podem argumentar que o comportamento do FreeBSD / MacOS está errado. Mas, dado o uso onipresente de 127.0.0.1 como endereço de loopback, duvido que seja provável que isso importe.

eaj
fonte
3
+1 Por padrão, apenas 127.0.0.1 é atribuído a lo0. Embora você possa certamente adicionar o resto; Não consigo imaginar muitas situações em que isso importaria.
Chris S
Também depende de como você interpreta "loop back inside the host". Isso significa inerentemente que o datagrama será entregue em algum lugar significativo; ou simplesmente o que se segue na RFC, que o datagrama não será entregue a outro host na rede. (Concordo com FreeBSD e Darwin, o último)
Chris S
Também depende de como você vê a "correção" de responder às solicitações em um endereço não explicitamente atribuído a você. Sempre achei que, se o endereço não foi atribuído a você, você não tem como enviar respostas como se fosse sua, com a possível exceção de solicitações de transmissão.
voretaq7
Também +1 para citando a mesma RFC eu fiz :)
voretaq7
2
@ voretaq7 Eu citei totalmente primeiro. :)
eaj
0

Está contrariando a tendência. Não tenha uma caixa do FreeBSD à mão para confirmar se é FreeBSD ou sua configuração.

O RFC diz 127.0.0.1/24 - então deve estar respondendo.

SuperBOB
fonte
1
Na verdade, o RFC diz 127.0.0.0/8, mas não especifica quais endereços específicos nesse intervalo a serem usados: por convenção, o primeiro endereço utilizável nesse intervalo (127.0.0.1) é atribuído como localhost, mas você pode usar 127.32 .194.75 na sua própria implementação do sistema operacional, se você quiser. (Isto pode no entanto se você linchado por administradores de sistemas irritados ...)
voretaq7
0

A questão está totalmente respondida cerca de três vezes até agora, então eu queria apenas adicionar alguns centavos.

Note que por algum tempo a configuração padrão do ipfw deixa cair este tipo de pacotes:

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

assim, com firewall ativado em vez de

ping: sendto: Can't assign requested address

Você pode conseguir

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

PS. Por uma causa, pode haver servidor construído sem INET(suporte IPv4) e você não terá nem 127.0.0.1=)

SaveTheRbtz
fonte