Помощь

Настройка брандмауэра iptables

Iptables — это межсетевой экран, предназначенный для операционных систем Linux, который обеспечивает управление прохождением сетевого трафика. При попытке установить соединение с сервером (или отправить запрос с сервера), Iptables проверяет цепочку правил для конкретного соединения и применяет заданные настройки.

Iptables по умолчанию установлен во всех современных дистрибутивах Linux.

Типы цепочек

Существует три типа цепочек iptables — INPUT, OUTPUT и FORWARD.

  • INPUT — эта цепочка используется для обработки входящих соединений.
  • OUTPUT — используется для исходящих соединений.
  • FORWARD — используется для обработки транзитного трафика, например, в случае маршрутизатора. Если вы не занимаетесь настройкой маршрутизации, то правила этого типа вам не потребуются.

Цепочка представляет собой упорядоченный набор правил. Каждое правило включает критерий (например, IP-адрес источника пакета) и действие, которое нужно применить к пакету, соответствующему этому критерию (например, "разрешить"). Если критерий отсутствует, правило применяется ко всем пакетам.

При определении действия с пакетом, iptables просматривает соответствующую цепочку с начала списка правил, последовательно проверяя их, пока не найдет совпадение. Если совпадение не обнаружено (соединение не соответствует ни одному созданному правилу), применяется правило по умолчанию.

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

Действия с соединениями

Существуют три типа действий, которые могут быть применены к соединениям:

Accept — разрешить соединение.

Drop — игнорировать (блокировать) соединение без отправки уведомления источнику о блокировке. Это рекомендуется для обработки трафика на портах, подключенных к интернету, так как в этом случае злоумышленники получают минимум информации при сканировании портов.

Reject — отклонить соединение с уведомлением источника запроса о блокировке. По умолчанию отправляется ответный пакет "icmp-port-unreachable", однако также доступна дополнительная настройка сообщения (например, "icmp-host-unreachable", "icmp-net-prohibited", "icmp-host-prohibited" и другие).

Настройка правил

В данной статье общий формат для настройки правил будет выглядеть следующим образом:

iptables действие цепочка правило

Мы опускаем упоминание таблицы в этом формате, так как рассматриваем настройку для основной таблицы фильтрации filter, которая предполагается в командах iptables по умолчанию. Дополнительное указание этой таблицы не требуется.

Действие в данном контексте представляет собой шаг, который необходимо предпринять в отношении правила (например, добавить или удалить его).

Примеры доступных действий в iptables:

  • -A — добавить правило в цепочку;
  • -I — добавить правило в цепочку, указав номер;
  • -D — удалить правило;
  • -F — удалить все правила;
  • -L — вывести все правила в текущей цепочке;
  • -P — установить действие по умолчанию.

Дополнительные опции:

  • -p — указать протокол пакета;
  • -s — указать IP-адрес источника пакета;
  • -j — определить, как обработать пакет (разрешить, заблокировать и т. д.).

Просмотр существующих правил

Для вывода всех правил используйте следующую команду:

iptables -L

Или команду с более подробным выводом:

iptables -L -n -v

Вы также можете просмотреть правила для конкретной цепочки, например, для цепочки INPUT:

iptables -L INPUT

Правила по умолчанию

Если ни одно из созданных правил не соответствует входящему пакету, будет применено правило по умолчанию.

Чтобы просмотреть правила по умолчанию, выполните следующую команду:

iptables -L | grep policy

Если вы не меняли политику по умолчанию, то для всех цепочек изначально установлены разрешающие правила.

Чтобы установить правило по умолчанию, используйте опцию -P, например:

iptables -P FORWARD DROP

Примеры настроек

Чтобы добавить правило в существующую цепочку, выполните команду:

iptables -A

Если вам нужно поместить правило не в конец списка, вы можете использовать следующий формат команды и указать номер правила в списке:

iptables -I цепочка номер правило

Например, следующее правило будет первым в цепочке INPUT:

