Iptables: сетевая безопасность и фильтрация пакетов. Основные понятия iptables в Linux

Определение i ptables - утилита командной строки, является стандартным интерфейсом управления работой межсетевого экрана (брандмауэра) netfilter для ядер Linux версий 2.4, 2.6, 3.x, 4.x . Для использования утилиты iptables требуются привилегии суперпользователя (root).

Мы будем разбираться с iptables и без небольшого теоритического вступления не обойтись.

Что бы правильно составлять правила брандмауэра нужно понимать как вообще идут пакеты и что с ними происходит.

Порядок движения транзитных пакетов

Шаг Таблица Цепочка Примечание
1
2 mangle PREROUTING Обычно эта цепочка используется для внесения изменений в заголовок пакета, например для изменения битов TOS и пр..
3 nat PREROUTING Эта цепочка используется для трансляции сетевых адресов (). выполняется позднее, в другой цепочке.
4 Принятие решения о дальнейшей маршрутизации, т.е. в этой точке решается куда пойдет пакет — локальному приложению или на другой узел сети.
5 mangle FORWARD Далее пакет попадает в цепочку FORWARD таблицы mangle.
6 Filter FORWARD В цепочку FORWARD попадают только те пакеты, которые идут на другой хост Вся фильтрация транзитного трафика должна выполняться здесь. Не забывайте, что через эту цепочку проходит траффик в обоих направлениях, обязательно учитывайте это обстоятельство при написании правил фильтрации.
7 mangle POSTROUTING Эта цепочка предназначена для внесения изменений в заголовок пакета уже после того как принято последнее решение о маршрутизации.
9 nat POSTROUTING Эта цепочка предназначена в первую очередь для Source Network Address Translation . Здесь же выполняется и маскарадинг (Masquerading ).
9 Выходной сетевой интерфейс (например, eth1).

Для локального приложения(входящие пакеты)

Шаг Таблица Цепочка Примечание
1 Входной сетевой интерфейс (например, eth0)
2 mangle PREROUTING Обычно используется для внесения изменений в заголовок пакета, например для установки битов TOS и пр.
3 nat PREROUTING Преобразование адресов (Destination Network Address Translation ).
4 Принятие решения о маршрутизации.
5 mangle INPUT Пакет попадает в цепочку INPUT таблицы mangle. Здесь вносятся изменения в заголовок пакета перед тем как он будет передан локальному приложению.
6 filter INPUT Здесь производится фильтрация входящего трафика. Помните, что все входящие пакеты, адресованные нам, проходят через эту цепочку, независимо от того с какого интерфейса они поступили.
7 Локальный процесс/приложение (т.е., программа-сервер или программа-клиент)

От локальных процессов(исходящие пакеты)

Шаг Таблица Цепочка Примечание
1 Локальный процесс (т.е., программа-сервер или программа-клиент).
2 Принятие решения о маршрутизации. Здесь решается куда пойдет пакет дальше — на какой адрес, через какой сетевой интерфейс и пр.
3 mangle OUTPUT Здесь производится внесение изменений в заголовок пакета. Выполнение фильтрации в этой цепочке может иметь негативные последствия.
4 nat OUTPUT Эта цепочка используется для трансляции сетевых адресов (NAT) в пакетах, исходящих от локальных процессов брандмауэра.
5 Filter OUTPUT Здесь фильтруется исходящий траффик.
6 mangle POSTROUTING Цепочка POSTROUTING таблицы mangle в основном используется для правил, которые должны вносить изменения в заголовок пакета перед тем, как он покинет брандмауэр, но уже после принятия решения о маршрутизации. В эту цепочку попадают все пакеты, как транзитные, так и созданные локальными процессами брандмауэра.
7 nat POSTROUTING Здесь выполняется Source Network Address Translation . Не следует в этой цепочке производить фильтрацию пакетов во избежание нежелательных побочных эффектов. Однако и здесь можно останавливать пакеты, применяя политику по-умолчанию DROP .
8 Сетевой интерфейс (например, eth0)

Как мы поняли есть основные три таблицы:

  • mangle — Данная таблица предназначена для операций по классификации и маркировке пакетов и соединений, а также модификации заголовков пакетов (поля TTL и TOS).
  • filter — основная таблица для фильтрации пакетов, используется по умолчанию. Собственно в этой таблице и происходит фильтрация пакетов.
  • nat — обеспечивает работу nat, если вы хотите использовать компьютер в качестве маршрутизатора. Здесь задаются правила для маршрутизации.

Для таблицы nat применимы действия:

  • MASQUERADE

Действие DNAT (Destination Network Address Translation) производит преобразование адресов назначения в заголовках пакетов. Другими словами, этим действием производится перенаправление пакетов на другие адреса, отличные от указанных в заголовках пакетов.

SNAT (Source Network Address Translation) используется для изменения исходных адресов пакетов. С помощью этого действия разделить единственный внешний IP адрес между компьютерами локальной сети для выхода в Интернет. В этом случае брандмауэр, с помощью SNAT , автоматически производит прямое и обратное преобразование адресов, тем самым давая возможность выполнять подключение к серверам в Интернете с компьютеров в локальной сети.

Маскировка (MASQUERADE ) применяется в тех же целях, что и SNAT , но в отличие от последней, MASQUERADE дает более сильную нагрузку на систему. Происходит это потому, что каждый раз, когда требуется выполнение этого действия — производится запрос IP адреса для указанного в действии сетевого интерфейса, в то время как для SNAT IP адрес указывается непосредственно. Однако, благодаря такому отличию, MASQUERADE может работать в случаях с динамическим IP адресом, т.е. когда вы подключаетесь к Интернет, скажем через PPP , SLIP или DHCP .

iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

Выполнить MASQUERADE для всех пакетов идущих из сети 10.8.0.0 на интерфейс eth0 . Для понятности, допустим у нас две сетевые карточки и две сети. Нам надо что бы сеть 10.8.0.0/24 (первая сетевая карточка)могла выйти скажем в интернет через eth0(вторая сетевая карточка)

  • raw — Предназначена для выполнения действий с пакетами до их обработки системой.

Собственно таблица по умолчанию filter .

  • INPUT - обрабатывает трафик, поступающий непосредственно самому хосту.
  • FORWARD - позволяет фильтровать транзитный трафик.
  • OUTPUT - позволяет фильтровать трафик, исходящий от самого хоста.

Действие с пакетом.

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

Получается у нас цепочка [таблица — filter ] — [ трафик — INPUT ] — [действие — DROP ] логика действий только кажется сложной. Думаю мы с вами на примерах разберемся и станет все просто.

Команд iptables:

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

Начнем разбираться на конкретных примерах.

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

-A добавить новое правило, INPUT для входящих пакетов, -p протокол, один из tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp,
mh, — — dport порт назначения 80(опция только для протокола), -j выбрать действие, если правило подошло, ACCEPT разрешить. То есть разрешить входящий трафик по протоколу tcp на порт 80.

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

iptables -A INPUT -s ! 192.168.0.50 -j DROP

-s адрес источника - имя хоста(www.help.com), IP-адрес или подсеть в нотации CIDR(192.168.0.1/16) , ! инверсия, DROP запретить. Запретить весь входящий трафик, кроме источника 192.168.0.50 (если бы не было ! , то запретить только с 192.168.0.50 )

iptables -A INPUT -s 192.168.0.50 -j DROP

Запретить входящий трафик с ip — 192.168.0.50 .

Список критериев правил:

  • -p Протокол, протокол также можно указать с помощью номера или названия согласно перечислению, приведенному в /etc/protocols . Значение «любой протокол» можно указать с помощью слова all или числа 0 . Так же для протокола есть дополнительные параметры : —sport (—source-port) Позволяет указать исходящий порт (или их диапазон). —dport (—destination-port) Позволяет указать порт назначения (или их диапазон).
  • -s Определяет адрес отправителя . В качестве адреса может выступать IP-адрес (возможно с маской), доменное имя (в последних двух случаях перед добавлением правила в цепочку имя резольвится в IP-адрес).
  • -i Определяет входящий сетевой интерфейс. Если указанное имя интерфейса заканчивается знаком «+» (например, eth +), то критерию соответствуют все интерфейсы, чьи названия начинаются на указанное имя(etho,eth1).
  • -d Определяет адрес получателя . Синтаксис аналогичен -s .
  • -o Определяет исходящий сетевой интерфейс. Синтаксис аналогичен -i .

Так же критерия можно комбинировать.

iptables -A INPUT -i eth0 -s 192 .168.0.0 -j DROP

Запретить входящие пакеты с интерфейса eth0 и ip 192 .168.0.0 . А на интерфейс eth1 пакеты пройдут.

А что делать если вы за ранние не знаете какой порт открывать , например хотите что бы FTP сервер работал в пассивном режиме. Модуль conntrack о состоянии соединения поможет, а конкретней критерий - ctstate. Модуль подключается тэгом -m .

iptables -A INPUT -m conntrack —ctstate ESTABLISHED,RELATED -j ACCEPT

iptables -A INPUT -m conntrack —ctstate NEW -p tcp —dport 21 -j ACCEPT # Разрешаем открывать соединения на 21 TCP-порт.

Возможные состояния:

  • NEW - соединение не открыто, то есть пакет является первым в соединении.
  • ESTABLISHED - пакет относится к уже установленному соединению. Обычно такие пакеты принимаются без дополнительной фильтрации, как и в случае с RELATED.
  • RELATED - пакет открывает новое соединение, логически связанное с уже установленными, например, открытие канала данных в пассивном режиме FTP. Соединение получает статус RELATED если оно связано с другим соединением, имеющим признак ESTABLISHED .
  • INVALID — Признак INVALID говорит о том, что пакет не может быть идентифицирован и поэтому не может иметь определенного статуса.

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

State и деологический предшественник conntrack, имеет единственный параметр --state , аналогичный параметру --ctstate модуля conntrack (но, в отличие от него, не поддерживающий состояния DNAT и SNAT).

Кратко рассмотрим таблицу таксировщика, которую можно найти в файле /proc/net/ip_conntrack . Здесь содержится список всех активных соединений.

Tcp 6 300 ESTABLISHED src=128.*.*.* dst=194.*.*.* sport=52524 dport=2223 src=194.*.*.* dst=128.*.*.* sport=2223 dport=52524 mark=0 use=2

Первое как понятно это протокол, потом десятичное число(что значит не знаю),потом идет время жизни соединения. Далее состояние ESTABLISHED то есть соединение уже установлено, бывает еще UNREPLIED что значит что ответного трафика еще не было. Далее расположены адреса отправителя и получателя, порт отправителя и получателя. Далее все наоборот соответственно, ASSURED этот флаг сообщает о том, что соединение установлено уверенно и эта запись не будет стерта по достижении максимально возможного количества трассируемых соединений.

Некоторые особенности протоколов.

TCP соединение всегда устанавливается передачей трех пакетов, которые инициализируют и устанавливают соединение, через которое в дальнейшем будут передаваться данные. Сессия начинается с передачи SYN пакета, в ответ на который передается SYN/ACK пакет и подтверждает установление соединения пакет ACK .

Как только трассировщик увидел первый (SYN ) пакет, то присваивает ему статус NEW . Как только через трассировщика проходит второй пакет (SYN/ACK ), то соединению присваивается статус ESTABLISHED .

С протоколом UDP немного все по другому этот протокол не предусматривает установления и закрытия соединения, но самый большой недостаток — отсутствие информации об очередности поступления пакетов. Но с точки зрения трасировщика все так же как с TCP. Первому пришедшему пакету присваивает ему статус NEW. Как только вы отправляете ответный пакет присваивается статус ESTABLISHED. Единственное отличия что статут ASSURED присваиваться только когда обменялись уже несколькими пакетами.

Логирование применений правил.

iptables дает возможность вести логи отдельных пакетов и событий. Для этого применяется действие LOG .

iptables -A INPUT -p tcp —syn -j LOG —log-level info —log-prefix «INPUT packets «

—log-level Используется для задания уровня журналирования (log level). Полный список уровней вы найдете в руководстве (man) по syslog.conf. Обычно, можно задать следующие уровни: debug , info , notice , warning , warn , err , error , crit , alert , emerg и panic . Логи пишутся в файл syslog.

—log-prefix Ключ задает текст (префикс), которым будут предварять все сообщения iptables . Сообщения со специфичным префиксом затем легко можно найти, к примеру, с помощью grep . Префикс может содержать до 29 символов, включая и пробелы.

Jun 1 17:12:20 debian kernel: INPUT packets IN=eth0 OUT= MAC=02:1e:6d:00:e2:1c:00:01:e8:11:73:69:08:00 SRC=125.94.12.95 DST=194.87.239.104 LEN=40 TOS=0x00 PREC=0x00 TTL=52 ID=38690 PROTO=TCP SPT=12557 DPT=23 WINDOW=1460$ RES=0x00 SYN URGP=0

Популярные команды управления iptables.

iptables -L -n —line-numbers Посмотреть список правил.

-n номер портов и ip в цифровом варианте.

—line-numbers номер строки.

iptables -F Полностью сбросить правила.

iptables -P INPUT ACCEPT Правила по умолчанию для таблицы INPUT .
iptables -P OUTPUT ACCEPT Правила по умолчанию для таблицы OUTPUT.
iptables -P FORWARD DROP Правила по умолчанию для таблицы FORWARD.

iptables -D INPUT 1 Удаление правила по его номеру в цепочке.

iptables -D INPUT -s 123.45.67.89 -j DROP Удаление правила на основе того, что оно делает.

iptables -I INPUT … Вставка (insert) правила в начало цепочки.

iptables -I INPUT 3 … Или можно указать конкретную позицию.

REDIRECT

Действие REDIRECT предназначено для перенаправления пакетов с одного набора портов на другой внутри одной системы, не выходя за пределы хоста .
Работает REDIRECT только в цепочках PREROUTING и OUTPUT таблицы nat . Таким образом, область применения сводится только к перенаправлению. Чаще всего это используется для прозрачного прокси, когда клиент из локальной сети коннектится на 80 порт, а шлюз редиректит пакеты на локальный порт прокси:

iptables -t nat -A PREROUTING -p tcp —dport 80 -j REDIRECT —to-port 3128

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

iptables — restore > /etc/iptables Загрузить правила из файла.

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

Рассчитанной на новичков. Мы же попытаемся восполнить этот пробел. Рассмотрим основы составления правил, а также некоторые дополнительные модули которые помогут сделать жизнь легче.

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

    Вы имеете представление о сетевых технологиях и Вы знакомы с администрированием Linux и Gentoo Linux в частности. То есть необходимы навыки работы с такими базовыми вещами как ifconfig , rc-update , /etc/conf.d/net, и так далее. Если для Вас это пока пустые звуки, то, пожалуйста предварительно изучите Настольную книгу Gentoo и Linux Help"s Networking Basics 101

Networking --->

Networking Options---->

Network Packet Filtering (replace Ipchains)--->

Netfilter Configuration

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

Ключевыми понятиями iptables являются:

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

    • Критерий - логическое выражение, анализирующее свойства пакета и/или соединения и определяющее, подпадает ли данный конкретный пакет под действие текущего правила. Критерии соединяются логическим «И».

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

      Счетчик - компонент правила, обеспечивающий учет количества пакетов, которые попали под критерий данного правила. Также счетчик учитывает суммарный объем таких пакетов в байтах.

    Цепочка - упорядоченная последовательность правил. Цепочки можно разделить на пользовательские и базовые.

    • Базовая цепочка - цепочка, создаваемая по умолчанию при инициализации таблицы. Каждый пакет, в зависимости от того, предназначен ли он самому хосту, сгенерирован им или является транзитным, должен пройти положенный ему набор базовых цепочек различных таблиц. Кроме того, базовая цепочка отличается от пользовательской наличием «действия по умолчанию» (default policy). Это действие применяется к тем пакетам, которые не были обработаны другими правилами этой цепочки и вызванных из нее цепочек. Имена базовых цепочек всегда записываются в верхнем регистре (PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING).

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

    Таблица - совокупность базовых и пользовательских цепочек, объединенных общим функциональным назначением. Имена таблиц (как и модулей критериев) записываются в нижнем регистре, так как в принципе не могут конфликтовать с именами пользовательских цепочек. При вызове команды iptables таблица указывается в формате -t имя_таблицы. При отсутствии явного указания, используется таблица filter.

Синтаксический анализ:

# Дамп правил таблицы filter $ sudo iptables-save -c -t filter # Таблица filter * filter # Цепочки INPUT, FORWARD, OUTPUT, их политики и счётчики :INPUT ACCEPT [ 19302 :9473669 ] :FORWARD ACCEPT [ 0 :0 ] :OUTPUT ACCEPT [ 5462736 :4247599532 ] # Правило: "" - счётчик правила, "-A INPUT" - цепочка, "-i em1 -p tcp -m tcp --dport 22" - критерии, "-j ACCEPT" - действие [ 17 :1020 ] -A INPUT -i em1 -p tcp -m tcp --dport 22 -j ACCEPT COMMIT

Архитектура

В системе netfilter, пакеты пропускаются через цепочки. Цепочка является упорядоченным списком правил, а каждое правило может содержать критерии и действие или переход. Когда пакет проходит через цепочку, система netfilter по очереди проверяет, соответствует ли пакет всем критериям очередного правила, и если так, то выполняет действие (если критериев в правиле нет, то действие выполняется для всех пакетов проходящих через правило). Вариантов возможных критериев очень много. Например, пакет соответствует критерию –source 192.168.1.1 если в заголовке пакета указано, что отправитель - 192.168.1.1. Самый простой тип перехода, –jump, просто пересылает пакет в начало другой цепочки. Также при помощи –jump можно указать действие. Стандартные действия доступные во всех цепочках - ACCEPT (пропустить), DROP (удалить), QUEUE (передать на анализ внешней программе), и RETURN (вернуть на анализ в предыдущую цепочку). Например, команды

Iptables -A INPUT --source 192.168.1.1 --jump ACCEPT iptables -A INPUT --jump other_chain

означают «добавить к концу цепочки INPUT следующие правила: пропустить пакеты из 192.168.1.1, а всё, что останется - отправить на анализ в цепочку other_chain».

Цепочки

Существует 5 типов стандартных цепочек, встроенных в систему:

    PREROUTING - для изначальной обработки входящих пакетов.

    INPUT - для входящих пакетов адресованных непосредственно локальному процессу (клиенту или серверу).

    FORWARD - для входящих пакетов перенаправленных на выход (заметьте, что перенаправляемые пакеты проходят сначала цепь PREROUTING, затем FORWARD и POSTROUTING).

    OUTPUT - для пакетов генерируемых локальными процессами.

    POSTROUTING - для окончательной обработки исходящих пакетов.

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

Таблицы

Цепочки организованны в 4 таблицы:

    Raw - просматривается до передачи пакета системе определения состояний. Используется редко, например для маркировки пакетов, которые НЕ должны обрабатываться системой определения состояний. Для этого в правиле указывается действие NOTRACK. Содержит цепочки PREROUTING и OUTPUT.

    Mangle - содержит правила модификации (обычно заголовка) IP‐пакетов. Среди прочего, поддерживает действия TTL (Time to live), TOS (Type of Service), и MARK (для изменения полей TTL и TOS, и для изменения маркеров пакета). Редко необходима и может быть опасна. Содержит все пять стандартных цепочек.

    Nat - просматривает только пакеты, создающие новое соединение (согласно системе определения состояний). Поддерживает действия DNAT, SNAT, MASQUERADE, REDIRECT. Содержит цепочки PREROUTING, OUTPUT, и POSTROUTING.

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

Цепочки с одинаковым названием, но в разных таблицах - совершенно независимые объекты. Например, raw PREROUTING и mangle PREROUTING обычно содержат разный набор правил; пакеты сначала проходят через цепочку raw PREROUTING, а потом через mangle PREROUTING.

Состояния

В системе netfilter, каждый пакет проходящий через механизм определения состояний, может иметь одно из четырёх возможных состояний:

    NEW - пакет открывает новый сеанс. Классический пример - пакет TCP с флагом SYN.

    ESTABLISHED - пакет является частью уже существующего сеанса.

    RELATED - пакет открывает новый сеанс, связанный с уже открытым сеансом. Например, во время сеанса пассивного FTP , клиент подсоединяется к порту 21 сервера, сервер сообщает клиенту номер второго, случайно выбранного порта, после чего клиент подсоединяется ко второму порту для передачи файлов. В этом случае второй сеанс (передача файлов по второму порту) связан с уже существующим сеансом (изначальное подсоединение к порту 21).

    INVALID - все прочие пакеты.

Диаграмма прохождения таблиц и цепочек

Упрощённая диаграмма прохождения таблиц и цепочек:

Детальная диаграмма:

Базовая конфигурация

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

IPv4

sudo iptables-save

Создаём скрипт с дампом правил iptables:

sudo nano / etc/ network/ if-up.d/ iptables-rules

Копируем следующий код:

#!/sbin/iptables-restore -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A FORWARD -p icmp -j ACCEPT -A FORWARD -j REJECT --reject-with icmp-host-prohibited #-A OUTPUT -p icmp -j ACCEPT #-A OUTPUT -o lo -j ACCEPT #-A OUTPUT -j REJECT --reject-with icmp-host-prohibited COMMIT

Дополняем нужными правилами с учётом iptables-save.

sudo chmod +x / etc/ network/ if-up.d/ iptables-rules sudo / etc/ network/ if-up.d/ iptables-rules

IPv6

Просмотр текущей конфигурации:

sudo ip6tables-save

Создаём скрипт с дампом правил ip6tables:

sudo nano / etc/ network/ if-up.d/ ip6tables-rules

Копируем следующий код:

#!/sbin/ip6tables-restore # Таблица filter и её цепочки * filter:INPUT ACCEPT [ 0 :0 ] :FORWARD ACCEPT [ 0 :0 ] :OUTPUT ACCEPT [ 0 :0 ] # Разрешаем связанные и установленые соединения -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT # Разрешаем служебный icmp-трафик -A INPUT -p ipv6-icmp -j ACCEPT # Разрешаем доверенный трафик на интерфейс loopback -A INPUT -i lo -j ACCEPT # Сюда можно вставлять дополнительные правила для цепочки INPUT # Запрещаем всё остальное для INPUT -A INPUT -j REJECT --reject-with icmp6-adm-prohibited # Порядок и смысл правил для цепочек FORWARD и OUTPUT аналогичен INPUT -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A FORWARD -p ipv6-icmp -j ACCEPT -A FORWARD -j REJECT --reject-with icmp6-adm-prohibited # Фильтровать цепочку OUTPUT настоятельно не рекомендуется #-A OUTPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT #-A OUTPUT -p ipv6-icmp -j ACCEPT #-A OUTPUT -o lo -j ACCEPT #-A OUTPUT -j REJECT --reject-with icmp6-adm-prohibited COMMIT

