Совет по оптимальной конфигурации межсетевого экрана (Iptables)

Вопрос или проблема

Это моя конфигурация Iptables:

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
:port-scan - [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m multiport --sports 80,443 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 8 -j REJECT --reject-with icmp-port-unreachable
-A INPUT -j DROP
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN FIN,SYN -j DROP
-A INPUT -p tcp -m tcp --tcp-flags SYN,RST SYN,RST -j DROP
-A INPUT -p tcp -m tcp --tcp-flags FIN,RST FIN,RST -j DROP
-A INPUT -p tcp -m tcp --tcp-flags FIN,ACK FIN -j DROP
-A INPUT -p tcp -m tcp --tcp-flags ACK,URG URG -j DROP
-A INPUT -p tcp -m tcp --tcp-flags FIN,ACK FIN -j DROP
-A INPUT -p tcp -m tcp --tcp-flags PSH,ACK PSH -j DROP
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j DROP
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,PSH,URG -j DROP
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,PSH,URG -j DROP
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,ACK,URG -j DROP
-A INPUT -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -m state --state NEW -j DROP
-A INPUT -j LOG
-A FORWARD -j DROP
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate NEW,RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -p udp -m udp --dport 53 -j ACCEPT
-A OUTPUT -p icmp -m icmp --icmp-type 8 -j DROP
-A OUTPUT -j DROP
-A port-scan -m limit --limit 1/sec --limit-burst 4 -j RETURN

Есть предложения по улучшению или удалению бесполезных правил?

Когда ваша политика базовой цепи – сброс (:INPUT DROP [0:0]), нет смысла добавлять правила сброса в базовую цепь, если только вам не нужно «вычесть» часть правила принятия.

Например, если вы хотите принять весь входящий трафик ICMP кроме тех, что «типа 8» (что бы это ни значило):

-A INPUT -p icmp -m icmp --icmp-type 8 -j DROP
-A INPUT -p icmp -j ACCEPT

Обратите внимание, что правила отклонения, такие как те, что с -j REJECT --reject-with icmp-port-unreachable, не то же самое, что и правила сброса. Я не собираюсь углубляться в детали того, когда вам может понадобиться отклонить трафик вместо того, чтобы просто сбрасывать его, или что означает отклонение, скорее моя точка зрения заключается в том, если вы хотите отклонить определенный трафик вместо его сброса, вам понадобится правило, даже когда политика цепи – сброс.

Поскольку у вас нет никаких значимых правил принятия добавленных (после) этих правил:

-A INPUT -j DROP
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN FIN,SYN -j DROP
-A INPUT -p tcp -m tcp --tcp-flags SYN,RST SYN,RST -j DROP
-A INPUT -p tcp -m tcp --tcp-flags FIN,RST FIN,RST -j DROP
-A INPUT -p tcp -m tcp --tcp-flags FIN,ACK FIN -j DROP
-A INPUT -p tcp -m tcp --tcp-flags ACK,URG URG -j DROP
-A INPUT -p tcp -m tcp --tcp-flags FIN,ACK FIN -j DROP
-A INPUT -p tcp -m tcp --tcp-flags PSH,ACK PSH -j DROP
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j DROP
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,PSH,URG -j DROP
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,PSH,URG -j DROP
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,ACK,URG -j DROP
-A INPUT -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -m state --state NEW -j DROP

ни одно из них не имеет значения.

Я не знаю, могут ли какие-либо из этих правил проверки TCP-флагов иметь смысл при любых обстоятельствах, но если вы действительно хотите применить их, например, к трафику -p tcp -m multiport --sports 80,443, правильный способ сделать это – добавить эти правила сброса в новую цепь (вместо базовой цепи), например, названную TCP_FC, а затем заменить -j ACCEPT на -g TCP_FC (-j TCP_FC в данном случае подходит), с резервным -j ACCEPT добавленным в конце TCP_FC:

-N TCP_FC
-A TCP_FC -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
...
-A TCP_FC -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,ACK,URG -j DROP
-A TCP_FC -j ACCEPT
-A INPUT -p tcp -m multiport --sports 80,443 -g ACCEPT_FC

Обратите внимание, что когда у вас есть:

-m state --state RELATED,ESTABLISHED -j ACCEPT

в цепи, такой как INPUT, любое правило, состоящее из того же совпадения, например,

-A INPUT -p tcp -m multiport --sports 80,443 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

бесполезно (-m state --state RELATED,ESTABLISHED является более короткой версией -m conntrack --ctstate RELATED,ESTABLISHED), потому что «принять любой A» «покрывает» «принять любой A И B».

Другими словами, если вы действительно просто хотите принять часть трафика RELATED,ESTABLISHED, то не следует иметь правило, которое принимает их всех. И если вы все же хотите «оптимизировать» что-то вроде:

-A INPUT -p tcp -m multiport --sports 80,443 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p udp --sports 53 -m state --state RELATED,ESTABLISHED -j ACCEPT
...

вы можете сделать что-то вроде:

-N ACCEPT_RE
-A ACCEPT_RE -p tcp -m multiport --sports 80,443 -j ACCEPT
-A ACCEPT_RE -p udp --sports 53 -j ACCEPT
...
-A INPUT -m state --state RELATED,ESTABLISHED -g ACCEPT_RE

Обратите внимание на -g в последнем правиле, что означает, если какой-то трафик совпадает с этим правилом и, следовательно, «переходит» в указанную цепь (ACCEPT_RE), но он дальше не совпадает с никаким правилом в этой цепи, он не пройдет через последующие правила в цепи, содержащие правило с -g. (Когда есть только один дополнительный уровень цепи, как в данном примере, это означает, что судьба трафика будет определяться политикой цепи базовой цепи, а именно DROP в INPUT.)

Также вы можете в целом иметь что-то вроде этого вместо:

-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 8 -j REJECT --reject-with icmp-port-unreachable
-A INPUT -m state ! --state RELATED,ESTABLISHED -j DROP
-A INPUT -p tcp -m multiport --sports 80,443 -j ACCEPT

Обратите внимание, что правило принятия -i lo было «перемещено вверх», чтобы сохранить тот же эффект, который имеет в исходном наборе правил – любой трафик -i lo должен быть принят независимо от его состояния.

Правило отклонения для -p icmp -m icmp --icmp-type 8 также было поднято, чтобы такой трафик отклонялся вместо того, чтобы сбрасываться независимо от его состояния.

Отклоняя «ранний» любой трафик состояния, отличного от (обратите внимание на !) RELATED или ESTABLISHED, а именно с состоянием NEW или INVALID, вы можете иметь правила принятия после правила сброса, которые принимают, например, трафик -p tcp -m multiport --sports 80,443, не указывая ту же проверку состояния снова и снова, потому что только трафики, которые «пробрались» через правило сброса, смогут «достичь» правила(ов) принятия, которые следуют.


Проверка состояния (conntrack) в этом правиле бесполезна:

-A OUTPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate NEW,RELATED,ESTABLISHED -j ACCEPT

потому что перед ним у вас есть:

-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

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


Также обратите внимание, что это правило не будет использовано вообще:

-A port-scan -m limit --limit 1/sec --limit-burst 4 -j RETURN

поскольку никакой трафик не будет проходить через цепь port-scan (т.е. ни -j port-scan, ни -g port-scan не используются ни в одном правилe). Кроме того, эффект RETURN в значительной степени зависит от «структуры» вашего набора правил.

Ответ или решение

Оптимизация настроек iptables: Полный анализ и рекомендации

Введение

Настройка брандмауэра с использованием iptables — это ключевой аспект обеспечения безопасности вашей сети. Правильная конфигурация помогает защитить систему от несанкционированного доступа и других угроз. В данной статье мы рассмотрим приведенную конфигурацию и предложим рекомендации по ее оптимизации.

Анализ текущей конфигурации

Ваши текущие правила iptables имеют следующую структуру:

  1. Базовая политика: Все цепочки (INPUT, FORWARD, OUTPUT) настроены на DROP, что создает строгую основу для фильтрации трафика.

  2. Правила для входящего трафика:

    • Разрешены пакеты, относящиеся к уже установленным соединениям.
    • Разрешен трафик от локального интерфейса.
    • Определены сложные правила для блокировки определенных TCP-флагов.
  3. Правила для исходящего трафика:

    • Разрешены пакеты, относящиеся к установленным соединениям.
    • Неправильная комбинация правил для портов 80 и 443, так как дублируются проверки состояния.
  4. Логирование и блокировка: Логирование пакетов осуществляется, но блокировка некоторых типов трафика может быть избыточной.

Рекомендации по оптимизации

  1. Упрощение правил для входящего трафика:

    • Действительно, множество правил, блокирующих TCP-флаги, могут быть избыточными. Эти правила можно объединить в более универсальное правило или же переместить в отдельную цепочку, как предложено:
      -N TCP_FC
      -A TCP_FC -m tcp -m multiport --sports 80,443 -j ACCEPT
      -A TCP_FC -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
      ...
      -A TCP_FC -j ACCEPT
      -A INPUT -g TCP_FC
  2. Устранение дублирующих правил:

    • Правила, которые дублируют разрешение пакетов в цепочке INPUT, могут быть удалены или заменены более общими формулировками:
      -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
  3. Устранение неиспользуемых цепочек:

    • Цепочка port-scan не используется. Если она не планируется, ее следует удалить.
      -N port-scan  # Удалите эту строку, если не используется
  4. Оптимизация для исходящего трафика:

    • Существующая проверка состояния для исходящего трафика через порты 80 и 443 действительно избыточна:
      -A OUTPUT -p tcp -m multiport --dports 80,443 -j ACCEPT

      Предоставьте только необходимые проверки состояния.

  5. Логирование:

    • Рекомендуется использовать логирование более избирательно, чтобы не перегружать систему лишними записями.

Заключение

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

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

Оцените материал
Добавить комментарий

Капча загружается...