iptables -I INPUT 1 --dport 80 -j ACCEPT

Для блокировки всех входящих соединений с определенного IP:

iptables -A INPUT -s 1.2.3.4 -j DROP

Для блокировки соединений из определенной подсети:

iptables -A INPUT -s 1.2.3.4/24 -j DROP

Вы также можете указать как IP-адрес, так и хост в качестве источника. Например, чтобы запретить все соединения с test.domain.ru:

iptables -A INPUT -s test.domain.ru -j DROP

Чтобы запретить соединения с хостами, отличными от test.domain.ru:

iptables -A INPUT ! -s test.domain.ru -j DROP

Для разрешения доступа к порту 25 (SMTP) для всех:

iptables -A INPUT -m state --state NEW -p tcp --dport 25 -j ACCEPT

Для блокировки порта 25 (SMTP) для всех (просто замените ACCEPT на DROP):

iptables -A INPUT -m state --state NEW -p tcp --dport 25 -j DROP

Чтобы открыть доступ к портам Apache для всех:

iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT 
iptables -A INPUT -m state --state NEW -p tcp --dport 443 -j ACCEPT

Для разрешения доступа к порту 3306 (MySQL) для конкретного IP:

iptables -A INPUT -s 1.2.3.4 -p tcp -m tcp --dport 3306 -j ACCEPT

Чтобы настроить логирование:

iptables -A INPUT -p tcp -m multiport --dports 22,53,8080,139,445 -j LOG --log-level INFO --log-prefix "New connection from 1.2.3.4/24:" 
iptables -A INPUT -s 1.2.3.4/24 -m multiport --dports 22,8080,139,445 -j ACCEPT

При такой настройке каждое новое соединение к серверу из подсети 1.2.3.4/24 будет регистрироваться в журнале.

Для защиты от распространенных атак вы можете добавить следующие настройки:

Для блокировки всех "нераспознанных" пакетов:

iptables -A INPUT -m state --state INVALID -j DROP

Для блокировки нулевых пакетов:

iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP

Для защиты от атаки типа syn-flood:

iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP 
iptables -A OUTPUT -p tcp ! --syn -m state --state NEW -j DROP

Для блокировки фрагментированных пакетов и защиты от ping flood:

iptables -A INPUT -p icmp --fragment -j LOG --log-prefix "ping flooding" 
iptables -A INPUT -p icmp --fragment -j DROP

Для блокировки ping:

iptables -A INPUT -p icmp --icmp-type echo-request -j DROP 
iptables -A INPUT -i eth0 -p icmp --icmp-type echo-request -j DROP

Для разрешения ping с определенных адресов:

iptables -A INPUT -s 1.2.3.4 -p icmp --icmp-type echo-request -j ACCEPT
iptables -A INPUT -s 1.22.33.44 -p icmp --icmp-type echo-request -j ACCEPT

Чтобы установить ограничение на количество одновременных соединений (connlimit) равное 5 для порта 80:

iptables -A INPUT -p tcp -m tcp --dport 80 --tcp-flags FIN,SYN,RST,ACK SYN -m connlimit --connlimit-above 5 --connlimit-mask 32 -j DROP

Сохранение изменений

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

Для CentOS используйте следующую команду:

/sbin/service iptables save

Если вы используете Debian или Ubuntu, рекомендуется установить пакет iptables-persistent для сохранения правил. Вы можете установить его следующей командой:

apt install iptables-persistent

Во время установки вас попросят сохранить текущие правила. Ответьте "Да".

После внесения изменений в правила iptables, сохраните их, выполнив команду:

netfilter-persistent save

Удаление правил

Для удаления конкретного правила используйте опцию -D, например:

iptables -D INPUT -s 1.2.3.4 -j DROP

Для удаления всех правил выполните следующую команду:

iptables -F

Чтобы удалить правила для определенной цепочки, выполните команду:

iptables -F INPUT

Остались вопросы - пишите