Iptables — это инструмент межсетевого экрана, который доступен в Linux. Его могут эффективно использовать как опытные пользователи, так и те, кто только начинает осваивать Linux. В данном материале раскрыты основные настройки конфигурации этого мощного файрвола.


Что такое iptables?


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

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

sudo apt-get install iptables

Хотя имеются графические инструменты-конкуренты iptables, такие как Firestarter, работа в командной строке не слишком сложна для понимания. Однако особое внимание стоит уделять настройки через удаленное ssh-соединение. Неправильная команда может перекрыть доступ к серверу, и тогда потребуется физически обратиться к машине для исправления.


Типы правил


В iptables существует три ключевых типа правил: input, forward и output.

Input — обрабатывает входящие соединения. Например, при попытке подключения по SSH, iptables сверит IP-адрес с цепочкой правил, чтобы определить, разрешить или отклонить доступ.

Forward — управляет трафиком, который направлен на другие системы. Это актуально для маршрутизаторов, которые передают данные на конечного адресата. Эти правила не понадобятся, если вы не настроили маршрутизацию или NAT.

Output — отвечает за исходящую передачу данных. Например, при отправке ping на сайт 1cloud.ru, iptables проанализирует правила на наличие разрешения для ping, чтобы потом либо разрешить, либо заблокировать соединение.

Изучите данный аспект: Для успешного выполнения ping или использования других протоколов требуется двусторонняя коммуникация. Ошибки в настройке ssh-соединений — частая проблема новичков, забывающих создать правило для обработки ответных пакетов.


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


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

Текущие настройки политики iptables можно увидеть с помощью команды:

iptables –L

Настройки iptables по умолчанию

Мы также использовали grep для более четкой фильтрации результата. Как видно на изображении, все цепочки по умолчанию позволяют принимать трафик, что обычно предпочтительнее, если настройки не изменялись. Чтобы вернуть исходные настройки после внесения изменений, используйте:

iptables --policy INPUT ACCEPT

iptables --policy OUTPUT ACCEPT

iptables –-policy FORWARD ACCEPT

Начав с разрешения всего трафика, можно затем блокировать определенные IP-адреса и порты. Однако, иногда бывает полезнее сделать наоборот: изначально заблокировать все и выбрать, что разрешить.

iptables --policy INPUT DROP

iptables --policy OUTPUT DROP

iptables –-policy FORWARD DROP


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


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

  • Accept — разрешает соединение;
  • Drop — невидимо блокирует запросы, источник запроса не получает информацию о блокировке;
  • Reject — отклоняет соединение с уведомлением об ошибке. Полезно, если требуется дать понять, что соединение заблокировано целенаправленно.

Ответ на ping демонстрирует каждое из этих действий следующим образом:

  • Соединение разрешено:

    Соединение разрешено

  • Соединение проигнорировано:

    Соединение проигнорировано

  • Соединение отклонено:

    Соединение отклонено


Разрешаем и блокируем конкретные соединения


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

Командой iptables -A можно добавлять правила в уже существующие цепочки. Iptables будет проверять правила последовательно с начала списка до тех пор, пока не найдет подходящее. Командой iptables -I [цепочка] [номер] можно добавить новое правило в определенное место списка.


Соединения с одного IP-адреса


Для блокировки всех соединений с IP-адреса 10.10.10.10, используйте следующее правило:

iptables -A INPUT -s 10.10.10.10 -j DROP

Чтобы заблокировать соединения из IP-диапазона 10.10.10.0/24, также можно использовать записи подсети через слэш или в полном виде:

iptables -A INPUT -s 10.10.10.0/24 -j DROP

или

iptables -A INPUT -s 10.10.10.0/255.255.255.0 -j DROP


Соединения на конкретный порт


Чтобы заблокировать SSH-соединения от хоста с адресом 10.10.10.10, воспользуйтесь следующим правилом:

iptables -A INPUT -p tcp --dport ssh -s 10.10.10.10 -j DROP

Вместо "SSH" можно указывать другие протоколы или номера портов. Флаг -p tcp указывает на использование TCP-протокола. Если соединение использует UDP, то над следует использовать -p udp.

Чтобы заблокировать SSH-соединения от любых IP-адресов, используйте:

iptables -A INPUT -p tcp --dport ssh -j DROP


Состояния соединений


Как уже упоминалось, многие протоколы требуют двухсторонней связи. К примеру, для разрешения SSH-соединений щначения по SSH, понадобятся правила в input- и output-цепочках. Если вы хотите запретить только исходящие соединения, используйте состояния соединений. Они позволяют учитывать активные сеансы. В примере ниже разрешены входящие SSH-соединения от 10.10.10.10, но запреты к этому адресу также стоят. Однако, система может инициировать SSH-сеанс, если он начат изнутри:

iptables -A INPUT -p tcp --dport ssh -s 10.10.10.10 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A OUTPUT -p tcp --sport 22 -d 10.10.10.10 -m state --state ESTABLISHED -j ACCEPT


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


Сделанные изменения в правилах будут утрачены после перезапуска iptables, поэтому их необходимо сохранить через специальную команду. В зависимости от вашего Linux-дистрибутива соответствующая команда может отличаться.

В системах на Ubuntu:

=sudo /sbin/iptables-save

В Red Hat / CentOS:

=/sbin/service iptables save

Или

=/etc/init.d/iptables save


Другие команды


Чтобы вывести текущее состояние правил iptables, используйте:

iptables -L

Параметры -v добавят детализацию по пакетам и байтам, а -n выведет цифровые значения для хост-имён, протоколов и сетей.

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

iptables -F

Вопросы для самопроверки:

  1. Какие три ключевых типа правил существуют в iptables и за что они отвечают?
  2. Каково поведение iptables по умолчанию, если подходящее правило не найдено?
  3. Как заблокировать SSH-соединения на конкретный порт с помощью iptables?
  4. Какие команды используются для сохранения изменений в правилах iptables в Ubuntu и CentOS?
  5. Как просмотреть текущее состояние правил iptables и какие параметры могут предоставить дополнительную детализацию?