Iptables — это межсетевой экран для операционных систем Linux, который позволяет управлять прохождением трафика. При попытке установке соединения с сервером (или при отправке запроса с сервера) Iptables проверяет цепочку правил для конкретного соединения и выполняет заданную настройку.
Iptables предустановлен во всех современных дистрибутивах Linux.
Существует три типа цепочек iptables — input, forward и output.
Цепочка — это упорядоченная последовательность правил. Правило содержит в себе критерий (например, IP-адрес источника пакета) и действие, которое нужно применить к пакету с этим критерием (например, «заблокировать»). Если критерий отсутствует, правило применяется ко всем пакетам.
При определении, что нужно сделать с пакетом, iptables просматривает соответствующую цепочку с начала списка, перебирая правила, пока не найдет совпадение. Если совпадение не найдено (соединение не попадает ни под одно созданное правило), применяется правило по умолчанию.
При настройке правил iptables помните, что для многих портов при передаче данных требуется не только отправить запрос, но и получить на него ответ. Также будьте внимательны, чтобы случайно не запретить доступ для себя — удаленное подключение к серверу по SSH тоже является входящим соединением.
Есть три типа действий, выполняемых с соединениями:
Accept — разрешить соединение.
Drop — игнорировать (блокировать) соединение без сообщения источнику об отказе. Это рекомендуемый вариант для обработки трафика на портах, подключенных к интернету, так как в этом случае злоумышленники получают минимум информации при сканировании портов.
Reject — отказать в соединении, сообщив источнику запроса об отказе. По умолчанию отправляется ответный пакет «icmp-port-unreachable», но также возможна дополнительная настройка сообщения (например, «icmp-host-unreachable», «icmp-net-prohibited», «icmp-host-prohibited» и др.).
В рамках данной статьи общий формат для настройки правил будет следующим:
iptables действие цепочка правило
В нем пропущено указание таблицы (она должна следовать сразу после iptables), так как мы рассматриваем настройки для основной таблицы фильтрации filter, которая подразумевается в командах iptables по умолчанию. Указывать ее дополнительно необязательно.
Действие в данном случае — это действие, которое необходимо выполнить с правилом (например, добавить его или удалить).
Примеры доступных действий в iptables:
Дополнительные опции:
Вывести все правила можно командой:
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
Для того, чтобы созданные правила были применялись в том числе после перезагрузки системы, их нужно сохранить.
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