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

Зачем при использовании правил брандмауэра iptables утверждать НОВОЕ состояние на всех разрешенных портах?

Я часто вижу iptables, настроенный так, чтобы разрешить всем пакетам РОДСТВЕННЫЕ соединения, а определенные сервисные порты - НОВЫМ соединениям.

По какой причине указано NEW? Если соединение не НОВОЕ, оно, я думаю, СВЯЗАННО, поэтому конкретное правило порта не будет выполняться ни то, ни другое. Так почему же явно определять служебные порты с помощью NEW, а не только протокол и номер порта?

Правила в брандмауэре netfilter (iptables) проверяются последовательно, и судьба пакета (ACCEPT, DROP, REJECT и т. Д.) Определяется на основе первого совпадения.

Сделав брандмауэр с полным состоянием и первое правило типичным -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT подавляющее большинство законного трафика на ваш сервер принимается после прохождения только этого единственного правила. Этот трафик не должен проходить через какие-либо другие правила.

В зависимости от размера вашей базы правил это может означать значительную разницу в производительности вашего брандмауэра.

Единственный трафик, который теперь должен проверять межсетевой экран, - это явно новые соединения.

Т.е. сравните брандмауэр для общедоступного веб-сервера с доступом нескольких веб-мастеров со своих рабочих станций:

-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp -m multiport --dports 80,443 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -m iprange --src-range 10.9.8.7-10.9.8.10 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited

Примерно 99% легитимных пакетов будут принадлежать установленным соединениям, при соблюдении только первого правила. Из пакетов, не соответствующих этому правилу, большинство должны быть новыми подключениями к вашему веб-сайту, многопортовый модуль может предоставить доступ к HTTP или HTTPS в одном правиле. Веб-мастера входят в систему с нескольких рабочих станций с фиксированными адресами, используя ssh и sftp, а все остальное отклоняется.

Брандмауэр, в котором правила логически упорядочены по TCP-порту:

-A INPUT -p tcp  -m tcp --dport 22  --source 10.9.8.7 -j ACCEPT
-A INPUT -p tcp  -m tcp --dport 22  --source 10.9.8.8 -j ACCEPT
-A INPUT -p tcp  -m tcp --dport 22  --source 10.9.8.9 -j ACCEPT
-A INPUT -p tcp  -m tcp --dport 22  --source 10.9.8.10 -j ACCEPT
-A INPUT -p tcp  -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp  -m tcp --dport 443 -j ACCEPT

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

NEW означает, что пакет начал новое соединение.

Это обрабатывается модулями ядра, называемыми ip_conntrack_* которые делают ваш брандмауэр сохранный. Межсетевые экраны с отслеживанием состояния могут отслеживать потоки трафика.

Если вы просто укажете протокол и номер порта, ваш брандмауэр не будет иметь состояния, а не будет иметь состояния. Означает, что он просто ограничивает или блокирует пакеты. Брандмауэры этого типа не осведомлены о потоках данных.

Хорошим примером является FTP: активный FTP использует порт 21 для канала управления, но затем использует порт 20 для канала данных. В случае брандмауэра с отслеживанием состояния вам не нужно явно открывать порт 20, потому что он связан с предыдущим новым установленным соединением на порту 21.

Вот выдержка из iptables страница руководства:

НОВОЕ - означает, что пакет начал новое соединение или иным образом связан с соединением, которое не встречало пакетов в обоих направлениях.

УСТАНОВЛЕН - означает, что пакет связан с соединением, которое принимает пакеты в обоих направлениях.

СВЯЗАННЫЙ - означает, что пакет начинает новое соединение, но связан с существующим соединением, например с передачей данных FTP или ошибкой ICMP.

-A INPUT -m tcp -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -DROP

Приведенный выше набор правил позволит пакетам на TCP-порт 22 с состоянием INVALID через ACCEPT

Недействительным: Если ни одно из предыдущих состояний не применяется, пакет находится в состоянии НЕДЕЙСТВИТЕЛЬНО. Это может быть вызвано различными типами скрытых сетевых зондов или может означать, что у вас заканчиваются записи CONNTRACK (которые вы также должны видеть в своих журналах). Или это может быть просто совершенно безобидно.

https://unix.stackexchange.com/questions/57423/how-to-understand-why-the-packet-was-considered-invalid-by-the-iptables


Утверждая СОСТОЯНИЕ NEW гарантирует, что пакеты INVALID не принимаются по ошибке.

И чтобы прояснить значения:

  • НОВАЯ: Это новый Connections
  • СОЗДАНО: Это пакет, участвующий в текущем соединении.
  • СВЯЗАННЫЙ: Это новое соединение, но было предопределено существующим соединением.
  • НЕДЕЙСТВИТЕЛЬНЫМ: Ничего из вышеперечисленного не применимо.