Назад | Перейти на главную страницу

iptables -i lo против -s localhost и -j REJECT против -P INPUT REJECT

Предисловие

Как и все в Linux, я уверен, что есть много способов получить желаемый результат с помощью iptables. Я хотел бы ограничить ответы следующими категориями:

  1. В чем разница между вариантами?
  2. Какой вариант лучше (или они одинаковые)?
  3. Почему вы предпочитаете одно другому?

И, пожалуйста, четко укажите, к какой категории вы обращаетесь. Это нормально заявить предпочтения, но не подразумевайте, что это Лучший.

например

Я предпочитаю ставить --jump в качестве первого аргумента, потому что я думаю, что лучше сначала иметь намерение, и мне нравится выравнивать по вертикали, как аргументы нескольких команд.

Вопрос

Один из них лучше другого?

iptables -I INPUT --jump ACCEPT --in-interface lo
iptables -I INPUT --jump ACCEPT --source localhost

Один из них лучше другого?

iptables -A INPUT --jump REJECT
iptables -P INPUT REJECT

В обоих случаях две сравниваемые команды iptables имеют разную семантику и ведут себя по-разному по отношению друг к другу. Дело не обязательно в том, что «лучше», а в том, какое поведение вы пытаетесь согласовать или обеспечить.

Первый:

iptables -I INPUT --jump ACCEPT --in-interface lo
iptables -I INPUT --jump ACCEPT --source localhost

Первый из них принимает весь локальный трафик на lo интерфейс, независимо от его IP-адреса. Второй принимает весь трафик с 127.0.0.1, независимо от того, на какой интерфейс он поступает.

В этом случае первый явно лучше. В первом случае локальный трафик не обязательно использует 127.0.0.1 в качестве своего IP-адреса, но вы, вероятно, захотите его принять (наиболее известным из них является нечетный 127.0.1.1 Debian, но возможно присоединение глобальных IP-адресов. к lo), а во втором случае кто-то может отправить вам поддельные пакеты с адресом источника 127.0.0.1, и вы, вероятно, не захотите принимать это.

Второй:

iptables -A INPUT --jump REJECT
iptables -P INPUT REJECT

Обычно они функционально идентичны, за исключением:

Когда кто-то добавляет дополнительные правила в конец цепочки INPUT, правила не будут иметь никакого эффекта. В архивах есть множество примеров того, как людей это смущает. Так что вы можете использовать вторую форму.

Политика цепочки не может принимать аргументы, но цель REJECT делает принимать аргументы. Если вы хотите указать причину отказа или указать разные причины отказа в разных обстоятельствах, вы должны использовать первую форму (см. iptables-extensions справочную страницу со списком причин отказа).

Что касается предпочтений, я настраиваю iptables так, чтобы легко управлять и трудно неправильно управлять.

  1. Для бессмысленного форматирования я предпочитаю записывать свои правила в таком порядке, чтобы я мог больше всего легко проверить статус брандмауэра независимо от того, насколько простой инструмент используется. Изучение изменений должно быть таким же тривиальным, как diff -wu <(iptables-save | egrep -v ^#) <(egrep -v ^# rules.v4)

  2. Когда два одинаковых подхода под общий конфигурации приводят к такому же поведению, я выбираю ту, которая будет выразить то, что я действительно имел в виду даже под необычный конфигурации. Следовательно, я предпочитаю -A INPUT -i lo -J ACCEPT над -A INPUT -s localhost -J ACCEPT потому что последний идет с предположение (что при нормальной настройке ни один другой интерфейс не может получить такой пакет)

  3. Когда два ограничения означают одно и то же, я выбираю либо оба, либо то, что нельзя непреднамеренно поднять. Хотя правило -A INPUT -j REJECT возможно -Rзаменена, такая ошибка не повлияет на политику сети, например -P INPUT REJECT