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

Правильно ли используется состояние RELATED в iptables?

Я видел много людей, использующих ESTABLISHED и СВЯЗАННЫЕ помечают вместе, чтобы ПРИНЯТЬ трафик после того, как соединение было ранее принято (см. Разрешение установленных сеансов).

Скажем, я установил свой брандмауэр со следующими правилами:

-A INPUT -i lo -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -d x.x.x.x --syn -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp -s x.x.x.x --dport 22 -d x.x.x.x --syn -j ACCEPT
-A INPUT -i eth0 -p tcp -m state --state ESTABLISHED,RELATED -m tcp ! --syn -d x.x.x.x -j ACCEPT
-A INPUT -i all -p all -j REJECT

Я ожидаю, что все новые подключения будут заблокированы последним правилом, если только это не порт 80 или порт 22. Однако для порта 22 я ограничиваю подключения одним входным IP-адресом (скажем, моим домашним офисом).

Тогда я жду правила с --state ESTABLISHED,RELATED принимать только трафик, который ранее был подключен с использованием правила с портом 80 или портом 22.

Однако из того, что я вижу в счетчиках брандмауэра, кажется, что я установил оба и СВЯЗАННО, любой трафик по TCP может быть отправлен на сервер ...

В моих тестах, скажем, у меня есть другой HTTP-сервер на порту 8080, я сначала подключаюсь к явно разрешенному порту 80, а затем каким-то образом могу подключиться и отправить GET и получить ответ на порт 8080, даже если он не открыт.

Точно так же, если я подключаюсь к порту 22, тогда доступен любой другой TCP-порт, открытый и прослушивающий 0.0.0.0. Меня беспокоит то, что это означает, что кто-то, кто подключается к порту 80, теперь имеет доступ к порту 22, поскольку СВЯЗАННЫЙ разрешает это (при условии, что порт 80 открыт, тогда новое соединение устанавливается на порт 22).

Я прав? Я думал вместо этого изменить правило на это:

-A INPUT -i eth0 -p tcp -m state --state ESTABLISHED -m tcp ! --syn -d x.x.x.x -j ACCEPT

(т.е. нет СВЯЗАННОГО состояния, только УСТАНОВЛЕНО)

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

Позвольте мне предположить следующие 3 вещи в вашей настройке:

  • у вас есть политика по умолчанию для таблицы INPUT для ACCEPT (это значение по умолчанию).
  • ваш счетчик пакетов / байтов по последнему правилу -A INPUT -i all -p all -j REJECT 0
  • у вас нет интерфейса с именем "все"

AFAIK -i параметр не имеет ключевого слова, например all, поэтому он считается именем интерфейса. При загрузке этого правила ошибки не возникает, потому что можно создавать правила для интерфейсов, которые еще не существуют или не работают. Итак, ваше последнее правило ничего не улавливает, и, поскольку ваша политика по умолчанию ACCEPT, принимаются все пакеты, не соответствующие ни одному правилу.

Если вы хотите того, чего ожидаете, не упоминайте какой-либо интерфейс, и тогда правило будет применено ко всем доступным интерфейсам:

-A INPUT -j REJECT

Это также хороший пример для установки политики DROP по умолчанию для таблицы (но, по крайней мере, до этого, конечно, внесите себя в белый список):

iptables -P INPUT DROP

Надеюсь, это решит вашу проблему. Сообщите нам, если счетчик пакетов или политика по умолчанию не соответствуют моим предположениям.