Московский Государственный Институт Электроники и Математики
Методические указания к лабораторной работе № 3
Настройка сетевого фильтра Iptables
Москва 2009
1. Цель работы
Получить представление о настройке сетевых фильтров (файерволлов, брандмауэров) и освоить простейшие настройки Iptables.
2. Пакетный фильтр Iptables.
Файерволл: общий принцип фильтрации пакетов
Файерволл (межсетевой экран, брандмауэр) предназначен для фильтрации и обработки пакетов, проходящих через сеть. Когда пакет прибывает, файерволл анализирует заголовки пакета и принимает решение, “выбросить” пакет (DROP), принять пакет (ACCEPT, пакет может пройти дальше) или сделать с ним что-то еще более сложное.
Для того чтобы файерволл мог осуществить эту операцию, ему необходимо определить набор правил фильтрации. Решение о том, фильтровать ли с помощью межсетевого экрана конкретные протоколы и адреса, зависит от принятой в защищаемой сети политики безопасности. Файерволл представляет собой набор компонентов, настраиваемых для реализации выбранной политики безопасности.
В Linux файерволл является модулем ядра. Основной принцип манипуляции трафиком – типичный для файерволлов: просматриваются заголовки пакетов и решается их дальнейшая судьба. Интерфейсом для модификации правил, по которым файерволл обрабатывает пакеты, служит iptables.
Итак, пребывающий пакет проходит по цепочке правил. Каждое правило содержит условие и цель (действие). Если пакет удовлетворяет условию то он передается на цель, в противном случае к пакету применяется следующее правило в цепочке. Если пакет не удовлетворил ни одному из условий в цепочке, то к нему применяется действие по умолчанию (политика по умолчанию). Правила проходятся пакетом последовательно, то есть порядок добавления правил критичен.
Практически все правила можно привести к виду:
iptables - A ЦЕПОЧКА ПАРАМЕТРЫ_ПАКЕТА - j ДЕЙСТВИЕ
Цепочки собраны в три основные таблицы (при желании можно добавить свои):
- filter – таблица правил фильтрации трафика; nat - таблица трансляций сетевых адресов и номеров портов; mangle – таблица, используемая для модификации заголовков пакетов.
Порядок обработки пакета
Схематично обработку пакета можно изобразить следующим образом:
PACKET IN --->---PREROUTING---[ маршрутизация ]--->----FORWARD---->---POSTROUTING--->--- PACKET OUT
- mangle | - mangle - mangle
- nat (dst) | - filter - nat (src)
| |
| |
INPUT OUTPUT
- mangle - mangle
- filter - nat (dst)
| - filter
| |
`---->----[ приложение ]---->----'
Входящий пакет начинает обрабатываться брандмауэром с цепочки PREROUTING в таблице mangle. Затем он обрабатывается правилами цепочки PREROUTING таблицы nat. На этом этапе проверяется, не требуется ли модификация назначения пакета (DNAT). Важно сменить назначение сейчас, потому что маршрут пакета определяется сразу после того, как он покинет цепочку PREROUTING. После этого он будет отправлен на цепочку INPUT (если целью пакета является этот компьютер) или FORWARD (если его целью является другой компьютер в сети).
Если целью пакета является другой компьютер, то пакет фильтруется правилами цепочки FORWARD таблиц mangle и filter, а затем к нему применяются правила цепочки POSTROUTING. На данном этапе можно использовать SNAT/MASQUARADE (подмена источника/маскировка). После этих действий пакет (если выжил) будет отправлен в сеть
Если назначением пакета является сам компьютер с брандмауэром, то, после маршрутизации, он обрабатывается правилами цепочек INPUT таблиц mangle и filter. В случае прохождения цепочек пакет передается приложению.
Когда приложение, на машине с брандмауэром, отвечает на запрос или отправляет собственный пакет, то он обрабатывается цепочкой OUTPUT таблицы filter. Затем к нему применяются правила цепочки OUTPUT таблицы nat, для определения, требуется-ли использовать DNAT (модификация назначения), пакет фильтруется цепочкой OUTPUT таблицы filter и выпускается в цепочку POSTROUTING которая может использовать SNAT и QoS. В случае успешного прохождения POSTROUTING пакет выходит в сеть.
Таблица filter: фильтрация трафика
Если явно не сказано, в какую таблицу добавляется правило, оно добавляется в таблицу filter, отвечающую за фильтрацию пакетов.
Цепочки таблицы filter.
В таблице filter существует 3 цепочки: INPUT, OUTPUT и FORWARD. В каждой цепочки свой "тип" пакетов:
- INPUT – входящий трафик: пакеты, адресованные непосредственно данному хосту; FORWARD – транзитный трафик: пакеты, предназначенные для другого узла; OUTPUT – исходящий трафик: пакеты, отправленные данным узлом.
Работают с цепочками так:
iptables <опция> <цепочка>
Опции для работы с цепочками
- -A - добавление нового правила в цепочку. Правило будет добавлено в конец цепочки. -I - добавление правила не в конец, а туда куда вы укажите. Например, команда:
iptables - I INPUT 2 ПРАВИЛО
- сделает правило вторым.
- -D - удаление правила. Например для удаления пятого правила введите:
iptables - D INPUT 5
- -F - сброс всех правил цепочки. Нужно, например, при удалении ненужной цепочки. -N - создание пользовательской цепочки. Если не хотите создавать кашу в каждой цепочке, то создайте несколько дополнительных цепочек. Синтаксис такой: iptables - N ЦЕПОЧКА. Только русские буквы, конечно, использовать нельзя. -X - удаление пользовательской цепочки.
Удалить цепочки INPUT, OUTPUT и FORWARD нельзя.
- -P - установка политики для цепочки.
iptables - P ЦЕПОЧКА ПОЛИТИКА
Параметры фильтрации пакетов
1. Источник пакета;
Для фильтрации по источнику используется опция -s. Например запретим все входящие пакеты с узла 192.168.133.133:
iptables - A INPUT - s 192.168.133.133 - j DROP
Можно использовать доменное имя для указания адреса хоста. То есть:
iptables - A INPUT - s test. host. jp - j DROP
Также можно указать целую подсеть:
iptables - A INPUT - s 192.168.133.0/24 - j DROP
Также вы можете использовать отрицание (знак !). Например так - все пакеты с хостов отличных от 192.168.133.156 будут уничтожаться:
iptables - A INPUT - s ! 192.168.133.156 - j DROP
2. Адрес назначения;
Для этого нужно использовать опцию -d. Например запретим все исходящие пакеты на хост 192.168.156.156:
iptables - A OUTPUT - d 192.168.156.156 -j DROP
Как и в случае с источником пакета, можно использовать адреса подсети и доменные имена. Отрицание также работает.
3. Протокол;
Опция -p указывает на протокол. Можно использовать all, icmp, tcp, udp.
4. Порт источника;
Опция –sport указывает на порт, с которого был прислан пакет.
iptables - A INPUT - p tcp --sport 80 - j ACCEPT
Для указания порта необходимо указать протокол (tcp или udp). Можно использовать отрицание.
5. Порт назначения.
Опция –dport указывает на порт назначения пакета.
iptables - A INPUT - p tcp --dport 80 - j ACCEPT
Как и в случае с портом источника нужно указать протокол. Можно использовать отрицание.
Действия над пакетами (цели правил)
После указания параметров пакета необходимо указать, что именно надо с ним делать. Для этого служит опция -j. Рассмотрим основные действия:
- ACCEPT - разрешить пакет; DROP - уничтожить пакет; REJECT - будет отправлено ICMP сообщение, что порт недоступен; LOG - информация об этом пакете будет добавлена в системный журнал (syslog).
В качестве действия можно указать и имя пользовательской цепочки. Например, можно передать все пакеты с локальной сети в цепочку, где будет производиться дополнительная проверка:
iptables - A INPUT - s 192.168.200.0/24 - j LOCAL_NET
Модули
Использование модуляет существенно расширяет возможности Iptables. Для указания модуля используется опция -m. Например:
iptables - A INPUT - m модуль критерии
-m owner
Добавляет следующие опции (опции только для цепочки OUTPUT):
- --uid-owner UID - UID программы пославшей пакет. --gid-owner GID - GID прораммы пославшей пакет. --pid-owner PID - PID программы пославшей пакет. --sid-owner SID - SID (идентификатор сессии) производится проверка SID пакета, значение SID наследуются дочерними процессами от "родителя". --cmd-owner NAME - имя программы пославшей пакет.
-m multiport
Позволяет указывать не по одному порту, а сразу несколько:
- --source-ports порт1,порт2 - список портов, с которых пришел пакет; --sports порт1,порт2 - укороченый аналог --source-ports; --destination-ports порт1,порт2 - список портов назначения; --dports порт1,порт2 - укороченый аналог --destination-ports; --ports порт1,порт2 - проверяет как исходящий так и входящий порт пакета.
-m state
Предназначен для указания состояния пакета с помощью опции --state. Доступны следующие типы пакетов:
- NEW - пакет устанавливающий новое соединение. ESTABLISHED - пакет от уже установленного соединения. RELATED - новый пакет уже установленном соединении.
-m mac
Проверяет соответствие MAC-адреса в пакете с помощью опции --mac-source, например:
iptables - A INPUT - s 192.168.0.1 - m mac --mac-source 00:65:3F:ED:12:98 - j DROP
Таблица NAT: трансляция адресов и перенаправление портов
Правила таблицы nat используются для трансляции сетевых адресов и номеров портов. Эта таблица отличается от таблицы filter тем, что через цепочки nat проходит только первый пакет каждого соединения, а для остальных пакетов в данном соединении автоматически применяются выбранные операции преобразования адресов и номеров портов.
В контексте Linux функции NAT обычно разделяют на Source NAT (SNAT – изменение адреса отправителя в первом пакете) и Destination NAT (DNAT – изменение адреса получателя в первом пакете). Маскирование представляет собой частный случай трансляции Source NAT, а функции port forwarding (пересылка в другой порт) и transparent proxying (прозрачный proxy) являются частным случаем трансляции Destination NAT. Все эти функции реализуются в одном блоке NAT.
Действия над пакетами (цели правил)
- SNAT (Source Network Address Translation) – преобразует исходящий IP-адрес в заголовке пакета; используется, в частности, для предоставления выхода в Интернет другим компьютерам из локальной сети, имея лишь один уникальный IP адрес; допускается выполнять только в таблице nat, в цепочке POSTROUTING.
· DNAT (Destination Network Address Translation) - преобразует адрес места назначения в IP-заголовке пакета; используется, в частности, для предоставления доступа к сетевым службам, находящимся в локальной сети (проброс порта); DNAT может выполняться только в цепочках PREROUTING и OUTPUT таблицы nat, и во вложенных подцепочках.
· MASQUERADE – маскарадинг (маскирование) в основе своей представляет то же самое, что и SNAT только не имеет ключа --to-source; рекомендуется использовать для динамических подключений, для статических используется действие SNAT; MASQUERADE допускается указывать только в цепочке POSTROUTING таблицы nat, так же как и действие SNAT.
Маскарадинг подразумевает получение IP-адреса от заданного сетевого интерфейса, вместо прямого его указания, как это делается с помощью ключа --to-source в действии SNAT. Действие MASQUERADE имеет хорошее свойство - "забывать" соединения при остановке сетевого интерфейса. В случае же SNAT, в этой ситуации, в таблице трассировщика остаются данные о потерянных соединениях, и эти данные могут сохраняться до суток, поглощая ценную память.
Просмотр текущих правил Iptables
Для просмотра текущих правил используется команда:
Iptables - L
-L - определяет вывод статистики для цепочки (chain). Если конкретная цепочка не задана, то для всех.
iptables - t nat - L –vx
вывод статистики для цепочки nat
-v - задает расширенный вывод, включающий в себя счетчики пакетов и байт.
Часто добавляется параметр - n, который говорит команде iptables о том, что не надо обращаться к DNS для разрешения IP-адресов и вывода их в виде доменных имен. Это значительно уменьшает время на выдачу результатов и позволяет уменьшить нагрузку на сервер.
Для дополнительного удобства список правил может быть пронумерован. Для этого используется опция –line-numbers.
iptables - L - v --line-numbers
Сохранение и восстановление больших наборов правил
В состав пакета iptables входят две утилиты для работы с большими наборами правил: iptables-save и iptables-restore. Первая из них сохраняет, а вторая восстанавливает наборы правил в/из файла. По своему формату файл с набором правил похож на обычные файлы сценариев командной оболочки (shell).
iptables-save [-c] [-t table]
-c (--counters) - указание iptables-save сохранить значения счетчиков байт и пакетов; это делает возможным рестарт брандмауэра без потери счетчиков, которые могут использоваться для подсчета статистики. По-умолчанию, при запуске без ключа -с, сохранение счетчиков не производится;
-t (--table) можно указать имя таблицы для сохранения; при отсутствии ключа -t сохраняются все таблицы. з примера виден результат действия аргумента -c -- перед каждым правилом и в строке описания каждой цепочки имеются числа, отображающие содержимое счетчиков пакетов и байт.
Утилита iptables-save выдает набор правил на стандартный вывод, поэтому сохранить набор правил в файл можно следующим образом:
iptables-save - c > /etc/iptables-save
Эта команда запишет весь набор правил, вместе с содержимым счетчиков, в файл с именем /etc/iptables-save.
iptables-restore [-c] [-n]
-c (--counters) - указывает восстанавливать значения счетчиков;
-n (--noflush) - сообщает iptables-restore о том, что правила должны быть добавлены к имеющимся. По умолчанию iptables-restore очистит содержимое таблиц и цепочек перед загрузкой нового набора правил.
Для загрузки набора правил утилитой iptables-restore из файла можно использовать несколько вариантов. Наиболее часто употребимый:
cat /etc/iptables-save | iptables-restore - c
В результате выполнения этой команды содержимое файла /etc/iptables-save будет прочитано утилитой cat и перенаправленно на стандартный ввод утилиты iptables-restore. После исполнения этой команды набор правил должен загрузиться и все должно работать. Если это не так, то скорее всего вы допустили ошибку при наборе команды.
3. Примеры настройки Iptables
ВНИМАНИЕ! Команды Iptables чувствительны к регистру.
1. Включение простого перенаправления пакетов.
Первое, что необходимо сделать для того, чтобы хост с файерволлом вообще мог использоваться в качестве шлюза – это включить перенаправление пакетов через ядро. Для этого необходимо присвоить значение 1 системному параметру ip_forward.
echo 1 > /proc/sys/net/ipv4/ip_forward
2. Сброс правил и удаление имеющихся цепочек (пользовательских).
Iptables - F
Iptables –X
Удаление всех правил и всех цепочек.
iptables - F INPUT
iptables - F OUTPUT
iptables - F FORWARD
Удаление правил из конкретных цепочек.
3. Назначение политик по умолчанию.
iptables - P INPUT DROP
iptables - P FORWARD ACCEPT
iptables - P OUTPUT DROP
В данном примере назначена политика DROP для входящих и исходящих пакетов и политика ACCEPT – для транзитных. Это значит, что будут удаляться все пакеты, адресованные данному хосту и посылаемые им, кроме явно разрешённых.
4. Фильтрация трафика.
· Фильтрация пакетов по протоколу
iptables - A INPUT - i eth1 - p icmp - j ACCEPT
Разрешить прохождение входящих icmp-пакетов, полученных через интерфейс eth1.
· Фильтрация пакетов по состоянию соединения
iptables - A INPUT - p tcp - m state --state ESTABLISHED, RELATED - j ACCEPT
Разрешение прохождения входящих tcp-пакетов принадлежащих к уже установленным соединениям
iptables - A OUTPUT - p tcp - m state --state NEW, RELATED, ESTABLISHED - j ACCEPT
Разрешение прохождения исходящих пакетов принадлежащих к уже установленным tcp-соединениям, а так же пакетов создающих новые tcp-соедиения.
iptables - A INPUT - p udp - m state --state ESTABLISHED, RELATED - j ACCEPT
iptables -A OUTPUT - p udp - m state --state NEW, RELATED, ESTABLISHED - j ACCEPT
Аналогичные правила для UDP. Подобные правила необходимы для возможности работы DNS.
· Фильтрация пакетов по номеру порта (разрешение трафика определённых приложений)
iptables - A INPUT - p tcp --dport 80 - m state --state NEW - j ACCEPT
Разрешение прохождения входящих TCP-пакетов (инициирующих соединение), направленных 80 порту. Т. е. фактически разрешение обращения к локальному веб-серверу, расположенному на данном хосте-файерволле.
iptables - A FORWARD - p tcp --dport 80 - j ACCEPT
Разрешение прохождения транзитных TCP-пакетов, с портом назначения 80. Таким образом реализуется возможность использования данного хоста как шлюза для доступа в Интернет (через браузер).
iptables - A FORWARD - d 192.168.1.1 - p tcp --dport 3389 - j ACCEPT
Разрешение прохождения транзитных TCP-пакетов, с портом назначения 3389 (служба RDP), адресованных узлу 192.168.1.1.
ВНИМАНИЕ! Таким образом можно разрешить перенаправление пакетов, адресованных любым портам – то есть трафик разных приложений. Написав правило для порта 25, мы разрешим прохождения трафика протокола SMTP, т. е. электронной почты; 23 порт позволит обращаться через данный хост по telnet и т. п.
Для описания трафика можно использовать тип протокола, номер порта (источника и назначения), ip-адрес источника/места назначения пакета, а также дополнительные модули.
5. Настройка трансляции адреса источника (SNAT или MASQUERADE).
iptables -t nat - A POSTROUTING - s 192.168.0.0/24 - o eth0 - j MASQUERADE
Правило трансляции адреса источника для пакетов из сети 192.168.0.0: пакеты отправляются через интерфейс eth0 с заменой ip-адреса источника на ip-адрес интерфейса eth0.
iptables - t nat - A POSTROUTING - o eth0 - s 10.1.1.3 - j SNAT --to-source 213.247.189.210
Правило трансляции адреса источника для пакетов, отправленных хостом 10.1.1.3: пакеты отправляются через интерфейс eth0 с заменой Ip-адреса источника на 213.247.189.210.
6. Настройка проброса порта (port forwarding).
iptables - t nat - A PREROUTING - p tcp - d 213.247.189.210 --dport 4899 - j DNAT --to-destination 10.1.1.3:4899
Перенаправление пакетов, направленных на ip-адрес 213.247.189.210 - порт 4899 (служба radmin), на адрес 10.1.1.3 (порт тот же). Таким образом можно организовать доступ по radmin к серверу (10.1.1.3), расположенному в локальной сети через внешний адрес роутера (213.247.189.210).
Ссылки:
· http://www. *****/docs/RUS/iptables/ (Руководство по iptables (Iptables Tutorial 1.1.19);
· http://ru. /wiki/%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_iptables_%D0%B4%D0%BB%D1%8F_%D0%BD%D0%B0%D1%87%D0%B8%D0%BD%D0%B0%D1%8E%D1%89%D0%B8%D1%85 (Iptables для начинающих);
· http://*****/node/190 (Основы использования iptables);
· http://www. *****/base/net/iptables_treasures. txt. html (Расширенные возможности Iptables).
4. Задания
Задание 1. Разрешить перенаправление транзитных пакетов.
Результат:
Система может использоваться в качестве шлюза. При дефолтной политике“ACCEPT” для всех цепочек iptables любой трафик должен перенаправляться по назначению. При проверке будут протестированы запросы разных типов через данный хост.
Задание 2. Настроить трансляцию адресов источников всех проходящих через данный шлюз.
Результат:
Ip-адрес источника всех пакетов будет заменяться на ip-адрес шлюза.
Задание 3. Установить политику по умолчанию DROP для всех цепочек таблицы filter. Разрешить прохождение трафика, необходимого для отображения страниц через браузер.
Результат:
При включении политики DROP для всех цепочек, должен быть заблокирован любой сетевой трафик. После добавления определенных правил, должны отображаться Интернет-страницы через браузер, как с самого тестируемого хоста, так и с хостов, использующих его в качестве шлюза. Другой трафик должен остаться заблокированным.
Задание 4. Разрешить ICMP-запросы к данному хосту.
Результат:
Хост должен отвечать на ping. При этом транзитные icmp-запросы не должны проходить (пинговать через него ***** должно быть невозможно).
Задание 5.
Настроить перенаправление запросов, адресованных 80 порту данного хоста, на какой-нибудь реальный веб-сервер, например, ***** (можно взять любой).
Результат:
При обращении через браузер к данному хосту (с другого компьютера), должна отображаться страница, возвращаемая выбранным веб-сервером. При этом обращения к другим страницам должны работать корректно.
5. Контрольные вопросы
1) Понятия: фильтрация пакетов, файерволл (межсетевой экран, брандмауэр),
2) Соотношение фильтрации пакетов и маршрутизации (взаимозаменяемы ли эти понятия, в каком порядке происходят действия над пакетом, какие протоколы и приложения за что отвечают);
3) Iptables: цепочки и таблицы: назначение, функциональные особенности;
4) Iptables: политики;
5) NAT: принцип работы, разновидности.


