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), так как мы рассматриваем настройки для основной таблицы фильтрации filter, которая подразумевается в командах iptables по умолчанию. Указывать ее дополнительно необязательно.
Действие в данном случае — это действие, которое необходимо выполнить с правилом (например, добавить его или удалить).
Примеры доступных действий в iptables:
- -A — добавить правило в цепочку;
- -I — добавить правило в цепочку, указав номер;
- -D — удалить правило;
- -F — удалить все правила;
- -L — вывести все правила в текущей цепочке;
- -P — установить действие по умолчанию.
Дополнительные опции:
- -p — указать протокол пакета;
- -s — указать IP-адрес / источник пакета;
- -j — указать, что нужно сделать с пакетом (разрешить / заблокировать и пр.).
Просмотр существующих правил
Вывести все правила можно командой:
Либо:
Также можно вывести правила для конкретной цепочки, например:
Правила по умолчанию
В случае, если ни одно из созданных правил не подходит для определенного пакета, к нему будет применено правило по умолчанию.
Просмотреть правила по умолчанию можно командой:
Если вы не вносили изменений в policy, то изначально для всех цепочек будут установлены разрешающие правила по умолчанию.
Установить правило по умолчанию можно с помощью опции -P, например:
Примеры настроек
Добавить правило к существующей цепочке можно командой:
Если правило нужно поместить не в конец списка, можно использовать следующий формат команды и указать номер правила в списке:
Например, это правило будет указано первым в цепочке INPUT:
Запретить все входящие соединения с конкретного IP:
Запретить соединения из подсети:
В качестве источника может быть указан как IP-адрес, и хост. Например, так можно запретить все соединения с test.domain.ru:
Запретить все соединения с хостов, отличных от test.domain.ru:
Открыть доступ к порту 25 (SMTP) для всех:
Закрыть для всех (требуется просто заменить ACCEPT на DROP):
Открыть доступ к портам Apache для всех:
Открыть доступ к порту 3306 для конкретного IP:
Настройка логирования:
При такой настройке при каждом новом соединении к серверу из подсети 1.2.3.4/24 в журнал будет добавляться соответствующая запись.
Для защиты от распространенных атак можно добавить такие настройки:
Запретить все «неопознанные» пакеты:
Запретить нулевые пакеты:
Защититься от атак типа syn-flood:
Запретить фрагментированные пакеты для защиты от ping flood:
Запретить ping:
Разрешить ping с определенных адресов:
Установить лимит подключений (connlimit), равный 5, для 80 порта:
Сохранение изменений
Для того, чтобы созданные правила были применялись в том числе после перезагрузки системы, их нужно сохранить.
CentOS:
Для сохранения правил в Debian / Ubuntu можно использовать утилиту iptables-persistent. Установить ее можно командой:
В процессе установки система запросит, необходимо ли сохранить существующие правила — нажмите «Да».
В дальнейшем, если вы внесете изменения в правила iptables, их можно будет сохранить командой:
Удаление правил
Удалить конкретное правило можно с помощью опции -D, например:
Удаление всех правил выполняется командой:
Удаление правил для определенной цепочки: