Настройка брандмауэра 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