Почему я не могу пропинговать адрес на устройстве loopback под FreeBSD?

10

Из Википедии :

Наиболее часто используемый IP-адрес на устройстве обратной связи - 127.0.0.1 для IPv4, хотя любой адрес в диапазоне от 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 здесь «полезны», однако из-за того, что мой председатель отвечает на запрос, отправленный на адрес, не назначенный этому хосту, некорректное поведение ...

voretaq7
источник
7

Я вижу то же поведение, которое вы описываете во FreeBSD 8.1. Mac OS X, которая разделяет некоторую ДНК с FreeBSD, также, похоже, отображает только 127.0.0.1.

Windows 7 и Linux (debian с ядром 2.6.26), по-видимому, отображают полный диапазон адресов, как вы описываете в цитате Википедии (и как предписано в RFC).

Цитировать из RFC 3330:

127.0.0.0/8 - Этот блок назначен для использования в качестве петлевого адреса узла Интернета. Датаграмма, отправленная протоколом более высокого уровня на адрес в любом месте этого блока, должна вернуться обратно в хост. Обычно это реализуется с использованием только 127.0.0.1/32 для обратной связи, но никакие адреса в этом блоке никогда не должны появляться ни в одной сети [RFC1700, стр. 5].

В зависимости от того, насколько строго вы интерпретируете слово «следует», некоторые могут утверждать, что поведение FreeBSD / MacOS неверно. Но, учитывая повсеместное использование 127.0.0.1 в качестве адреса обратной связи, я сомневаюсь, что это может иметь значение.

Eaj
источник
3
+1 По умолчанию только 127.0.0.1 назначается lo0. Хотя вы, конечно, можете добавить остальные; Я не могу представить себе много ситуаций, когда это имело бы значение.
Крис С
Это также зависит от того, как вы интерпретируете «цикл внутри хоста». Означает ли это, что датаграмма будет доставлена ​​куда-то значимым; или просто то, что следует в RFC, что датаграмма не будет доставлена ​​другому хосту в сети. (Я бы согласился с FreeBSD и Дарвином, последним)
Крис С.
Это также зависит от того, как вы оцениваете «правильность» ответа на запросы на адрес, который вам не был назначен - я всегда чувствовал, что если адрес вам не назначен, вы не можете отправлять ответы, как если бы они были вашими, с возможным исключением широковещательных запросов.
voretaq7
Также +1 за цитирование того же RFC, что и я :)
voretaq7
2
@ voretaq7 Сначала я полностью процитировал это. :)
eaj
0

Это противодействие тенденции. Не имейте под рукой коробку FreeBSD, чтобы подтвердить, является ли она FreeBSD или вашей конфигурацией.

RFC говорит 127.0.0.1/24 - поэтому он должен отвечать.

SuperBob
источник
1
На самом деле RFC говорит 127.0.0.0/8, но не указывает, какой конкретный адрес (адреса) в этом диапазоне использовать: по соглашению первый используемый адрес в этом диапазоне (127.0.0.1) назначается localhost, но вы можете использовать 127.32 .194.75 в вашей собственной реализации ОС, если вы хотите. (Однако из-за этого вы можете получить линчевку от злых сисадминов ...)
voretaq7
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

PS. Конечно, может быть сервер построен без INET(поддержка IPv4), и у вас не будет даже 127.0.0.1=)

SaveTheRbtz
источник