По крайней мере на двух версиях 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.