Page tree

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

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

Типы цепочек

Существует три типа цепочек iptables — input, forward и output.

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

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

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

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

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

Есть три типа действий, выполняемых с соединениями:

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

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

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

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

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

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

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

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

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

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

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

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

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

Вывести все правила можно командой:

iptables -L

Либо:

iptables -L -n -v

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

 iptables -L INPUT

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

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

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

iptables -L | grep policy

Если вы не вносили изменений в 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

Закрыть для всех (требуется просто заменить 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 для конкретного 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

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

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

Debian / Ubuntu:

/sbin/iptables-save

CentOS:

/sbin/service iptables save

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

Удалить конкретное правило можно с помощью опции -D, например:

iptables -D INPUT -s 1.2.3.4 -j DROP

Удаление всех правил выполняется командой:

 iptables -F

Удаление правил для определенной цепочки:

iptables -F INPUT
  • No labels