Дополняем нужными правилами с учётом ip6tables-save.

Сохраняем и закрываем: Ctrl + O , Enter , Ctrl + X

Делаем скрипт исполняемым и загружаем правила iptables:

sudo chmod +x / etc/ network/ if-up.d/ ip6tables-rules sudo / etc/ network/ if-up.d/ ip6tables-rules

Дополнительные правила

Ниже приведены некоторые сравнительно часто используемые правила. Цепочки INPUT/OUTPUT применяются для фильтрации локального трафика. Для транзитного трафика необходимо использовать цепочку FORWARD.

Удалённый доступ

# remote.ssh -A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 22 -j ACCEPT # remote.rdp -A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 3389 -j ACCEPT # remote.vnc -A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 5900 -j ACCEPT

Веб и файловые сервисы

# web.http, web.https -A INPUT -p tcp -m conntrack --ctstate NEW -m multiport -A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 21 -j ACCEPT

Почта и мгновенные сообщения

# mail.pop3, mail.pop3s -A INPUT -p tcp -m conntrack --ctstate NEW -m multiport --dports 110 ,995 -j ACCEPT # mail.imap, mail.imaps -A INPUT -p tcp -m conntrack --ctstate NEW -m multiport --dports 143 ,993 -j ACCEPT # mail.smtp, mail.smtps -A INPUT -p tcp -m conntrack --ctstate NEW -m multiport --dports 25 ,465 -j ACCEPT # im.xmpp -A INPUT -p tcp -m conntrack --ctstate NEW -m multiport --dports 5222 ,5223 -j ACCEPT # im.icq.oscar -A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 5190 -j ACCEPT

Сетевые службы

# network.openvpn.vpn -A INPUT -p udp -m conntrack --ctstate NEW -m udp --dport 1194 -j ACCEPT # network.squid.proxy -A INPUT -p udp -m conntrack --ctstate NEW -m udp --dport 3128 -j ACCEPT # network.dns -A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 53 -j ACCEPT -A INPUT -p udp -m conntrack --ctstate NEW -m udp --dport 53 -j ACCEPT # network.ntp -A INPUT -p udp -m conntrack --ctstate NEW -A INPUT -p udp -m conntrack --ctstate NEW -m udp --dport 69 -j ACCEPT # network.dhserver.dhcp.discover-request -A INPUT -p udp -m conntrack --ctstate NEW -m udp --sport 68 --dport 67 -j ACCEPT # network.dhclient.dhcp.discover-request #-A OUTPUT -p udp -m conntrack --ctstate NEW -m udp --sport 68 --dport 67 -j ACCEPT # network.dhserver.dhcp.offer-ack #-A OUTPUT -p udp -m conntrack --ctstate NEW -m udp --sport 67 --dport 68 -j ACCEPT

Тестирование и отладка

Просмотр текущей конфигурации для IPv4 и IPv6:

sudo iptables-save sudo ip6tables-save

Логирование

Трассировка

Модули ядра

Просмотр загруженных модулей:

lsmod | grep -E "^ip|^nf" | sort

Для загрузки дополнительных модулей удобно применять автодополнение: 2x Tab

sudo modprobe nf sudo modprobe modules-load.d

iptables - утилита командной строки, является стандартным интерфейсом управления работой межсетевого экрана (брандмауэра) netfilter для ядер Linux версий 2.4 и 2.6. Для использования утилиты iptables требуются привилегии суперпользователя (root).Иногда под словом iptables имеется в виду и сам межсетевой экран netfilter.

1. Что же такое межсетевой экран и зачем он нужен?

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


Основной задачей сетевого экрана является компьютерных сетей или отдельных узлов от несанкционированного доступа. Также сетевые экраны часто называют фильтрами, так как их основная задача - не пропускать (фильтровать) пакеты, не подходящие под критерии, определённые в конфигурации.

2. Принципы работы iptables

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

В Iptables используется три вида таблиц:

  1. Mangle - обычно эта цепочка используется для внесения изменений в заголовок пакета, например для изменения битов TOS и пр.
  2. Nat - эта цепочка используется для трансляции сетевых адресов (Destination Network Address Translation). Source Network Address Translation выполняется позднее, в другой цепочке. Любого рода фильтрация в этой цепочке может производиться только в исключительных случаях.
  3. Filter - здесь производится фильтрация трафика. Помните, что все входящие пакеты, адресованные нам, проходят через эту цепочку, независимо от того с какого интерфейса они поступили.

Соответственно, нас интересует третья таблица Filter. В этой таблицы имеются три встроенные цепочки:

  1. INPUT - для входящих пакетов.
  2. FORWARD - для проходящих через данную машину к другой.
  3. OUTPUT - для исходящих.

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

Программа Iptables позволяет редактировать правила через терминал путем ввода команд.

Немного о написании правил:

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

Iptables [-t имя-таблицы ] команда [шаблон] [-j действие ]

Опция -t задает таблицу . Если опция упущена, то по умолчанию предполагается использование таблицы filter. Если предполагается использование другой таблицы, то это требуется указать явно.

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

Список команд:

  • -A имя-цепочки правило (добавить правило в конец цепочки; ключ --set-counters позволяет установить счётчики пакетов и байтов)
  • -I имя-цепочки номер правило (вставить правило в цепочку перед правилом с указанным номером, нумерация с 1; ключ --set-counters позволяет установить счётчики пакетов и байтов)
  • -R имя-цепочки номер правило (заменить;
    ключ --set-counters позволяет установить счётчики пакетов и байтов)
  • -D имя-цепочки номер (удалить правило с указанным номером, нумерация с 1)
  • -D имя-цепочки правило (удалить правило по текстуальному совпадению)
  • -C имя-цепочки пакет (тестировать прохождение пакета;
    исходящий адрес, адрес назначения, протокол, интерфейс, порты задаются соответствующими ключами)
  • -L [имя-цепочки ] (показать список правил; дополнительные ключи:
    • -v (вывести дополнительную информацию, в частности, счётчики)
    • --exact (показывать счётчики без округления до KB, MB и т.д.)
    • --numeric (показывать адреса и номера портов в виде чисел)
    • --line-numbers (выводить номера правил)
  • -F имя-цепочки (удалить все правила из цепочки)
  • -Z имя-цепочки (обнулить счетчики)
  • -N имя-цепочки (создать цепочку)
  • -X имя-цепочки (удалить пустую цепочку, на которую нет ссылок)
  • -P имя-цепочки действие (изменить действие по умолчанию: ACCEPT,
    DROP, QUEUE, RETURN)
  • -E старое-имя-цепочки новое-имя-цепочки (переименовать цепочку)

Раздел шаблон задает критерии проверки, по которым определяется подпадает ли пакет под действие этого правила или нет.Здесь можно указать самые разные критерии - IP-адрес источника пакета или сети, сетевой интерфейс. IP-адрес места назначения, порт, протокол и т.д. Остальные параметры для фильтации можно посмотреть в справке по утилите iptables(man iptables)

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

Список некоторых действий:

  • ACCEPT - пропустить пакет; просмотр таблицы завершается
  • DROP - выбросить молча; просмотр завершается не только для текущей цепочки, но и для других таблиц
  • REJECT - выбросить, известив отправителя (--reject-with тип-извещения )

3. Порядок следования сетевого пакета, предназначенного локальному процессу/приложению:

Для локального приложения

Шаг Таблица Цепочка Примечание
1 Кабель (т.е. )
2 Входной
3 mangle PREROUTING Обычно используется для внесения изменений в заголовок пакета, например для установки битов TOS и пр.
4 nat PREROUTING Преобразование адресов (Destination Network Address Translation). Фильтрация пакетов здесь допускается только в исключительных случаях.
5 Принятие решения о маршрутизации.
6 mangle INPUT Пакет попадает в цепочку INPUT таблицы mangle. Здесь внесятся изменения в заголовок пакета перед тем как он будет передан локальному приложению.
7 filter INPUT Здесь производится фильтрация входящего трафика. Помните, что все входящие пакеты, адресованные нам, проходят через эту цепочку, независимо от того с какого интерфейса они поступили.
8 Локальный процесс/приложение (т.е., программа-сервер или программа-клиент)

Важно помнить, что на этот раз пакеты идут через цепочку INPUT, а не через FORWARD.

Порядок движения пакетов, созданных локальными процессами.

От локальных процессов

Шаг Таблица Цепочка Примечание
1 Локальный процесс (т.е., программа-сервер или программа-клиент).
2 Принятие решения о маршрутизации. Здесь решается куда пойдет пакет дальше -- на какой адрес, через какой сетевой интерфейс и пр.
3 mangle OUTPUT Здесь производится внесение изменений в заголовок пакета. Выполнение фильтрации в этой цепочке может иметь негативные последствия.
4 nat OUTPUT Эта цепочка используется для трансляции сетевых адресов (NAT) в пакетах, исходящих от локальных процессов брандмауэра.
5 Filter OUTPUT Здесь фильтруется исходящий траффик.
6 mangle POSTROUTING Цепочка POSTROUTING таблицы mangle в основном используется для правил, которые должны вносить изменения в заголовок пакета перед тем, как он покинет брандмауэр, но уже после принятия решения о маршрутизации. В эту цепочку попадают все пакеты, как транзитные, так и созданные локальными процессами брандмауэра.
7 nat POSTROUTING Здесь выполняется Source Network Address Translation. Не следует в этой цепочке производить фильтрацию пакетов во избежание нежелательных побочных эффектов. Однако и здесь можно останавливать пакеты, применяя политику по-умолчанию DROP.
8 Сетевой интерфейс (например, eth0)
9 Кабель (т.е., Internet)

Порядок движения транзитных пакетов

Шаг Таблица Цепочка Примечание
1 Кабель (т.е. Интернет)
2 Сетевой интерфейс (например, eth0)
3 mangle PREROUTING Обычно эта цепочка используется для внесения изменений в заголовок пакета, например для изменения битов TOS и пр..
4 nat PREROUTING Эта цепочка используется для трансляции сетевых адресов (Destination Network Address Translation). Source Network Address Translation выполняется позднее, в другой цепочке. Любого рода фильтрация в этой цепочке может производиться только в исключительных случаях
5 Принятие решения о дальнейшей маршрутизации, т.е. в этой точке решается куда пойдет пакет -- локальному приложению или на другой узел сети.
6 mangle FORWARD Далее пакет попадает в цепочку FORWARD таблицы mangle, которая должна использоваться только в исключительных случаях, когда необходимо внести некоторые изменения в заголовок пакета между двумя точками принятия решения о маршрутизации.
7 Filter FORWARD В цепочку FORWARD попадают только те пакеты, которые идут на другой хост Вся фильтрация транзитного трафика должна выполняться здесь. Не забывайте, что через эту цепочку проходит траффик в обоих направлениях, обязательно учитывайте это обстоятельство при написании правил фильтрации.
8 mangle POSTROUTING Эта цепочка предназначена для внесения изменений в заголовок пакета уже после того как принято последнее решение о маршрутизации.
9 nat POSTROUTING Эта цепочка предназначена в первую очередь для Source Network Address Translation. Не используйте ее для фильтрации без особой на то необходимости. Здесь же выполняется и маскарадинг (Masquerading).
10 Выходной сетевой интерфейс (например, eth1).
11 Кабель (пусть будет LAN).

Есть три различных варианта прохождения пакетов.

1. Из вне на локальную службу (сервер) этого компьютера (INPUT).

2. От локальной службы (сервера) этого компьютера во вне (OUTPUT).

3. Прохождение мимо, шлюзование, мимо этого сетевого интерфейса этого компьютера (FORWARD).

4. Несколько примеров настройки:

пример скрипта:

#задаем переменные для обозначения внешнего и внутреннего сетевого интерфейса

LOCAL_IF="eth0"
INET_IF="eth0:g"

#=======================
# Удалить все правила из цепочки.
#=======================
iptables -F
iptables -X

#=======================
# Устанавливаем политику по умолчанию.
#=======================

iptables -P INPUT DROP

iptables -P OUTPUT DROP

iptables -P FORWARD ACCEPT

#=======================
# Создаем правила для всех интерфейсов.
#=======================

# http - открываем 80 порт
iptables -A INPUT -i ALL -p tcp -m tcp --dport 80 -j ACCEPT
iptables -A INPUT -i ALL -p icmp -j ACCEPT

#=======================
# Создаем правила для внутреннего интерфейса.
#=======================

# ssh - открываем 22

iptables -A INPUT -p tcp -i $LOCAL_IF -m tcp --dport 22 -j ACCEPT

осталось запустить скрипт

примеры отдельных цепочек:

Разрешаем все на внутренних интерфейсах (lo, eth0, eth1 - внутренние интрефейсы)
iptables -A INPUT -i eth1 -j ACCEPT
iptables -A INPUT -i eth0 -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT

Разрешаем доступ к заданному порту из инета
iptables -A INPUT -p tcp -m tcp -d внешний_ip --dport 80 -j ACCEPT

Открываем протокол
iptables -A INPUT -p gre -j ACCEPT

5. Ссылки на документацию по настройке iptables

http://www.posix.ru/network/iptables/ -статья Дмитрия Кулакова "Настройка межсетевого экрана Iptables"

http://www.opennet.ru/docs/RUS/iptables/ - статья Оскара Андерсона в переводе Андрея Киселева "Руководство по iptables"

http://system-administrators.info/?p=396 - статья "netfilter и iptables в Linux: принципы работы, настройка"

http://www.iptables.ru/ - пошаговое конфигурирование iptables. технической поддержки


Оставьте свой комментарий!


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

Порядок следования пакета

Шаг Таблица Цепочка Примечание
1 Кабель (т.е. Интернет)
2
3 mangle PREROUTING Обычно эта цепочка используется для внесения изменений в заголовок пакета, например для изменения битов TOS и пр..
4 nat PREROUTING Эта цепочка используется для трансляции сетевых адресов (Destination Network Address Translation ). выполняется позднее, в другой цепочке. Любого рода фильтрация в этой цепочке может производиться только в исключительных случаях
5 Принятие решения о дальнейшей маршрутизации, т.е. в этой точке решается куда пойдет пакет -- локальному приложению или на другой узел сети.
6 mangle FORWARD Далее пакет попадает в цепочку FORWARD таблицы mangle, которая должна использоваться только в исключительных случаях, когда необходимо внести некоторые изменения в заголовок пакета между двумя точками принятия решения о маршрутизации.
7 Filter FORWARD В цепочку FORWARD попадают только те пакеты, которые идут на другой хост Вся фильтрация транзитного трафика должна выполняться здесь. Не забывайте, что через эту цепочку проходит траффик в обоих направлениях, обязательно учитывайте это обстоятельство при написании правил фильтрации.
8 mangle POSTROUTING Эта цепочка предназначена для внесения изменений в заголовок пакета уже после того как принято последнее решение о маршрутизации.
9 nat POSTROUTING Эта цепочка предназначена в первую очередь для Source Network Address Translation . Не используйте ее для фильтрации без особой на то необходимости. Здесь же выполняется и маскарадинг (Masquerading).
10 Выходной сетевой интерфейс (например, eth1).
11 Кабель (пусть будет LAN).

Как вы можете видеть, пакет проходит несколько этапов, прежде чем он будет передан далее. На каждом из них пакет может быть остановлен, будь то цепочка iptables или что либо еще, но нас главным образом интересует iptables . Заметьте, что нет каких либо цепочек, специфичных для отдельных интерфейсов или чего либо подобного. Цепочку FORWARD проходят ВСЕ пакеты, которые движутся через наш брандмауэр/ роутер. Не используйте цепочку INPUT для фильтрации транзитных пакетов, они туда просто не попадают! Через эту цепочку движутся только те пакеты, которые предназначены данному хосту!

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

Таблица 3-2. Для локального приложения

Шаг Таблица Цепочка Примечание
1 Кабель (т.е. Интернет)
2 Входной сетевой интерфейс (например, eth0)
3 mangle PREROUTING Обычно используется для внесения изменений в заголовок пакета, например для установки битов TOS и пр.
4 nat PREROUTING Преобразование адресов (Destination Network Address Translation ). Фильтрация пакетов здесь допускается только в исключительных случаях.
5 Принятие решения о маршрутизации.
6 mangle INPUT Пакет попадает в цепочку INPUT таблицы mangle. Здесь внесятся изменения в заголовок пакета перед тем как он будет передан локальному приложению.
7 filter INPUT Здесь производится фильтрация входящего трафика. Помните, что все входящие пакеты, адресованные нам, проходят через эту цепочку, независимо от того с какого интерфейса они поступили.
8 Локальный процесс/приложение (т.е., программа-сервер или программа-клиент)

Важно помнить, что на этот раз пакеты идут через цепочку INPUT , а не через FORWARD .

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

Таблица От локальных процессов

Шаг Таблица Цепочка Примечание
1 Локальный процесс (т.е., программа-сервер или программа-клиент).
2 Принятие решения о маршрутизации. Здесь решается куда пойдет пакет дальше -- на какой адрес, через какой сетевой интерфейс и пр.
3 mangle OUTPUT Здесь производится внесение изменений в заголовок пакета. Выполнение фильтрации в этой цепочке может иметь негативные последствия.
4 nat OUTPUT Эта цепочка используется для трансляции сетевых адресов (NAT) в пакетах, исходящих от локальных процессов брандмауэра.
5 Filter OUTPUT Здесь фильтруется исходящий траффик.
6 mangle POSTROUTING Цепочка POSTROUTING таблицы mangle в основном используется для правил, которые должны вносить изменения в заголовок пакета перед тем, как он покинет брандмауэр, но уже после принятия решения о маршрутизации. В эту цепочку попадают все пакеты, как транзитные, так и созданные локальными процессами брандмауэра.
7 nat POSTROUTING Здесь выполняется Source Network Address Translation . Не следует в этой цепочке производить фильтрацию пакетов во избежание нежелательных побочных эффектов. Однако и здесь можно останавливать пакеты, применяя политику по-умолчанию DROP .
8 Сетевой интерфейс (например, eth0)
9 Кабель (т.е., Internet)

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

Таблица Mangle

Эта таблица предназначена, главным образом для внесения изменений в заголовки пакетов (mangle - искажать, изменять. прим. перев.). Т.е. в этой таблице вы можете устанавливать биты TOS (Type Of Service) и т.д. Еще раз напоминаю вам, что в этой таблице не следует производить любого рода фильтрацию, маскировку или преобразование адресов (DNAT, SNAT, MASQUERADE ).
В этой таблице допускается выполнять только нижеперечисленные действия:
  • MARK

    Действие TOS выполняет установку битов поля Type of Service в пакете. Это поле используется для назначения сетевой политики обслуживания пакета, т.е. задает желаемый вариант маршрутизации.
    Действие TTL используется для установки значения поля TTL (Time To Live) пакета. Мы можем присваивать определенное значение этому полю, чтобы скрыть наш брандмауэр от чересчур любопытных провайдеров (Internet Service Providers).
    Действие MARK устанавливает специальную метку на пакет, которая затем может быть проверена другими правилами в iptables или другими программами, например iproute2. С помощью "меток" можно управлять маршрутизацией пакетов, ограничивать траффик и т.п.

    Таблица Nat

    Эта таблица используется для выполнения преобразований сетевых адресов NAT (Network Address Translation). Как уже упоминалось ранее, только первый пакет из потока проходит через цепочки этой таблицы, трансляция адресов или маскировка применяются ко всем последующим пакетам в потоке автоматически. Для этой таблицы характерны действия:
  • MASQUERADE

    Действие DNAT (Destination Network Address Translation) производит преобразование адресов назначения в заголовках пакетов. Другими словами, этим действием производится перенаправление пакетов на другие адреса, отличные от указанных в заголовках пакетов.

    SNAT (Source Network Address Translation) используется для изменения исходных адресов пакетов. С помощью этого действия можно скрыть структуру локальной сети, а заодно и разделить единственный внешний IP адрес между компьютерами локальной сети для выхода в Интернет. В этом случае брандмауэр, с помощью SNAT, автоматически производит прямое и обратное преобразование адресов, тем самым давая возможность выполнять подключение к серверам в Интернете с компьютеров в локальной сети.

    Маскировка (MASQUERADE) применяется в тех же целях, что и SNAT, но в отличие от последней, MASQUERADE дает более сильную нагрузку на систему. Происходит это потому, что каждый раз, когда требуется выполнение этого действия - производится запрос IP адреса для указанного в действии сетевого интерфейса, в то время как для SNAT IP адрес указывается непосредственно. Однако, благодаря такому отличию, MASQUERADE может работать в случаях с динамическим IP адресом, т.е. когда вы подключаетесь к Интернет, скажем через PPP, SLIP или DHCP.

    Таблица Filter

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

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

    Каждое правило -- это строка, содержащая в себе критерии определяющие, подпадает ли пакет под заданное правило, и действие, которое необходимо выполнить в случае выполнения критерия. В общем виде правила записываются примерно так:
    iptables [-t table] command

    Команды

    Команда -A , --append
    iptables -A INPUT ...
    Добавляет новое правило в конец заданной цепочки.
    Команда -D , --delete
    iptables -D INPUT --dport 80 -j DROP , iptables -D INPUT 1
    Удаление правила из цепочки. Команда имеет два формата записи, первый - когда задается критерий сравнения с опцией -D (см. первый пример), второй - порядковый номер правила. Если задается критерий сравнения, то удаляется правило, которое имеет в себе этот критерий, если задается номер правила, то будет удалено правило с заданным номером. Счет правил в цепочках начинается с 1.
    Команда -R , --replace
    iptables -R INPUT 1 -s 192.168.0.1 -j DROP
    Эта команда заменяет одно правило другим. В основном она используется во время отладки новых правил.
    Команда -I , --insert
    iptables -I INPUT 1 --dport 80 -j ACCEPT
    Вставляет новое правило в цепочку. Число, следующее за именем цепочки указывает номер правила, перед которым нужно вставить новое правило, другими словами число задает номер для вставляемого правила. В примере выше, указывается, что данное правило должно быть 1-м в цепочке INPUT .
    Команда -L , --list
    iptables -L INPUT
    Вывод списка правил в заданной цепочке, в данном примере предполагается вывод правил из цепочки INPUT . Если имя цепочки не указывается, то выводится список правил для всех цепочек. Формат вывода зависит от наличия дополнительных ключей в команде, например -n , -v , и пр.
    Команда -F , --flush
    iptables -F INPUT
    Сброс (удаление) всех правил из заданной цепочки (таблицы). Если имя цепочки и таблицы не указывается, то удаляются все правила, во всех цепочках. (если не указана таблица ключом -t (--table) , то очистка цепочек производится только в таблице filter)
    Команда -Z , --zero
    iptables -Z INPUT
    Обнуление всех счетчиков в заданной цепочке. Если имя цепочки не указывается, то подразумеваются все цепочки. При использовании ключа -v совместно с командой -L , на вывод будут поданы и состояния счетчиков пакетов, попавших под действие каждого правила. Допускается совместное использование команд -L и -Z . В этом случае будет выдан сначала список правил со счетчиками, а затем произойдет обнуление счетчиков.
    Команда -N , --new-chain
    iptables -N allowed
    Создается новая цепочка с заданным именем в заданной таблице В выше приведенном примере создается новая цепочка с именем allowed . Имя цепочки должно быть уникальным и не должно совпадать с зарезервированными именами цепочек и действий (такими как DROP , REJECT и т.п.)
    Команда -X , --delete-chain
    iptables -X allowed
    Удаление заданной цепочки из заданной таблицы. Удаляемая цепочка не должна иметь правил и не должно быть ссылок из других цепочек на удаляемую цепочку. Если имя цепочки не указано, то будут удалены все цепочки заданной таблице кроме встроенных.
    Команда -P , --policy
    iptables -P INPUT DROP
    Задает политику по-умолчанию для заданной цепочки. Политика по-умолчанию определяет действие, применяемое к пакетам не попавшим под действие ни одного из правил в цепочке. В качестве политики по умолчанию допускается использовать DROP и ACCEPT .
    Команда -E , --rename-chain
    iptables -E allowed disallowed
    Команда -E выполняет переименование пользовательской цепочки. В примере цепочка allowed будет переименована в цепочку disallowed . Эти переименования не изменяют порядок работы, а носят только косметический характер.

    Команда должна быть указана всегда. Список доступных команд можно просмотреть с помощью команды iptables -h (iptables --help ). Некоторые команды могут использоваться совместно с дополнительными ключами. Ниже приводится список дополнительных ключей и описывается результат их действия. При этом заметьте, что здесь не приводится дополнительных ключей, которые используются при построении критериев (matches) или действий (targets). Эти опции мы будем обсуждать далее.

    Таблица 6-3. Дополнительные ключи

    Ключ -v , --verbose
    Используется c: --list , --append , --insert , --delete , --replace
    Используется для повышения информативности вывода и, как правило, используется совместно с командой --list . Для того, чтобы заставить команду --list выводить полное число (без употребления множителей) требуется применять ключ -x , который описан ниже. Если ключ -v , --verbose используется с командами --append , --insert , --delete или --replace , то будет выведен подробный отчет о произведенной операции.
    Ключ -x , --exact
    Используется c: --list
    Для всех чисел в выходных данных выводятся их точные значения без округления и без использования множителей K, M, G.
    Ключ -n , --numeric
    Используется c: --list
    Заставляет iptables выводить IP-адреса и номера портов в числовом виде предотвращая попытки преобразовать их в символические имена.
    Ключ --line-numbers
    Используется c: --list
    Ключ --line-numbers включает режим вывода номеров строк при отображении списка правил командой --list . Номер строки соответствует позиции правила в цепочке.
    Ключ -c , --set-counters
    Используется c: --insert , --append , --replace
    Этот ключ используется для установки начального значения счетчиков пакетов и байт в заданное значение при создании нового правила. Например, ключ --set-counters 20 4000 установит счетчик пакетов = 20, а счетчик байт в 4000.
    Ключ --modprobe
    Используется c: Все
    Ключ --modprobe определяет команду загрузки модуля ядра. Данный ключ может использоваться в случае, когда модули ядра находится вне пути поиска (search path)

    Критерии

    Здесь мы подробнее остановимся на критериях выделения пакетов.
    Общие критерии могут использоваться в любых правилах;
    TCP критерии TCP пакетам.
    UDP критерии которые применяются только к UDP пакетам.
    ICMP критерии для работы с ICMP пакетами.

    Общие критерии

    Их допустимо употреблять в любых правилах, они не зависят от типа протокола и не требуют подгрузки модулей расширения. К этой группе я умышленно отнес критерий --protocol несмотря на то, что он используется в некоторых специфичных от протокола расширениях. Например, мы решили использовать TCP критерий , тогда нам необходимо будет использовать и критерий --protocol которому в качестве дополнительного ключа передается название протокола -- TCP. Однако критерий --protocol сам по себе является критерием, который используется для указания типа протокола.

    Таблица 6-4. Общие критерии

    Критерий -p , --protocol
    iptables -A INPUT -p tcp
    Этот критерий используется для указания типа протокола. Примерами протоколов могут быть TCP , UDP и ICMP . Прежде всего, в качестве имени протокола в данный критерий можно передавать один из трех вышеупомянутых протоколов, а также ключевое слово ALL. В качестве протокола допускается передавать число - номер протокола, так например, протоколу ICMP соответствует число 1, TCP -- 6 и UDP -- 17. Соответствия между номерами протоколов и их именами вы можете посмотреть в файле /etc/protocols , который уже упоминался. Если данному критерию передается числовое значение 0, то это эквивалентно использованию спецификатора ALL, который подразумевается по умолчанию, когда критерий --protocol не используется. Для логической инверсии критерия, перед именем протокола (списком протоколов) используется символ ! , например --protocol ! tcp подразумевает пакеты протоколов, UDP и ICMP .
    Критерий -s , --src , --source
    iptables -A INPUT -s 192.168.1.1
    IP-адрес(а) источника пакета. Адрес источника может указываться так, как показано в примере, тогда подразумевается единственный IP-адрес. А можно указать адрес в виде address/mask, например как 192.168.0.0/255.255.255.0 , или более современным способом 192.168.0.0/24 , т.е. фактически определяя диапазон адресов Как и ранее, символ!, установленный перед адресом, означает логическое отрицание, т.е. --source ! 192.168.0.0/24 означает любой адрес кроме адресов 192.168.0.x .
    Критерий -d , --dst , --destination
    iptables -A INPUT -d 192.168.1.1
    IP-адрес(а) получателя. Имеет синтаксис схожий с критерием --source , за исключением того, что подразумевает адрес места назначения. Точно так же может определять как единственный IP-адрес, так и диапазон адресов. Символ! используется для логической инверсии критерия.
    Критерий -i , --in-interface
    iptables -A INPUT -i eth0
    Интерфейс, с которого был получен пакет. Использование этого критерия допускается только в цепочках INPUT , FORWARD и PREROUTING , в любых других случаях будет вызывать сообщение об ошибке. При отсутствии этого критерия предполагается любой интерфейс, что равносильно использованию критерия -i + + -i PPP+ обозначает любой PPP интерфейс, а запись -i ! eth+ -- любой интерфейс, кроме любого eth.
    Критерий -o , --out-interface
    iptables -A FORWARD -o eth0
    Задает имя выходного интерфейса. Этот критерий допускается использовать только в цепочках OUTPUT , FORWARD и POSTROUTING , в противном случае будет генерироваться сообщение об ошибке. При отсутствии этого критерия предполагается любой интерфейс, что равносильно использованию критерия -o + . Как и прежде, символ! инвертирует результат совпадения. Если имя интерфейса завершается символом + , то критерий задает все интерфейсы, начинающиеся с заданной строки, например -o eth+ обозначает любой eth интерфейс, а запись -o ! eth+ - любой интерфейс, кроме любого eth.
    Критерий -f , --fragment
    iptables -A INPUT -f
    Правило распространяется на все фрагменты фрагментированного пакета, кроме первого, сделано это потому, что нет возможности определить исходящий/входящий порт для фрагмента пакета, а для ICMP-пакетов определить их тип. С помощью фрагментированных пакетов могут производиться атаки на ваш брандмауэр, так как фрагменты пакетов могут не отлавливаться другими правилами. Как и раньше, допускается использования символа! для инверсии результата сравнения. только в данном случае символ! должен предшествовать критерию -f , например ! -f . Инверсия критерия трактуется как "все первые фрагменты фрагментированных пакетов и/или нефрагментированные пакеты, но не вторые и последующие фрагменты фрагментированных пакетов".

    Неявные критерии

    В этом разделе мы рассмотрим неявные критерии , точнее, те критерии, которые подгружаются неявно и становятся доступны, например при указании критерия --protocol tcp . На сегодняшний день существует три автоматически подгружаемых расширения, это TCP критерии , UDP критерии и ICMP критерии (при построении своих правил я столкнулся с необходимостью явного указания ключа -m tcp , т.е. о неявности здесь говорить не приходится, поэтому будьте внимательнее при построении своих правил, если что-то не идет -- пробуйте явно указывать необходимое расширение. прим. перев .) . Загрузка этих расширений может производиться и явным образом с помощью ключа -m, -match, например -m tcp.

    TCP критерии

    Этот набор критериев зависит от типа протокола и работает только с TCP пакетами. Чтобы использовать их, вам потребуется в правилах указывать тип протокола --protocol tcp . Важно: критерий --protocol tcp обязательно должен стоять перед специфичным критерием. Эти расширения загружаются автоматически как для tcp протокола, так и для udp и icmp протоколов. (О неявной загрузке расширений я уже упоминал выше прим. перев. ) .

    Таблица 6-5. TCP критерии

    Критерий --sport , --source-port
    iptables -A INPUT -p tcp --sport 22
    Исходный порт, с которого был отправлен пакет. В качестве параметра может указываться номер порта или название сетевой службы. Соответствие имен сервисов и номеров портов вы сможете найти в файле /etc/services. При указании номеров портов правила отрабатывают несколько быстрее. однако это менее удобно при разборе листингов скриптов. Номера портов могут задаваться в виде интервала из минимального и максимального номеров, например --source-port 22:80 . Если опускается минимальный порт, т.е. --source-port:80 , то в качестве начала диапазона принимается число 0. Если опускается максимальный порт, т.е. --source-port 22: , то в качестве конца диапазона принимается число 65535. Как и раньше, символ ! используется для инверсии. Так критерий --source-port ! 22 , или --source-port ! 22:80 .
    Критерий --dport , --destination-port
    iptables -A INPUT -p tcp --dport 22
    Порт или диапазон портов, на который адресован пакет. Аргументы задаются в том же формате, что и для --source-port .
    Критерий --tcp-flags
    iptables -p tcp --tcp-flags SYN,FIN,ACK SYN
    Определяет маску и флаги tcp-пакета. Пакет считается удовлетворяющим критерию, если из перечисленных флагов в первом списке в единичное состояние установлены флаги из второго списка. Так для вышеуказанного примера под критерий подпадают пакеты у которых флаг SYN установлен, а флаги FIN и ACK сброшены. В качестве аргументов критерия могут выступать флаги SYN, ACK, FIN, RST, URG, PSH , а так же зарезервированные идентификаторы ALL и NONE . ALL -- значит ВСЕ флаги и NONE - НИ ОДИН флаг. Так, критерий --tcp-flags ALL NONE означает -- "все флаги в пакете должны быть сброшены" . Как и ранее, символ ! означает инверсию критерия Важно: имена флагов в каждом списке должны разделяться запятыми, пробелы служат для разделения списков.
    Критерий --syn
    iptables -p tcp --syn
    Критерий --syn является по сути реликтом, перекочевавшим из ipchains. Критерию соответствуют пакеты с установленным флагом SYN и сброшенными флагами ACK и FIN . Этот критерий аналогичен критерию --tcp-flags SYN,ACK,FIN SYN . Такие пакеты используются для открытия соединения TCP . Заблокировав такие пакеты, вы надежно заблокируете все входящие запросы на соединение, однако этот критерий не способен заблокировать исходящие запросы на соединение. Как и ранее, допускается инвертирование критерия символом ! . Так критерий ! --syn означает -- "все пакеты, не являющиеся запросом на соединение" , т.е. все пакеты с установленными флагами FIN или ACK .
    Критерий --tcp-option
    iptables -p tcp --tcp-option 16
    Удовлетворяющим условию данного критерия будет будет считаться пакет, TCP параметр которого равен заданному числу. TCP Option - это часть заголовка пакета. Она состоит из 3 различных полей. Первое 8-ми битовое поле содержит информацию об опциях, используемых в данном соединении. Второе 8-ми битовое поле содержит длину поля опций. Если следовать стандартам до конца, то следовало бы реализовать обработку всех возможных вариантов, однако, вместо этого мы можем проверить первое поле и в случае, если там указана неподдерживаемая нашим брандмауэром опция, то просто перешагнуть через третье поле (длина которого содержится во втором поле). Пакет, который не будет иметь полного TCP заголовка, будет сброшен автоматически при попытке изучения его TCP параметра. Как и ранее, допускается использование флага инверсии условия ! .

    UDP критерии

    Эти расширения подгружаются автоматически при указании типа протокола --protocol udp . Важно отметить, что пакеты UDP не ориентированы на установленное соединение, и поэтому не имеют различных флагов которые дают возможность судить о предназначении датаграмм. Получение UDP пакетов не требует какого либо подтверждения со стороны получателя. Если они потеряны, то они просто потеряны (не вызывая передачу ICMP сообщения об ошибке). Это предполагает наличие значительно меньшего числа дополнительных критериев, в отличие от TCP пакетов. Важно: Хороший брандмауэр должен работать с пакетами любого типа, UDP или ICMP , которые считаются не ориентированными на соединение, так же хорошо как и с TCP пакетами. Об этом мы поговорим позднее, в следующих главах.

    Таблица 6-6. UDP критерии

    ICMP критерии

    Этот протокол используется, как правило, для передачи сообщений об ошибках и для управления соединением. Он не является подчиненным IP протоколу, но тесно с ним взаимодействует, поскольку помогает обрабатывать ошибочные ситуации. Заголовки ICMP пакетов очень похожи на IP заголовки, но имеют и отличия. Главное свойство этого протокола заключается в типе заголовка, который содержит информацию о том, что это за пакет. Например, когда мы пытаемся соединиться с недоступным хостом, то мы получим в ответ сообщение ICMP host unreachable . Полный список типов ICMP сообщений, вы можете посмотреть в приложении Типы ICMP . Существует только один специфичный критерий для ICMP пакетов. Это расширение загружается автоматически, когда мы указываем критерий --protocol icmp . Заметьте, что для проверки ICMP пакетов могут употребляться и общие критерии, поскольку известны и адрес источника и адрес назначения и пр.

    Таблица 6-7. ICMP критерии


    Продолжение: Действия и переходы