Использование утилиты iptables на Linux. Всё очень просто, в очередной раз объясняя на форуме новичкам в мире Linux, что да как я понял, что на просторах интернет не найти собранную воедино статью с объяснением не только настройки iptables, но и некоторых сетевых основ.
Так что вашему вниманию я представляю небольшой экскурс по настройке firewall в Linux. Углубимся лишь в настройку netfilter/iptables, остальных прикладных вопросов мы несомненно тоже коснёмся, ведь нам не хватает именно комплексных ответов на наши вопросы… И я постараюсь ка можно более доходчиво здесь все изложить.

Оглавление

Виды пакетов

Все пакеты делятся на три типа: входящие, исходящие и проходящие. Входящие — это те, которые были отправлены на этот компьютер, исходящие — отправленные из этого компьютера в сеть. А проходящие — это пакеты, которые просто должны быть пересланы дальше, например, если ваш компьютер выступает в качестве маршрутизатора.

Соответственно в фильтре iptables все пакеты делятся на три аналогичные цепочки:

  • Input — обрабатывает входящие пакеты и подключения. Например, если какой-либо внешний пользователь пытается подключиться к вашему компьютеру по ssh или любой веб-сайт отправит вам свой контент по запросу браузера. Все эти пакеты попадут в эту цепочку;
  • forward — эта цепочка применяется для проходящих соединений. Сюда попадают пакеты, которые отправлены на ваш компьютер, но не предназначены ему, они просто пересылаются по сети к своей цели. Как я уже говорил, такое наблюдается на маршрутизаторах или, например, если ваш компьютер раздает wifi;
  • output — эта цепочка используется для исходящих пакетов и соединений. Сюда попадают пакеты, которые были созданы при попытке выполнить ping losst.ru или когда вы запускаете браузер и пытаетесь открыть любой сайт.

Но если вы думаете что можно просто полностью закрыть цепочку Input для увеличения безопасности, то вы очень сильно ошибаетесь. При работе сети используются обе цепочки input и output. Например, вы пытаетесь выполнить ping, данные отправляются через output, но ответ приходит через input. То же самое происходит при просмотре сайтов и других действиях. А вот цепочка forward может вообще не использоваться если ваш компьютер не является маршрутизатором. Так что настройка iptables должна выполняться очень аккуратно.

Правила и действия

Перед тем как перейти к созданию списка правил iptables нужно рассмотреть как они работают и какие бывают. Для каждого типа пакетов можно установить набор правил, которые по очереди будут проверяться на соответствие с пакетом и если пакет соответствует, то применять к нему указанное в правиле действие. Правила образуют цепочку, поэтому input, output и forward называют цепочками, цепочками правил. Действий может быть несколько:

  • ACCEPT — разрешить прохождение пакета дальше по цепочке правил;
  • DROP — удалить пакет;
  • REJECT — отклонить пакет, отправителю будет отправлено сообщение, что пакет был отклонен;
  • LOG — сделать запись о пакете в лог файл;
  • QUEUE — отправить пакет пользовательскому приложению.

Правила могут проверять любые соответствия, например, по ip, по порту получателя или отправителя, заголовкам пакета и многому другому. Если пакет не подходит ни одному из правил, то к нему применяется действие по умолчанию, обычно ACCEPT.

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

  • prerouting — в эту цепочку пакет попадает перед обработкой iptables, система еще не знает куда он будет отправлен, в input, output или forward;
  • postrouting — сюда попадают все проходящие пакеты, которые уже прошли цепочку forward.

Но это еще не все. У нас еще есть таблицы iptables, с которыми тоже желательно разобраться.

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 Изменяет пакеты после маршрутизации. Перенаправление предназначено для локальных пакетов. Цепочка изменяет целевой адрес пакетов.

Основы Iptables

Все данные передаются по сети в виде пакетов. Ядро Linux предоставляет интерфейс для фильтрации пакетов входящего и исходящего трафика при помощи специальных таблиц. Iptables — это приложение командной строки и межсетевой экран для Linux, которым можно пользоваться для создания, поддержания работоспособности и проверки этих таблиц.

Можно создать несколько таблиц. В каждой таблице может содержаться несколько цепочек. Цепочка — это набор правил. Каждое правило определяет, что делать с пакетом, если он соответствует условиям. При соответствии пакета над ним выполняется целевое действие (TARGET). Это может быть проверка следующей цепочкой или один из следующих вариантов:

  • ACCEPT: разрешить передачу пакета.
  • DROP: запретить передачу пакета.
  • RETURN: пропустить текущую цепочку и перейти к следующему правилу в цепочке, которая ее вызвала.

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

  • INPUT – используется для контроля входящих пакетов. Можно разрешать или блокировать  подключения по порту, протоколу или IP-адресу источника.
  • FORWARD – используется для фильтрации пакетов, приходящих на сервер, но перенаправляемых куда-либо еще.
  • OUTPUT – используется для фильтрации исходящих пакетов.

Установка iptables

Для начала убедимся, что утилита iptables установлена. Для этого введем команду iptables -h и если вывод будет command not found, значит утилиту требуется установить.

iptables -h bash: iptables: command not foundDebian 9: проверка наличия iptabes
Debian 9: проверка наличия iptabes

Установка iptables очень простая, для этого достаточно ввести:

apt install iptables

Вместо apt может быть ваш вариант, который зависит от вашего дистрибутива и что там стоит по-умолчанию. Дожидаемся конца установки.

Debian 9: установка iptables завершена
Debian 9: установка iptables завершена

Таблицы ipatables

Над цепочками правил в iptables есть еще один уровень абстракции, и это таблицы. В системе есть несколько таблиц, и все они имеют стандартный набор цепочек input, forward и output. Таблицы предназначены для выполнения разных действий над пакетами, например для модификации или фильтрации. Сейчас это для вас не так важно и будет достаточно знать что фильтрация пакетов iptables осуществляется в таблице filter. Но мы рассмотрим их все:

  • raw — предназначена для работы с сырыми пакетами, пока они еще не прошли обработку;
  • mangle — предназначена для модификации пакетов;
  • nat — обеспечивает работу nat, если вы хотите использовать компьютер в качестве маршрутизатора;
  • filter — основная таблица для фильтрации пакетов, используется по умолчанию.

С теорией почти все, теперь давайте рассмотрим утилиту командной строки iptables, с помощью которой и выполняется управление системой iptables.

Утилита Iptables

Подсистема iptables и netfilter встроены в ядро, но вот набор утилит для управления всем этим не всегда поставляется вместе с системой. Для установки утилиты в Ubuntu наберите:

sudo apt install iptables

А в дистрибутивах, основанных на Fedora, установка iptables выполняется немного по-другому:

sudo yum install iptables

Когда установка iptables будет завершена, можно переходить к настройке, но давайте сначала рассмотрим синтаксис утилиты. Обычно команда имеет такой общий вид:

$ iptables-t таблица действие цепочкадополнительные_параметры

Теперь давайте рассмотрим параметры iptables, таблица указывает таблицу, с которой нужно работать, этот параметр можно упустить, действие — нужное действие, например, создать или удалить правило, а дополнительные параметры описывают действие и правило, которое нужно выполнить.

Осталось рассмотреть основные действия, которые позволяет выполнить iptables:

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

Дополнительные опции для правил:

  • -p — указать протокол, один из tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp,<br>mh;
  • -s — указать ip адрес устройства-отправителя пакета;
  • -d — указать ip адрес получателя;
  • -i — входной сетевой интерфейс;
  • -o — исходящий сетевой интерфейс;
  • -j — выбрать действие, если правило подошло.

Теперь вы можем перейти рассмотрению примеров того как выполняется настройка iptables.

Настройка iptables на Linux для чайников

Кстати, ранее мы уже говорили о том, какой файловый менеджер является лучшим для Linux . Возможно это также вам будет интересно. Ссылку можно найти выше.

Настройка iptables на Linux как мы уже сказали выше, довольно простая. Но прежде чем начать, настройку, нужно ознакомиться с общими понятиями опции.

Типы цепей

В Iptables используются три разные цепи: ввод, пересылка и вывод.

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

Forward — эта цепочка используется для входящих соединений, которые фактически не доставляются локально. Думайте о роутере — данные всегда отправляются на него, но редко на самом деле предназначены для самого маршрутизатора; Данные просто перенаправляются на целевую страницу. Если вы не выполняете какую-либо маршрутизацию, NAT или что-то еще в вашей системе, которая требует пересылки, вы даже не будете использовать эту цепочку.

Существует один надежный способ проверить, использует ли ваша система или нуждается в цепочке прямой передачи.

iptables -L -v

Этот снимок экрана относится к серверу, который работает в течение нескольких недель и не имеет ограничений на входящие или исходящие подключения. Как вы можете видеть, цепочка ввода обработала 11 ГБ пакетов, а выходная цепочка обработала 17 ГБ. С другой стороны, прямой цепочке не нужно обрабатывать один пакет. Это связано с тем, что сервер не выполняет никаких пересылок или не используется в качестве сквозного устройства.

Вывод — эта цепочка используется для исходящих соединений. Например, если вы попытаетесь выполнить ping на сайте linuxinsider, iptables проверит свою цепочку вывода, чтобы узнать, какие правила касаются ping и linuxinsider, прежде чем принимать решение разрешить или запретить попытку подключения.

Предостережение

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

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

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

Чтобы узнать, какие цепочки политик настроены для работы с непревзойденным трафиком, запустите команду iptables -L.

Как вы можете видеть, мы также использовали команду grep для получения более чистого результата. На этом скриншоте наши цепочки в настоящее время рассчитаны на прием трафика.

Больше времени, чем нет, вы хотите, чтобы ваша система принимала соединения по умолчанию. Если вы ранее не изменили правила цепочки политик, этот параметр должен быть уже настроен. В любом случае, вот команда принять соединения по умолчанию:

iptables —policy INPUT ACCEPT
iptables —policy OUTPUT ACCEPT
iptables —policy FORWARD ACCEPT

По умолчанию в правиле принятия, вы можете использовать iptables для отказа от определенных IP-адресов или номеров портов, продолжая принимать все остальные соединения. Мы дойдем до этих команд через минуту.

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

iptables —policy INPUT DROP
iptables —policy OUTPUT DROP
iptables —policy FORWARD DROP

Ответы на подключение

При настройке политик цепочки по умолчанию вы можете приступить к добавлению правил в iptables, чтобы знать, что делать, когда он встречает соединение с определенным IP-адресом или портом. В этом руководстве мы рассмотрим три наиболее распространенных и часто используемых «ответа».

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

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

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

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

Разрешение подключения:

Удаление соединения:

Отклонение соединения:

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

Примеры настройки Iptables

Мы рассмотрим несколько основных примеров, чтобы вы смогли закрепить все прочитанное выше.

Список правил

Сначала давайте рассмотрим как выполняется просмотр правил iptables, для этого достаточно опции -L:

iptables -L

iptables

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

iptables -L INPUT

Очистка правил

Вы не можете просто так отключить iptables остановив сервис обновления правил iptables через systemd или даже удалив набор утилит для настройки. Подсистема работает на уровне ядра и не зависит от того, что там у вас установлено. Поэтому если сделаете что-то не так, то нужно будет очистить правила. Для этого выполните:

sudo iptables -F

Или только для определенной цепочки:

sudo iptables -F Input

Напоминаю, что все эти действия выполняются для таблицы по умолчанию — filter.

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

Как я уже говорил, если для пакета не подходит ни одно правило, то для него применяется действие по умолчанию. Его можно задать с помощью опции -p:

sudo iptables -p INPUT ACCEPT
$ sudo iptables -p OUTPUT ACCEPT
$ sudo iptables -p FORWARD DROP

В этом примере мы разрешаем цепочки INPUT и OUTPUT, но запрещаем FORWARD.

sudo iptables -L

iptables1

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

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

iptables -t filter -A INPUT -s 11.22.121.122 -j REJECT

Здесь:

  • t — указывает, в какую таблицу будет входить правило;
  • A — указывает на добавление (Append) правила в цепочку INPUT;
  • s — указывает источник;
  • j — указывает iptables на отклонение трафика с помощью цели REJECT.

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

iptables -A INPUT -s 11.22.121.0/24 -j REJECT

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

iptables -A OUTPUT -d 31.13.78.35 -j DROP

Проброс портов

Если в вашей внутренней сети есть сервер, который должен быть доступен извне, можно воспользоваться целевым действием -j DNAT цепочки PREROUTING в таблице NAT и указать IP-адрес и порт места назначения, на которые будут перенаправляться входящие пакеты, запрашивающие соединение с вашей внутренней службой. Например, если нужно перенаправлять входящие HTTP-запросы по порту 80 на выделенный HTTP-сервер Apache по адресу 172.31.0.23, выполните команду:

sudo iptables -t nat -A PREROUTING -i eth0 -p tcp —dport 80 -j DNAT —to 172.31.0.23:80

Данное правило определяет использование встроенной цепочки PREROUTING в таблице NAT для перенаправления входящих HTTP-запросов на порт 80 указанного IP-адреса 172.31.0.23. Такой способ трансляции сетевых адресов называется перенаправлением или пробросом портов.

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

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

iptables -I INPUT 1 -s 11.22.121.10 -j ACCEPT

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

iptables -R INPUT 1 -s 11.22.121.11 -j ACCEPT

Как сохранить правила iptables

Одной из особенностей утилиты iptables является то, что прописанные правила полностью сбрасываются после перезагрузки системы. Самый простым способом сохранить настройки iptables будет поставить утилиту iptables-persistent. В debian и ubuntu это делается так, если вы по прежнему авторизованы под root:

apt install iptables-persistent

Во время установки будет вопрос, сохранить ли текущие настройки iptables, пока выберем не сохранять, то есть No, потому что для начала нужно сохранить их в отдельный текстовый файл. В противном случае iptables-persistent ничего не сохранит.

После установки сохраним текущие настройки iptables в отдельный файл, который будет располагаться в папке утилиты:

iptables-save > /etc/iptables/rules.v4

А затем перезапустим службу iptables-persistent

service iptables-persistent restart

Если вы получили сообщение, что данная служба не найдена…

Failed to restart iptables-persistent.service: Unit iptables-persistent.service not found.Debian 9: неудачный перезапуска службы iptables-persistent
Debian 9: неудачный перезапуска службы iptables-persistent

То попробуйте перезапустить службу с другим названием:

service netfilter-persistent restart

В debian и ubuntu должен работать второй вариант.

Все, теперь можно смело перезагружать компьютер или сервер, все настройки iptables при это сохранятся.

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

Если нужно удалить все правила и прописать все заново с чистого листа, можно воспользоваться командой очистки (flush):

sudo iptables -F

Она удаляет все существующие правила. Если вам нужно удалить конкретное правило, воспользуйтесь опцией -D. Сначала при помощи опции —line-numbers выведите пронумерованный список всех правил:

sudo iptables -L —line-numbers


Для удаления правила нужно указать цепочку и номер в списке. В нашем случае это цепочка INPUT и номер 3.

sudo iptables -D INPUT 3

результат

Восстановление настроек

Если вы еще не сохраняли настройки, и хотите вернуться к первоначальным настройкам. Используйте iptables-restore.

В Ubuntu/Debian

sudo iptables-restore < /etc/iptables.rules

В Centos/Redhat

iptables-restore < /etc/sysconfig/iptables

Основные настройки iptables для веб-сервера

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

iptables -F

Затем выставим настройки по-умолчанию, запретив все входящие соединения. А потом будем уже настраивать исключения из этих правил.

# Запретим все входящие соединения iptables -P INPUT DROP # Разрешим все исходящие соединения iptables -P OUTPUT ACCEPT

Теперь разрешим внутренние соединения с 127.0.0.1 (localhost), а также установленные соединения для приложений и пинга.

# Разрешить входящие соединения с localhost iptables -A INPUT -i lo -j ACCEPT # Разрешить входящие соединения, которые уже были установлены iptables -A INPUT -m state —state ESTABLISHED,RELATED -j ACCEPT

Добавим несколько дополнительных фильтров:

# Блокировать все нулевые пакеты iptables -A INPUT -p tcp —tcp-flags ALL NONE -j DROP # Блокировать все пакеты XMAS iptables -A INPUT -p tcp —tcp-flags ALL ALL -j DROP # Защищаемся от syn-flood iptables -A INPUT -p tcp ! —syn -m state —state NEW -j DROP

Далее откроем порт 22, чтобы была возможность подключаться к серверу по SSH:

iptables -A INPUT -p TCP —dport 22 -j ACCEPT

Открываем порты для базовых сервисов веб-сервера:

# Открываем порт 80 для http iptables -A INPUT -p tcp -m tcp —dport 80 -j ACCEPT # Открываем порт 443 для https iptables -A INPUT -p tcp -m tcp —dport 443 -j ACCEPT

Если дополнительно планируется настраивать на сервере почту, то следует открыть порты и для этих служб:

# Открываем порты 25 и 465 для smtp-трафика iptables -A INPUT -p tcp -m tcp —dport 25 -j ACCEPT iptables -A INPUT -p tcp -m tcp —dport 465 -j ACCEPT # Открываем порты 110 и 995 для pop-трафика iptables -A INPUT -p tcp -m tcp —dport 110 -j ACCEPT iptables -A INPUT -p tcp -m tcp —dport 995 -j ACCEPT # Открываем порты 143 и 993 для imap-трафика iptables -A INPUT -p tcp -m tcp —dport 143 -j ACCEPT iptables -A INPUT -p tcp -m tcp —dport 993 -j ACCEPT

Затем проверим все настройки командой iptables -L

Debian 9: Базовые правила iptables для веб-сервера
Debian 9: Базовые правила iptables для веб-сервера

И наконец стоит сохранить наши правила, чтобы они не испарились после перезагрузки сервера. Как это сделать, уже рассказано в разделе выше.

Как открыть порт в iptables

Чтобы разрешить подключаться к нашей ОС по SSH, нам потребуется разрешить подключение через порт 22, прописав правило в iptables:

iptables -A INPUT -p TCP —dport 22 -j ACCEPT

Далее проверим все наши правила с помощью команды iptables -L

Debian 9: просмотр списка правил iptables
Debian 9: просмотр списка правил iptables

Как мы видим, появилось новое правило для ssh по стандартному порту 22. Теперь он открыт и можно подключаться, так как теперь блокируются все входящие соединения, кроме соединений по этому порту. О том, как подключаться к серверу по SSH.

Как заблокировать IP адрес в iptables

После того, как мы настроили исключение для входящих соединений для 22 порта, возможно потребуется ограничить подключение с конкретного IP. Допустим адрес с которого мы хотим ограничить любые подключения — 192.168.122.122, для этого введем команду:

iptables -I INPUT -s 192.168.122.122 -j DROP

Вместо используемого адреса в примере может быть любой, как внутренний, так и внешний. Проверим правила с помощью iptables -L

Debian 9: просмотр списка правил iptables
Debian 9: просмотр списка правил iptables

Примеры часто используемых команд iptables

Общие команды

Просмотр правил с их номерами:

iptables -L —line-numbers

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

iptables -t nat -L —line-numbers

Удалить все правила:

iptables -F

Установить правила по умолчанию:

iptables -P INPUT DROP

iptables -P OUTPUT DROP

* в данных примерах по умолчанию для всех входящих (INPUT) и исходящих (OUTPUT) пакетов будет работать запрещающее правило (DROP).

Разрешить все

Способ 1. С помощью добавления правила:

iptables -I INPUT 1 -j ACCEPT

iptables -I OUTPUT 1 -j ACCEPT

iptables -I FORWARD 1 -j ACCEPT

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

Способ 2. Чисткой правил:

iptables -F

iptables -S

* здесь мы сначала удаляем все правила (-F), затем устанавливаем политику по умолчанию — разрешать входящие, исходящие и транзитные (-S).

Способ 3. Отключение сервиса (удобно для диагностики проблем на время отключить firewall):

service iptables stop

iptables stop

Работа с правилами

1. Добавить правило в конец списка:

iptables -A INPUT -p tcp —dport 25 -j ACCEPT

iptables -A INPUT -p tcp -s ! 192.168.0.25 —dport 993 -i eth0 -j ACCEPT

2. Добавить диапазон портов:

iptables -A INPUT -p tcp —dport 3000:4000 -j ACCEPT

* в данном случае, от 3000 до 4000.

3. Вставить правило:

iptables -I FORWARD 15 -p udp -d 8.8.8.8 —dport 53 -i eth1 -j ACCEPT

4. Заблокировать определенный IP-адрес для подключения по 25 порту:

iptables -I INPUT 1 -s 1.1.1.1 -p tcp —dport 25 -j DROP

5. Разрешить несколько портов:

iptables -A INPUT -p tcp —match multiport —dports 20,21,25,80,8080,3000:4000 -j ACCEPT

Проброс портов (port forwarding)

Рассмотрим пример проброса одного порта и диапазона портов.

Один порт (одинаковые порты)

Существует два способа настройки.

1. Правила PREROUTING + POSTROUTING:

iptables -t nat -A PREROUTING -p tcp -m tcp -d 19.8.232.80 —dport 22 -j DNAT —to-destination 192.168.1.15:22

iptables -t nat -A POSTROUTING -p tcp -m tcp -s 192.168.1.15 —sport 22 -j SNAT —to-source 19.8.232.80:22

* где 19.8.232.80 — адрес, на котором слушаем запросы на подключение; 22 — порт для проброса; 192.168.1.15 — внутренний IP-адрес, на который переводим все запросы.

2. Правила PREROUTING + FORWARD:

iptables -t nat -A PREROUTING -p tcp -i eth1 —dport 22 -j DNAT —to-destination 192.168.1.15:22

iptables -A FORWARD -p tcp -d 192.168.1.15 —dport 22 -m state —state NEW,ESTABLISHED,RELATED -j ACCEPT

* где eth1 — сетевой интерфейс, на котором слушаем запросы; 22 — порт для проброса; 192.168.1.15 — внутренний IP-адрес, на который переводим все запросы.

Один порт (разные порты)

Рассмотрим ситуацию, когда мы слушаем один порт, а пробрасываем на другой.

iptables -t nat -A PREROUTING -p tcp -i eth1 —dport 8022 -j DNAT —to-destination 192.168.1.15:22

iptables -A FORWARD -p tcp -d 192.168.1.15 —dport 22 -m state —state NEW,ESTABLISHED,RELATED -j ACCEPT

* где eth1 — сетевой интерфейс, на котором слушаем запросы; 8022 — порт для проброса, на котором будем слушать запросы; 22 — порт для проброса на внутренний адрес; 192.168.1.15 — внутренний IP-адрес, на который переводим все запросы.

Диапазон портов

При необходимости пробросить диапазон портов, используем команды:

iptables -t nat -I PREROUTING -p tcp -m tcp —dport 1000:5000 -j DNAT —to-destination 192.168.1.15:1000-5000

iptables -A FORWARD -d 192.168.1.15 -i eth1 -p tcp -m tcp —dport 1000:5000 -j ACCEPT

* где eth1 — сетевой интерфейс, на котором слушаем запросы; 1000:5000 — порты для проброса (от 1000 до 5000); 192.168.1.15 — внутренний IP-адрес, на который переводим все запросы.

Стартовая настройка

Разрешаем SSH:

iptables -A INPUT -p tcp —dport 22 -j ACCEPT

Создаем правила для нормальной работы apt-get или yum:

iptables -A INPUT -m state —state ESTABLISHED,RELATED -j ACCEPT

Разрешаем ICMP (для выполнения команды ping):

iptables -A INPUT -p icmp -j ACCEPT

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

iptables -A INPUT -i lo -j ACCEPT

Ставим политику запрета на входящие и разрешаем все исходящие:

iptables -P INPUT DROP

iptables -P OUTPUT ACCEPT

Ubuntu и CentOS

В современных операционных системах Ubuntu и CentOS по умолчанию нет iptables. Необходимо его установить или пользоваться более новыми утилитами.

В CentOS

В качестве штатной программы управления брандмауэром используется firewall-cmd. Подробнее читайте инструкцию Как настроить firewalld в CentOS.

Если необходимо пользоваться iptables, устанавливаем пакет с утилитой:

yum install iptables-services

Отключаем firewalld:

systemctl stop firewalld

systemctl disable firewalld

Разрешаем и запускаем iptables:

systemctl enable iptables

systemctl start iptables

Установка iptables

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

# systemctl restart iptables.service Failed to issue method call: Unit iptables.service failed to load: No such file or directory.

Или добавить в автозапуск не получится:

# systemctl enable iptables.service Failed to issue method call: No such file or directory

Чтобы подобных ошибок не было, установим необходимый пакет с утилитами:

# yum -y install iptables-services

Теперь можно добавить iptables в автозагрузку и запустить:

# systemctl enable iptables.service # systemctl start iptables.service

Синтаксис и правила iptables в CentOS/Red Hat

Iptables – это утилита, с помощью которой настраиваются правила для файрвола в Linux.

Iptables группирует правила файрвола в таблицах, основные это:

  • Таблица filter – используется для фильтрации трафика, то есть разрешения и запрещения соединений
  • Таблица nat – используется для преобразования адресов (NAT)
  • Таблица mangle – прочие модификации заголовков ip пакетов.

Для начала проверим, что iptables установлен в системе(должен быть умолчанию):

rpm -q iptables

rpm -q iptables - версия iptables в centos

Вывод команды показывает, что текущая установленная версия iptables – 1.4.21.

Работа с iptables в командной строке требует root привилегий, поэтому далее будем работать под пользователем root.

Чтобы вывести текущие правила, выполним команду:

iptables [-t таблица] -L [цепочка] [параметры]

Примечание: если не указать название таблицы при вызове команды, по умолчанию используется таблица filter.

Например, результат команды iptables -L, когда в таблицах еще не создано правил:

iptables -L - таблицы правил файервола в centos redhat

Рассмотрим вывод команды подробнее.

Таблица filter содержит три типа правил, так называемые chain(цепочки):

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

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

  • ACCEPT – по умолчанию все соединения разрешены, правилами блокируются нежелательные соединения;
  • DROP – по умолчанию все соединения запрещены, правилами разрешаются нужные соединения.

Управление фаерволом iptables

Для управления им (включение/отключение, перезагрузка, добавление в автозагрузку и др.), нужно установить пакет:

yum -y install iptables-services

Теперь можно включить и добавить в автозагрузку:

systemctl start iptables.service systemctl enable iptables.service

Открытие портов

Теперь немного расширим нашу конфигурацию и откроем в iptables порты для некоторых сервисов. Допустим, у нас работает веб-сервер и необходимо открыть к нему доступ из интернета. Добавляем правила для веб-трафика:

Было добавлено разрешение на входящие соединения по 80-му и 443-му портам, которые использует web сервер в своей работе.

Если у вас установлен почтовый сервер, то нужно разрешить на него входящие соединения по всем используемым портам:

Для корректной работы DNS сервера, нужно открыть UDP порт 53

И так далее. По аналогии можете открыть доступ для всех необходимых сервисов.

Проброс (forward) порта

Рассмотрим ситуацию, когда необходимо выполнить проброс портов с внешнего интерфейса на какой-то компьютер в локальной сети. Допустим, вам необходимо получить rdp доступ к компьютеру 10.1.3.50 из интернета. Делаем проброс TCP порта 3389:

Если вы не хотите светить снаружи известным портом, то можно сделать перенаправление с нестандартного порта на порт rdp конечного компьютера:

Если вы пробрасываете порт снаружи внутрь локальной сети, то обязательно закомментируйте правило, которое блокирует доступ из внешней сети во внутреннюю. В моем примере это правило:
$IPT -A FORWARD -i $WAN -o $LAN1 -j REJECT

Либо перед этим правилом создайте разрешающее правило для доступа снаружи к внутреннему сервису, например вот так:

$IPT -A FORWARD -i $WAN -d 10.1.3.50 -p tcp -m tcp —dport 3389 -j ACCEPT

Включение логов

Во время настройки полезно включить логи, чтобы мониторить заблокированные пакеты и выяснять, почему отсутствует доступ к необходимым сервисам, которые мы вроде бы уже открыли. Я отправляю все заблокированные пакеты в отдельные цепочки (block_in, block_out, block_fw), соответствующие направлению трафика и маркирую в логах каждое направление. Так удобнее делать разбор полетов. Добавляем следующие правила в самый конец скрипта, перед сохранением настроек:

Все заблокированные пакеты вы сможете отследить в файле /var/log/messages.

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

Прием и сбрасывание трафика в цепях

Каждая цепь настраивается отдельно для приема или блокирования трафика. Выставив определенное значение, можно добиться того, что, например, весь входящий трафик будет блокироваться. Для этого команда должна быть sudo iptables —policy INPUT DROP, где INPUT — название цепи, а DROP — значение сброса.

Сброс входящих запросов в утилите iptables в CentOS 7

Точно такие же параметры задаются и для других цепей, например, sudo iptables —policy OUTPUT DROP. Если же необходимо выставить значение на прием трафика, тогда DROP изменяется на ACCEPT и получается sudo iptables —policy INPUT ACCEPT.

Разрешение и блокировка портов

Как известно, все сетевые приложения и процессы работают через определенный порт. Путем блокировки или разрешения определенных адресов можно контролировать доступ всех сетевых целей. Давайте разберем проброс порта на примере 80. В «Терминале» будет достаточно ввести команду sudo iptables -A INPUT -p tcp —dport 80 -j ACCEPT, где -А — добавление нового правила, INPUT — указание цепи, -P — определение протокола, в этом случае TCP, а —dport — порт назначения.

Правило для открытия порта 80 в утилите iptables в CentOS 7

Точно такая же команда относится и к порту 22, который используется сервисом SSH: sudo iptables -A INPUT -p tcp —dport 22 -j ACCEPT.

Правило для открытия порта 22 в утилите iptables в CentOS 7

Для блокирования указанного порта применяется строка точно такого же вида, только в конце ACCEPT изменяется на DROP. В итоге получается, например, sudo iptables -A INPUT -p tcp —dport 2450 -j DROP.

Правило для запрета порта в утилите iptables в CentOS 7

Все эти правила заносятся в конфигурационный файл и вы можете просмотреть их в любой момент. Напоминаем, осуществляется это через sudo iptables -L. Если вместе с портом необходимо разрешить еще и сетевой IP-адрес, строка немного видоизменяется — после TPC добавляется -s и сам адрес. sudo iptables -A INPUT -p tcp -s 12.12.12.12/32 —dport 22 -j ACCEPT, где 12.12.12.12/32 — необходимый IP-адрес.

Правило для принятия IP-адреса и порта в iptables в CentOS 7

Блокирование происходит по тому же принципу, меняя в конце значение ACCEPT на DROP. Тогда получается, например, sudo iptables -A INPUT -p tcp -s 12.12.12.0/24 —dport 22 -j DROP.

Правило для блокировки IP-адреса и порта в iptables в CentOS 7

Блокирование ICMP

ICMP (Internet Control Message Protocol) — протокол, который входит в состав TCP/IP и задействован для передачи сообщений об ошибках и экстренных ситуациях при работе с трафиком. Например, когда запрашиваемый сервер недоступен, именно этот инструмент выполняет сервисные функции. Утилита iptables позволяет заблокировать его через брандмауэр, а сделать это можно командой sudo iptables -A OUTPUT -p icmp —icmp-type 8 -j DROP. Она произведет блокировку запросов от вашего и к вашему серверу.

Первое правило для блокировки пропинговки iptables в CentOS 7

Входящие запросы блокируются немного иначе. Тогда нужно ввести sudo iptables -I INPUT -p icmp —icmp-type 8 -j DROP. После активации данных правил сервер не будет отвечать на ping-запросы.

Второе правило для блокировки пропинговки в iptables в CentOS 7

Включить логи iptables

Iptables позволяет записывать информацию о проходящих ip пакетах в системный журнал. Реализуется это с помощью специфичного действия LOG над соединением, после которого, ip пакет продолжает движение по цепочке нетронутым. Для примера, создадим правило, которое будет записывать в системный журнал все события соединений на порт 445 (tcp):

iptables -A INPUT -p tcp —dport 445 -j LOG —log-prefix «IN SMB DROP: »

здесь —log-prefix задает префикс для всех сообщений, логируемых нашим правилом. Это удобно, если у вас несколько разных правил логирования, или для дальнейшей программной обработки. Если теперь попробовать подключиться снаружи к нашему серверу на порт 445, например через telnet, в файле /var/log/messages появятся записи:

логи iptables
Разберем вывод:

  • IN SMB DROP: префикс, который мы задали опцией —log-prefix
  • IN=eth0 интерфейс, на который принят ip пакет, для исходящих соединений содержит пустое значение
  • OUT= интерфейс, с которого отправлен ip пакет, для входящих соединений, содержит пустое значение
  • MAC= соединенные вместе в следующем порядке: MAC-адрес назначения, MAC-адрес источника, EtherType — 08:00 соответствует IPv4.
  • SRC= ip адрес источника, от которого отправлен ip пакет
  • DST= ip адрес назначения, на который отправлен ip пакет
  • LEN= размер ip пакета в байтах
  • SPT= порт источника, от которого отправлен ip пакет
  • DPT= порт назначения, на который отправлен ip пакет

Предотвращение несанкционированных действий на сервере

Иногда серверы подвергаются DDoS атакам или другим несанкционированным действиям со стороны злоумышленников. Правильная настройка межсетевого экрана позволит обезопасить себя от подобного рода взломов. Для начала мы рекомендуем задать такие правила:

    1. Пропишите в консоли iptables -A INPUT -p tcp —dport 80 -m limit —limit 20/minute —limit-burst 100 -j ACCEPT, где —limit 20/minute — ограничение на частоту положительных результатов. Единицу измерения вы можете указывать самостоятельно, например, /second, /minute, /hour, /day. —limit-burst number — ограничение на число пропускаемых пакетов. Все значения выставляются индивидуально по предпочтениям администратора.

Правило для безопасности от DDoS в iptables в CentOS 7

    1. Далее можно запретить сканирование открытых портов, чтобы убрать одну из возможных причин взлома. Введите первую команду sudo iptables -N block-scan.

Первое правило для запрета сканирования портов iptables в CentOS 7

    1. Затем укажите sudo iptables -A block-scan -p tcp —tcp-flags SYN,ACK,FIN,RST -m limit —limit 1/s -j RETURN.

Второе правило для запрета сканирования портов iptables в CentOS 7

    1. Последняя третья команда имеет вид: sudo iptables -A block-scan -j DROP. Выражение block-scan в данных случаях — название используемой цепи.

Третье правило для блокирования сканирования портов iptables в CentOS 7

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

Как отключить iptables

Если вы вдруг решите, что firewall вам больше не нужен, то отключить его можно следующим образом:

# systemctl stop iptables.service

Эта команда останавливает фаервол. А следующая удаляет из автозагрузки:

# systemctl disable iptables.service

Отключив сетевой экран, мы разрешили все соединения.

Примеры записи параметров в файл конфигурации.

Не забывайте про параметр A и последнюю строку в цепочках.

Разрешить входящие соединения удаленного рабочего стола xrdp:

# iptables -A INPUT -p tcp -m tcp —dport 3389 -j ACCEPT

в конфигурации iptables это выглядит так:

-A INPUT -p tcp -m state —state NEW -m tcp —dport 3389 -j ACCEPT

Разрешить или запретить ICMP Ping запросы.

# iptables -A INPUT -p icmp —icmp-type echo-request -j ACCEPT
# iptables -A INPUT -p icmp —icmp-type echo-request -j DROP

Разрешить с определенной сети:

# iptables -A INPUT -s 192.168.1.0/24 -p icmp —icmp-type echo-request -j ACCEPT

Разрешить сервер SSH на 22 порту.

# iptables -A INPUT -m state —state NEW -m tcp -p tcp —dport 22 -j ACCEPT

Разрешить с определенной сети:

# iptables -A INPUT -s 192.168.1.0/24 -m state —state NEW -p tcp —dport 22 -j ACCEPT

Если ставите другой порт для SSH и SELinux не отключен, то необходимы дополнительные действия, описанные в этом блоке статьи, ниже по тексту.

Разрешить сервер ProFTPd:

# iptables -A INPUT -p tcp -m tcp —dport 21 -j ACCEPT
# iptables -A INPUT -p tcp -m tcp —dport 20 -j ACCEPT
# iptables -A INPUT -p tcp -m tcp —dport 50000:50535 -j ACCEPT

Синхронизация времени NTPd:

# iptables -A INPUT -m state —state NEW -p udp —dport 123 -j ACCEPT

Разрешить WEB-сервер на портах http/https:

# 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

Разрешить почтовый серверSMTP, POP3, IMAP:

# iptables -A INPUT -m state —state NEW -p tcp —dport 25 -j ACCEPT
# iptables -A INPUT -m state —state NEW -p tcp —dport 110 -j ACCEPT
# iptables -A INPUT -m state —state NEW -p tcp —dport 143 -j ACCEPT

Разрешить DNS сервер:

# iptables -A INPUT -m state —state NEW -p udp —dport 53 -j ACCEPT
# iptables -A INPUT -m state —state NEW -p tcp —dport 53 -j ACCEPT

Разрешить Samba сервер для локальной сети:

# iptables -A INPUT -s 192.168.1.0/24 -m state —state NEW -p tcp —dport 137 -j ACCEPT
# iptables -A INPUT -s 192.168.1.0/24 -m state —state NEW -p tcp —dport 138 -j ACCEPT
# iptables -A INPUT -s 192.168.1.0/24 -m state —state NEW -p tcp —dport 139 -j ACCEPT
# iptables -A INPUT -s 192.168.1.0/24 -m state —state NEW -p tcp —dport 445 -j ACCEPT

Разрешить CUPSсервер печати:

# iptables -A INPUT -p udp -m udp —dport 631 -j ACCEPT
# iptables -A INPUT -p tcp -m tcp —dport 631 -j ACCEPT

Разрешить Proxy сервер для локальной сети:

# iptables -A INPUT -s 192.168.1.0/24 -m state —state NEW -p tcp —dport 3128 -j ACCEPT

Разрешить MYSQL сервер для локальной сети:

# iptables -I INPUT -s 192.168.1.0/24 -p tcp —dport 3306 -j ACCEPT

Разрешить Transmission торрент-сервер:

# iptables -A INPUT -p tcp -m tcp -m state —dport 9091 —state NEW -j ACCEPT

Разрешить Minidlna медиа-сервер для локальной сети:

# iptables -A INPUT -s 192.168.1.0/24 -m state —state NEW -p tcp —dport 8200 -j ACCEPT

В Ubuntu

Для управления брандмауэром теперь используется ufw.

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

apt-get install iptables-persistent

Отключаем ufw:

ufw disable

Заключение

В данном руководстве мы рассмотрели основные моменты работы с Iptables:  разрешение трафика только на определенных портах, фильтрацию пакетов по источнику, основы настройки трансляции сетевых адресов (NAT) и сохранение правил после перезагрузки. Однако, важно заметить, что iptables работает только с трафиком ipv4. Если ваш VPS поддерживает ipv6, нужно установить отдельные правила при помощи ip6tables.

[spoiler title=»Источники»]
  • https://habr.com/ru/sandbox/18975/
  • https://losst.ru/nastrojka-iptables-dlya-chajnikov
  • https://1cloud.ru/help/security/ispolzovanie-iptables-na-linux
  • https://ITProffi.ru/nastrojka-pravil-iptables-v-linux/
  • https://linuxinsider.ru/osnovnye-nastrojki-iptables-ili-kak-nastroit-faervol-v-linux/
  • https://linuxinsider.ru/nastrojka-iptables-na-linux/
  • https://www.dmosk.ru/instruktions.php?object=iptables-settings
  • https://serveradmin.ru/nastroyka-iptables-v-centos-7/
  • https://winitpro.ru/index.php/2019/08/05/nastrojka-fajrvola-iptables/
  • https://kilobax.ru/centos/iptables-v-centos-7-linux-chto-eto-nastroika.html
  • https://lumpics.ru/configuring-iptables-on-centos-7/
  • https://hamsterden.ru/setup-iptables/
[/spoiler]