Использование утилиты iptables на Linux

В инструкции описана расширенная информация об утилите iptables, приведена ее структура и примеры использования для настройки брандмауэра на виртуальном сервере Linux.

Что это такое?

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

iptables почти всегда предустановлена на любом дистрибутиве Linux. Чтобы обновить или установить, просто загрузите пакет iptables с помощью пакетного менеджера, например apt-get:

Необходимо быть предельно осторожным при настройке правил iptables, особенно если вы используете ssh на сервере, потому что одна неправильная команда может заблокировать подключение по ssh, но на наших виртуальных серверах это можно просто исправить, подключившись к web-консоли.

Основные конфигурационные файлы:

В структуре iptables существует 4 таблицы:

Filter

Filter - это таблица по умолчанию для iptables. Если вы не определяете собственную таблицу, то будет использоваться эта таблица правил. Таблица Filter использует три разные цепочки: INPUT, FORWARD и OUTPUT.

INPUT Цепочка, которая используется для управления входящими соединениями. Например, если пользователь пытается подключиться по ssh к вашему серверу, iptables попытается сопоставить IP-адрес и порт с правилом в цепочке input.
FORWARD Эта цепочка используется для входящих соединений, которые фактически не доставляются локально. Такая ситуация может возникнуть на маршрутизаторе - данные всегда отправляются на него, но редко на самом деле предназначены для самого маршрутизатора, т.е. маршрутизатор просто перенаправляют данные.
OUTPUT Цепочка, предназначенная для обработки исходящих соединений. Например, если пользователь попытается выполнить команду ping до определенного хоста, то iptables проверит output-цепочку, чтобы разрешить или отклонить попытку подключения.

NAT

Таблица NAT имеет следующие встроенные цепочки: PREROUTING, POSTROUTING, OUTPUT.

PREROUTING Изменяет пакеты перед маршрутизацией. Перенаправление предназначено для пакетов поступающих в систему (например в локальную или частную сеть). Цепочка позволяет определить действительный IP-адрес назначения пакетов. Используется для DNAT (NAT назначения). DNAT изменяет целевой адрес пакета.
POSTROUTING Изменяет пакеты после маршрутизации. Перенаправление предназначено для пакетов покидающих систему. Цепочка подменяет исходный адрес пакетов. Это используется для SNAT (источник NAT). SNAT изменяет исходный адрес пакета.
OUTPUT Изменяет пакеты после маршрутизации. Перенаправление предназначено для локальных пакетов. Цепочка изменяет целевой адрес пакетов.

Правила

Правила содержат критерии и цель.

Если критерии сопоставляются, то действия применяются к целевому объекту.

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

Ниже приведены возможные целевые объекты:

ACCEPT Входящий пакет обрабатывается
DROP Входящий пакет отбрасывается, при сканировании порт фильтруется
QUEUE Пакет передается в пользовательское пространство
RETURN Прекращается выполнение набора правил в текущей цепочке для этого пакета, элемент управления возвращается вызывающей цепочке
REJECT Входящий пакет отправляется на адрес источника с информацией, что сервиса не существует
DENY Входящий пакет отбрасывается, ответ не отправляется
NEW Установка нового соединения, первый пакет, который мы видим
RELATED Соединение, связанное с другим, имеющим статус ESTABLISHED
ESTABLISHED Установленное сетевое соединение

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

Вывод:



Здесь:

Примечание: по умолчанию правила попадают в таблицу filter.

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

iptables -t <имя_таблицы> --list

Например:

Чтобы вывести правила с нумерацией используется дополнительный ключ --line-numbers:

iptables -L --line-numbers

Для создания собственной цепочки используйте команду:

Например:

iptables -N MY_CHAIN

Блокировка ip-адресов

Часто возникает задача блокирования ip-адресов. Например, вы заметили, что IP 11.22.121.122 постоянно пытается атаковать ваш сервер, и вы хотите его заблокировать. Нужно просто заблокировать все входящие пакеты с этого IP-адреса. Чтобы это сделать, нужно добавить следующее правило в цепочку INPUT таблицы filter. В примере имя таблицы указано явно, без использования ключа t правило попадает в таблицу по умолчанию:

Здесь:

Также можете блокировать диапазоны IP-адресов, используя CIDR-нотацию. Если необходимо заблокировать все IP-адреса от 11.22.121.0 до 11.22.121.255, это можно сделать с помощью команды:

Если необходимо заблокировать исходящий трафик на конкретный ip, используется цепочка OUTPUT и флаг -d для указания ip-адреса назначения:

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

Теперь, скажем, вы заблокировали IP-адрес 11.22.121.0/24 по ошибке. Чтобы удалить существующее правило используйте команду:

Здесь ключ -D (Drop) означает удаление правила из цепочки.

Также можно удалять правила по номерам строк. Если вы хотите удалить второе правило из цепочки INPUT, команда будет следующей:

Примечание: при удалении правил нумерация изменяется.

Также возможно удалить все правила цепочки - с помощью опции F:

Вставка и замена правил

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

Для замены правила стоящем на определенном месте, необходимо использовать ключ -R. Следующая команда заменит правило стоящее на 1 месте:

Протоколы, модули, интерфейсы

Например, чтобы заблокировать весь входящий TCP-трафик, нужно с помощью ключа -p указать протокол следующим образом:

Более полезный пример - блокировка доступа по ssh для диапазона ip-адресов. Для начала необходимо сопоставить трафик TCP, как в примере выше. Затем нужно проверить предназначен ли трафик для SSH порта, используя --dport. Таким образом, вся команда будет:

Для того, чтобы заблокировать доступ одновременно и к SSH и VNC для диапазона адресов, нужно использовать модуль multiport и ключ --dports. Команда:

Чтобы открыть порт, например 80, для подключения по http, используйте команду:

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

Пример перенаправления портов

Довольно часто возникает необходимость перенаправления портов и ip-адресов в целях безопасности в локальной сети. Например, чтобы перенаправить трафик с порта 80 сервера, который имеет выход в глобальную сеть, на 85 порт локальной машины.

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

Например:

Минимальная конфигурация firewall

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

Примечание: восклицательный знак `!` используется для инверсии правил.

Для начала разрешите все входящие подключения:

Затем необходимо очистить все правила Iptables:

Чтобы не потерять соединение по SSH, откройте 22 порт:

Следующие правила зависят от ваших потребностей:
Разрешить весь трафик c loopback (lo0):

Перенаправить трафик на localhost, который исходит не из lo0.

Разрешить ping:

Разрешить соединения HTTP и HTTPS:

Разрешить входящий трафик из установленных соединений:

Отклонить все остальные входящие пакеты:

Сохранение правил

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

На операционных системах Ubuntu и Debian можно использовать утилиту netfilter-persistent (или iptables-persistent):

Примечание: если у Вас включен uwf, необходимо его отключить:

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

Примечание: если при использовании этой команды на Centos у вас возникает следующая ошибка:



То необходимо отключить firewalld, который введен для управления iptables, установить пакет iptables-services и запустить его:

Последнее обновление: 14.05.2023