Почему Linux принимает трафик на ненастроенных петлевых адресах?

Почему Linux принимает трафик на ненастроенных петлевых адресах?

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

решение1

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

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

решение2

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

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

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

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

решение3

Это не относится только к 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.

Связанный контент