3

По крайней мере, в двух версиях Linux (Ubuntu 9 и Debian 7) я заметил, что, хотя у меня настроен только один адрес обратной связи (lo - стандартный 127.0.0.1), он с радостью принимает пакеты для ЛЮБОГО 127.xxx адрес. Я нашел это довольно удивительным, так как другие варианты Unix отбрасывают пакеты для ненастроенных адресов.

  • Почему / как это происходит? Это не происходит для любого другого диапазона адресов, не так ли?
  • Как мне заставить его сделать более разумным (и безопасным!) вещь а на самом деле обращать внимание на настроенные адреса?

Редактировать: я прочитал RFC 5735, и это довольно небрежная интерпретация того, что переход от «адресов в пределах всего блока 127.0.0.0/8 нигде не появляется в сети на законных основаниях», чтобы «эта машина должна принимать пакеты для всех эти IP-адреса ". В конце концов, вы не видите хостов, принимающих пакеты для всех 172.16.0.0/12, просто потому, что у них настроен один из этих адресов.

Я хотел спросить не о спецификации адресов, а о реализации в Linux логики приема пакетов. "Почему" и "как" здесь означают, что в настоящем ядре Linux вызывает нормальную логику "этот пакет для меня"?

3 ответа3

4

Loopback особенный. Это все пространство 127.0.0.0/8, и оно никогда не покидает машину. Это единственное исключение при прослушивании только сконфигурированных адресов, если оно по шлейфу, оно особенное.

Я не могу думать о каких-либо последствиях для безопасности, так как эти адреса никогда не могут быть в физической сети.

1

Обычная логика маршрутизации не обходится, и эта конфигурация более безопасна, чем та, которую вы предлагаете.

Сначала давайте посмотрим на таблицу маршрутизации, чтобы увидеть, что происходит.

# ip address show dev lo
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
# ip route show table 0
...
broadcast 127.0.0.0 dev lo  table local  proto kernel  scope link  src 127.0.0.1 
local 127.0.0.0/8 dev lo  table local  proto kernel  scope host  src 127.0.0.1 
local 127.0.0.1 dev lo  table local  proto kernel  scope host  src 127.0.0.1

Мы видим, что интерфейс настроен с префиксом /8 , что заставляет Linux автоматически генерировать маршрут для 127.0.0.0/8 который идет к интерфейсу lo . Это обеспечивает требование, чтобы все пакеты для этого блока нигде не появлялись в сети и не возвращались обратно в хост.

Без этого маршрута пакеты для сети 127.0.0.0/8 не были бы закольцованы внутри хоста и потенциально могли бы быть направлены на сетевой интерфейс. Это может привести к небезопасности и несоответствию RFC.

Имейте в виду, что "петля" означает именно это. В то время как на обычном интерфейсе отправленный ему пакет выходит, на петлевом интерфейсе отправленный ему пакет выходит и немедленно возвращается. Вот что означает петля, и почему вы видите этот трафик.

0

Это не специфично для Linux (Win работает точно так же), скорее следуя спецификации (как заметил Эрик): из RFC 5735 - IPv4-адреса специального назначения

127.0.0.0/8 - This block is assigned for use as the Internet host
   loopback address.  A datagram sent by a higher-level protocol to an
   address anywhere within this block loops back inside the host.  This
   is ordinarily implemented using only 127.0.0.1/32 for loopback.  As
   described in [RFC1122], Section 3.2.1.3, addresses within the entire
   127.0.0.0/8 block do not legitimately appear on any network anywhere.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .