Как создавать правила для межсетевого экрана утилитой iptables

Обновлено: 04.07.2024

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

  • filter : таблица по умолчанию, которая используется, когда мы решаем, следует ли разрешить пакетам проходить определенные цепочки ( INPUT , FORWARD,OUTPUT ).
  • nat : используется с пакетами, для которых требуется преобразование адреса / порта источника или получателя. Таблица работает со следующими цепочками: PREROUTING , INPUT , OUTPUT и POSTROUTING .
  • mangle : используется со специализированными изменениями пакетов, включающими заголовки IP (например, MSS = максимальный размер сегмента или TTL = время жизни). Таблица поддерживает следующие цепочки: PREROUTING , INPUT , FORWARD , OUTPUT и POSTROUTING .
  • raw : используется, когда мы отключаем отслеживание соединений ( NOTRACK ) для определенных пакетов, в основном для обработки без сохранения состояния и в целях оптимизации производительности. Таблица относится к цепочкам PREROUTING и OUTPUT .
  • security : используется для MAC, когда пакеты подчиняются ограничениям политики SELinux. Таблица взаимодействует с цепочками INPUT , FORWARD и OUTPUT .

На следующей диаграмме приведены таблицы с соответствующими цепочками, поддерживаемыми в iptables :

Таблицы и цепочки в iptables

Рисунок 1 - Таблицы и цепочки в iptables

Порядок прохождения цепочки пакетов в сетевом стеке ядра следующий:

Теперь, когда мы знакомы с некоторыми вводными концепциями, мы можем рассмотреть несколько практических примеров, чтобы понять, как работает iptables .

В следующих примерах используется система RHEL / CentOS 8, но они должны работать во всех основных дистрибутивах Linux. Обратите внимание, что начиная с RHEL / CentOS 7 приложением управления брандмауэром по умолчанию является firewalld (обсуждается далее в следующей статье ). Если вы хотите использовать iptables , сначала вам нужно отключить firewalld :

Затем установите пакет iptables-services (в CentOS):

(В Ubuntu вы должны установить iptables с помощью sudo apt-get install iptables ).

Теперь приступим к настройке iptables .

Настройка iptables

Команда iptables требует прав суперпользователя. Сначала проверим текущую конфигурацию iptables . Общий синтаксис для получения правил в цепочке для конкретной таблицы следующий:

Параметр -L ( --list ) перечисляет правила в цепочке . Параметр -t ( --table ) указывает таблицу . Параметры CHAIN и TABLE необязательны. Если опция CHAIN опущена, все цепочки и связанные с ними правила рассматриваются в таблице. Если опция TABLE не указана, предполагается таблица фильтров . Таким образом, следующая команда перечисляет все цепочки и правила для таблицы фильтров :

В системе с конфигурацией брандмауэра по умолчанию вывод будет следующим:

Вывод текущей конфигурации в iptables

Рисунок 2 - Вывод текущей конфигурации в iptables

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

Параметр опции -t ( --table ) требуется только в том случае, если операции iptables нацелены на что-то иное, чем таблица фильтров по умолчанию .

Важная заметка

Если только -t ( --table не указан) параметр опции Iptables принимает фильтр таблицу по умолчанию.

Когда вы разрабатываете правила брандмауэра с чистого листа, обычно рекомендуются следующие шаги:

  1. Удалите все остатки текущей конфигурации брандмауэра.
  2. Настройте политику брандмауэра по умолчанию.
  3. Создайте правила брандмауэра, убедившись, что сначала размещаются более конкретные (или ограничительные) правила.
  4. Сохраните конфигурацию.

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

Шаг 1 - Очистка существующей конфигурации

Следующие команды удаляют правила из цепочек таблицы фильтров ( INPUT , FORWARD и OUTPUT ):

Предыдущие команды не выводят никаких результатов, если нет ошибки или вы не вызываете команду iptables с параметром -v ( --verbose ); Например:

Результат выглядит следующим образом:

Очистка цепочки INPUT в iptables

Рисунок 3 - Очистка цепочки INPUT в iptables

Далее мы настроим политику брандмауэра по умолчанию.

Шаг 2 - Настройка политики брандмауэра по умолчанию

По умолчанию iptables позволяет всем пакетам проходить через сетевую цепочку (брандмауэр). Конфигурация безопасного брандмауэра должна использовать DROP в качестве цели по умолчанию для соответствующих цепочек:

Параметр опции -P ( --policy ) устанавливает политику для конкретной цепочки (такой как INPUT ) для данной цели (например, DROP ). Цель DROP заставляет систему корректно игнорировать все пакеты.

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

Далее мы настроим правила брандмауэра.

Шаг 3 - Создание правил брандмауэра

Следующие команды разрешают доступ по SSH из локальной сети ( 192.168.0.0/24 ):

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

  • -A INPUT : указывает цепочку (например, INPUT ) для добавления правила к
  • -p tcp : сетевой протокол (например, tcp или udp ), передающий пакеты.
  • --dport 22 : порт назначения пакетов
  • --sport 22 : порт источника пакетов
  • -m state : свойство пакета, которое мы хотим сопоставить (например, state )
  • --state NEW, ESTABLISHED : состояние (я) пакета для соответствия
  • -s 192.168.0.0/24 : IP-адрес / маска источника, из которого исходят пакеты.
  • -j ACCEPT : цель или что делать с пакетами (например, ACCEPT , DROP , REJECT и т. д.)

Мы использовали две команды для включения доступа по SSH. Первый разрешает входящий трафик SSH ( --dport 22 ) для новых и существующих подключений ( -m state --state NEW, ESTABLISHED ). Вторая команда включает ответный трафик SSH ( --sport 22 ) для существующих соединений ( -m state –state ESTABLISHED ).

Чтобы включить DNS-трафик, нам нужно использовать следующие команды:

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

Теперь мы готовы сохранить конфигурацию iptables .

Шаг 4 - Сохранение конфигурации

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

Результат выглядит следующим образом:

Сохранение конфигурации iptables

Рисунок 4 - Сохранение конфигурации iptables

Мы также можем выгрузить текущую конфигурацию в файл (например, iptables.config ) для дальнейшего использования с помощью следующей команды:

Параметр -f ( --file ) указывает файл для сохранения (резервного копирования) конфигурации iptables . Мы можем восстановить сохраненную конфигурацию iptables позже с помощью следующей команды:

Здесь мы можем указать произвольный путь к нашему файлу конфигурации резервной копии iptables .

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

С другой стороны, использование iptables обычно не рекомендуется, особенно с недавно появившимися инструментами и фреймворками управления межсетевым экраном, которые поставляются с последними дистрибутивами Linux, такими как nftables , firewalld и ufw . Также считается, что iptables имеет проблемы с производительностью и масштабируемостью.

Далее мы рассмотрим nftables , относительно новый фреймворк, который был спроектирован и разработан проектом Netfilter Project , чтобы заменить iptables .

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

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

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

Что такое Iptables?

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

Виды пакетов

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

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

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

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

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

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

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

Но это еще не все. У нас еще есть таблицы 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,
    mh;
  • -s - указать ip адрес устройства-отправителя пакета;
  • -d - указать ip адрес получателя;
  • -i - входной сетевой интерфейс;
  • -o - исходящий сетевой интерфейс;
  • -j - выбрать действие, если правило подошло.

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

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

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

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

Сначала давайте рассмотрим как выполняется просмотр правил 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

Блокировка пакетов

Для блокировки пакетов мы можем использовать действие DROP, фильтровать пакеты, которые нужно заблокировать мы можем по множеству критериев, например, протоколу, ip адресу, маске сети, порту и многому другому.

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

sudo iptables -A INPUT -s 10.10.10.10 -j DROP

А теперь исходящие пакеты на этот же адрес:

sudo iptables -A OUTPUT -s 10.10.10.10 -j DROP

iptables2

Блокировка диапазона ip выполняется подобным образом. Для этого нужно использовать маску сети 10.10.10.0/24. Это будут все адреса начиная от 10.10.10.0 до 10.10.10.255:

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

Или расширенный вариант маски:

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

Также вы можете заблокировать все входящие соединения ssh:

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

Как видите, добавить правило iptables очень просто.

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

Удаление правил iptables выполняется точно так же, как и создание новых, только вместо опции A нужно использовать опцию D. Сначала смотрим список правил:

sudo iptables -L

iptables3

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

sudo iptables -A OUTPUT -s 10.10.10.10 -j DROP

iptables5

Также вы можете полностью очистить iptables выполнив команду с опцией -F:

sudo iptables -F

iptables6

Сохранить правила Iptables

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

А в Red Hat или CentOS:

sudo /sbin/service iptables save

Выводы

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

На завершение видео о том, как увеличить безопасность вашего сервера:


Основные команды iptables

Вывод текущих правил в табличном виде выполняется при помощи вызова команды iptables с ключом -L:


Ключ -P указывает на действие, применяемое к пакету по умолчанию.
Построчный вывод полезен тем, что каждая строка вывода — это полноценная команда в iptables (например, мы можем получить такой вывод уже на настроенном сервере и использовать его для настройки другого сервера, сделав небольшие правки).
Для очистки всех правил используется ключ -F:

Создание первого правила iptables

Это будет правило, о котором мы говорили выше. Оно позволит принимать текущее SSH-соединение между нами и сервером. Синтаксис команды, добавляющей это правило, следующий:

На первый взгляд выглядит запутанно. Разберем подробней команду:

После применения этого правила можем увидеть изменения в выводе:

Теперь мы можем менять действия в политике по умолчанию на DROP.

Другие правила iptables

Добавим еще два правила, разрешающие SSH-соединения (по умолчанию на 22 порт) и WEB-подключения на 80 порт.
Приведем синтаксис этих правил:

Разберем новые параметры:

  • -p tcp : фильтруем пакеты, использующие протокол TCP
  • –dport : выделяем TCP-пакеты с портом назначения 22 и 80.

Также есть еще одно правило, которое связано с понятием “петли” (loopback-интерфейса). Используется loopback-интерфейс для взаимодействия служб и приложений в пределах одной локальной системы, без надобности отправления пакетов на сетевой интерфейс.
Правило выглядит так:

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

Достигается написанием правила:

Тут надо помнить об опасности потери удаленного доступа к серверу. Желательно его применять, когда есть консольный доступ к серверу.

  1. Добавление запрещающего правила в конец цепочки.

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

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

Потом на основании вывода вставляем правило под нужным порядковым номером:

Более подробно о том как читать и удалять правила в iptables читайте в этой статье.

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

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

Во время установки iptables-persistent попросит подтверждение о сохранении имеющихся правил. Если в последующем мы изменили или добавили правила, то сохраняем их:

Вывод

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

iptables — утилита командной строки для настройки встроенного в ядро Linux межсетевого экрана, разработанного в рамках проекта Netfilter. Термином iptables также часто называют сам межсетевой экран в ядре. Настройка экрана выполняется либо напрямую с помощью iptables, либо через один из фронтендов, консольных или графических. iptables работает с протоколом IPv4, для IPv6 разработана утилита ip6tables. В основном их синтаксис совпадает, но некоторые специфичные для протоколов опции различаются.

Примечание: Фреймворк iptables постепенно выходит из употребления; более современная замена — nftables, в котором предусмотрен слой совместимости.

Contents

Установка

Стандартное ядро Arch Linux скомпилировано с поддержкой iptables. Необходимо лишь установить набор пользовательских утилит, которые собраны в пакет iptables . Поскольку данный пакет является косвенной зависимостью мета-пакета base , то он по умолчанию должен быть установлен в системе.

Фронтенды

Консольные

Графические

Основные понятия

iptables используется для проверки, модификации, перенаправления и отбрасывания пакетов. Код для фильтрации пакетов IPv4 уже встроен в ядро и организован в виде набора таблиц, каждая из которых предназначена для конкретной цели. Таблица состоит из группы предопределённых цепочек, а те, в свою очередь, содержат правила, которые проверяются по очереди. Каждое правило состоит из критерия (набора условий) и действия (т.н. цели); действие применяется к пакету, подпадающему под критерий (т. е. если все условия выполнены). Если пакет достигает конца встроенной цепочки, в том числе пустой, то он отправляется дальше в соответствии с политикой цепочки. iptables — пользовательская утилита для работы с цепочками и правилами. Большинство пользователей находят IP-маршрутизацию Linux сложной и запутанной, однако на практике наиболее распространенные варианты использования (NAT и/или базовый межсетевой экран для интернета) являются значительно менее сложными.

Ключ к пониманию принципа работы iptables находится в этой блок-схеме. Слова в нижнем регистре в верхней части каждого блока являются именами таблиц, а слова в верхнем регистре – цепочками. Каждый IP-пакет, принятый на любом сетевом интерфейсе, проходит через эту блок-схему сверху вниз. Существует заблуждение, что пакеты, приходящие на внутренний интерфейс, обрабатываются как-то иначе нежели те, что приходят на интерфейс, подключённый к интернету. Пакеты на всех интерфейсах обрабатываются одинаково; это ваша задача написать правила, которые будут обрабатывать их по-разному. Некоторые пакеты предназначены для локальных процессов; они проходят по схеме от верхнего блока до блока <Local Process> (локальный процесс). В то же время локальный процесс сам может генерировать пакеты, и они начинают путешествие по схеме с блока <Local Process> и далее вниз. Подробное описание работы этой блок-схемы можно найти здесь.

В подавляющем большинстве случаев таблицы raw, mangle и security вам не понадобятся. На схеме ниже приведён упрощённый вариант прохождения пакета через iptables:

Таблицы

iptables содержит пять таблиц:

  1. raw — используется только для настройки пакетов, поэтому они освобождаются от отслеживания.
  2. filter — таблица по умолчанию; в ней сосредоточены все действия, типичные для межсетевых экранов.
  3. nat — используется для преобразования сетевых адресов (например, проброс портов).
  4. mangle — используется для специальных преобразований пакетов.
  5. security — используется в сетевых правилах для Мандатного управления доступом (например, в SELinux – подробнее см. эту статью).

Скорее всего, вам потребуются только две из них: filter и nat. Остальные таблицы используются в сложных конфигурациях с несколькими маршрутизаторами и выходят за рамки данной статьи.

Цепочки

Таблицы состоят из цепочек, которые представляют собой набор правил, следующих друг за другом в определённом порядке. Таблица по умолчанию, filter, содержит три встроенные цепочки: INPUT , OUTPUT и FORWARD , которые, как видно из диаграммы, активируются в определённые моменты процесса фильтрации пакетов. Таблица nat включает стандартные цепочки PREROUTING , POSTROUTING и OUTPUT .

Описание стандартных цепочек других таблиц можно найти в руководстве iptables(8) .

По умолчанию все цепочки пусты и не содержат каких-либо правил. Вы должны добавить правила в те цепочки, которые собираетесь использовать. У цепочек также задана политика по умолчанию — обычно ACCEPT , но её можно изменить на DROP , если вы хотите убедиться, что ни один пакет не проскочит мимо вашего набора правил. Тем не менее, политика по умолчанию применяется к пакету только после того, как он пройдёт через все существующие правила.

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

Правила

Фильтрация пакетов основана на правилах. Каждое правило состоит из нескольких условий и действия-цели. Если пакет соответствует всем условиям, то к нему применяется указанное действие. Распространённые условия для проверки — на какой интерфейс пришёл пакет (например, eth0 или eth1), какого он типа (ICMP, TCP или UDP) или на какой порт направляется.

Цели указываются опцией -j / --jump . Цель может быть встроеной (built-in), целью-расширением (extension) или переходом на пользовательскую цепочку. Встроенные цели — ACCEPT , DROP , QUEUE и RETURN ; цели-расширения, к примеру — REJECT и LOG . Если применяется встроенная цель, то участь пакета решается незамедлительно и обработка пакета в таблице прекращается. Если в качестве цели выбран переход на пользовательскую цепочку, то пакет проходит через неё, возвращается в исходную цепочку и продолжает со следующего после перехода правила. Цели-расширения могут быть завершающими (как встроенные) или незавершающими (как пользовательские цепочки). Подробнее см. iptables-extensions(8) .

Прохождение по цепочке

Модули

Существует ряд модулей для расширения возможностей iptables, среди которых connlimit, conntrack, limit и recent. Эти модули добавляют новую функциональность в iptables, что позволяет создавать более сложные правила фильтрации.

Настройка и использование

После добавления правил посредством командной строки файл настроек не изменится автоматически — изменения необходимо сохранять командой:

Если вы изменяли файл настроек вручную, то либо перезагрузите службу iptables, либо загрузите настройки вручную командой:

Из командной строки

Вывод текущих правил

Основная команда для вывода текущих правил — --list-rules / -S ; её вывод похож на вывод утилиты iptables-save. Разница между ними в том, что по умолчанию последняя выводит правила из всех таблиц, в то время как iptables — только из таблицы filter .

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

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

Чтобы вывести номера строк при просмотре правил, запустите команду с опцией --line-numbers . Это бывает удобно для последующего редактирования правил в командной строке.

Сброс правил

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

Команда -F без аргументов просто очищает все цепочки в текущей таблице. Аналогично, команда -X удаляет все пустые пользовательские цепочки в таблице.

Отдельные цепочки могут быть очищены от правил или удалены указанием имени цепочки после команд -F и -X соответственно.

Редактирование правил

Редактирование правил подразумевает одно из следующих действий: добавление правила в конец цепочки ( -A ), вставка правила в конкретную позицию в цепочке ( -I ), замена ( -R ) и удаление ( -D ) существующего правила.

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

Важно: Этот раздел не претендует на роль руководства по защите серверов. Его назначение — научить синтаксису и принципам правил iptables. Изучите статью Настройка межсетевого экрана, в которой приведена минимально безопасная конфигурация iptables, а также страницу Безопасность, где рассмотрена защита системы в целом.

Синхронизация по локальной сети в Dropbox производится с помощью отправки широковещательных пакетов каждые 30 секунд всем доступным компьютерам сети. Если вы находитесь в локальной сети с клиентами Dropbox и не желаете использовать эту возможность, то следует отклонять такие пакеты:

Примечание: Здесь используется действие REJECT , а не DROP , так как в RFC 1122 указано требование к хостам возвращать ICMP-ошибки всегда, когда это возможно, вместо простого отбрасывания пакета. На этой странице поясняется, почему REJECT почти всегда лучше DROP .

Теперь предположим, что вы поменяли своё мнение касательно Dropbox и решили установить его на компьютере. Также вы режили использовать синхронизацию, но с одним конкретным IP-адресом (например, 10.0.0.85 ). Команда -R позволяет заменить существующее правило:

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

Второе правило теперь можно переписать так, чтобы оно отбрасывало все пакеты на порт 17500 с других хостов:

Итоговый список правил теперь выглядит следующим образом:

Руководства

Журналирование

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

Добавьте в неё следующие правила:

Опции limit и limit-burst объяснены следующем разделе.

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

Ограничение скорости логирования

Цепочка logdrop из предыдущего раздела использует модуль limit , который помогает предотвратить разрастание журнала и избежать ненужных операций записи на диск. Если этого не сделать, то неправильно настроенная служба, которая пытается установить соединение, или просто злоумышленник, могут привести к исчерпанию свободного места на диске (как минимум в разделе /var ) из-за добавления чрезмерного количества записей в журнал.

Модуль limit подключается опцией -m limit . Опцией --limit задаётся средняя скорость журналирования, а опцией --limit-burst — начальная. В примере цепочки logdrop выше команда

добавляет правило, которое логирует все проходящие через него пакеты. Первые 10 пакетов будут добавлены в журнал, но затем скорость логирования не будет превышать 5 пакетов в минуту. Если значение limit какое-то время не нарушается, то limit-burst снова "разблокируется", т.е. журналирование автоматически вернётся к нормальному режиму.

Просмотр логированных пакетов

Следующая команда выведет список пакетов, добавленных журнал с момента последней загрузки системы:

syslog-ng

Если вы используете syslog-ng, то в файле syslog-ng.conf можно настроить место хранения логов iptables. Замените:

После этого вывод iptables больше не будет отправляться в /var/log/everything.log .

Если необходимо задать произвольный файл для хранения журнала iptables (вместо /var/log/iptables.log ), то измените значение пути в параметре d_iptables (в том же файле ( syslog-ng.conf ):

ulogd

ulogd — работающий в пространстве пользователя специализированный демон журналирования пакетов для netfilter, который может заменить стандартную цель LOG . Пакет ulogd доступен в репозитории [community] .

Читайте также: