Редактирование: UNИX, весна 2009, 05 лекция (от 25 марта)

Материал из eSyr's wiki.

Перейти к: навигация, поиск

Внимание: Вы не представились системе. Ваш IP-адрес будет записан в историю изменений этой страницы.

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

Текущая версия Ваш текст
Строка 120: Строка 120:
практ. вся инф. почерпнута из iptables tutorial.
практ. вся инф. почерпнута из iptables tutorial.
- 
-
= Конспект Kda =
 
-
== Вступление ==
 
-
Георгий Курячий уехал на конференцию.
 
-
Сегодня рассказ про iptables.
 
- 
-
Возможно, кто-то по теме знает больше лектора.
 
-
Рассказ, что это такое и как работает.
 
-
Сегодня, скорее всего, не будет про MAC.
 
- 
-
== Что такое iptables? ==
 
-
До этого мы слушали про ipfw.
 
-
Это BSD, а в Linux все по-другому.
 
-
Точно так же, как и в BSD, фильтрацию можно разбить на несколько частей.
 
-
Фильтрация происходит в пространстве ядра, потому что в userspace это накладно.
 
-
Netfilter.
 
-
Iptables — одна из реализаций системы реализации в рамках netfilter.
 
-
Точно так же, как в ipfw есть divert socket, здесь есть возможность фильтрации в userspace.
 
- 
-
Нужно упомянуть, что есть некоторые возможности доступа к настройках стека TCP/IP и netfilter.
 
-
В userspace работают инструменты.
 
-
Основной — утилита iptables.
 
-
Помимо него, некоторые настройки выполняются в файловой системе
 
-
/proc/sys/net/ipv{4|6}
 
- 
-
== Уровни работы iptables ==
 
-
Фильтр второго уровня — IP.
 
-
Та база, которая работает, т.к. третий уровень достаточно стандартизован, все используют TCP или UDP,
 
-
появились и другие протоколы.
 
-
На третьем уровне тоже возможна работа.
 
-
Касательно других уровней все сложнее.
 
-
Мы можем узнать некоторые характеристики пакетов с первого уровня.
 
-
Как уже было ранее, iptables не фильтрует на первом уровне, для этого есть arptables, ebtables.
 
- 
-
Iptables работает в терминах пакетов ip.
 
-
Любое сообщение уровня приложений может быть по-разному разбито на пакеты,
 
-
получить целостную информацию iptables не может.
 
-
Есть расширения, ищущие подстроки в содержимом пакета, но это не та ниша, где нужно использовать iptables.
 
-
Нужно ставить прокси, понимающий конкретный протокол.
 
-
В то же время достаточно часто бывает, что некоторое взаимодействие по сети, и информацию получить кроме как с 4 уровня,
 
-
нельзя.
 
-
Одно соединение для команд управления, а данные по другому соединению.
 
-
Файрвол должен разобраться в ftp.
 
-
Иначе он должен пропускать все соединения, но среди них могут быть ненужные.
 
- 
-
== Connection tracking ==
 
-
Можно настроить фильтрацию без учета состояния соединения.
 
-
Каждый пакет оцениваем и принимаем решение.
 
-
Существует ряд случаев, когда этого недостаточно или это неэффективно.
 
-
Средства фильтрации есть в iptables.
 
-
Есть connection tracking.
 
- 
-
== Задачи ==
 
-
Какие еще задачи?
 
-
Были задачи фильтрации, перенаправления, изменения.
 
-
Про перенаправление опустим.
 
-
Это, скорее всего, тема следующей лекции.
 
-
Что касается изменения пакетов, то iptables может вносить изменения, связанные с маршрутизацией.
 
-
NAT.
 
- 
-
== Правила ==
 
-
Что такое iptables?
 
-
Так же, как и ipfw, вся логика фильтрации описывается с помощью набора правил.
 
-
Правило состоит из двух частей.
 
-
Первая часть — matching, а вторая часть — то, что делает правило, если сработало условие.
 
- 
-
=== Виды целей ===
 
-
Надо отметить, что цели двух видов.
 
-
Прекращающие обработку — например, пакет нужно отправить в /dev/null.
 
-
Часть правил не прекращает обработку.
 
-
Другой пример — нужно сохранить информацию о пакете для статистики.
 
- 
-
== Модульность ==
 
-
Файрвол модульный.
 
-
Базовая функциональность вынесена в подсистемы.
 
-
Они называются модули.
 
-
Достаточно часто, если мы хотим использовать некоторые условия или цели, необходимо сказать, что условия или цели относятся к модулю.
 
-
Правила объединяются в цепочки.
 
-
Цепочка — то, же что большая таблица в ipfw.
 
-
Но цепочек очень много.
 
-
Логика прохода пакетов по цепочке нетривиальна.
 
-
В частности, у нас может быть цепочка с переходом на другую цепочку.
 
-
Обрабатываем пакет и какую-то сложную проверку не хочется вставлять в общую таблицу.
 
-
Мы не поймем, если вставить 25 правил, где именно эта проверка.
 
-
В такой ситуации хорошо вынести часть проверок в отдельную цепочку и вызывать из основной.
 
-
Как в программировании функцию можно вызывать неоднократно, так и здесь
 
-
можно вызывать из разных мест.
 
- 
-
=== Рекурсия ===
 
-
iptables более линеен.
 
-
Было бы странно, если был бы разрешен рекурсивный вызов.
 
- 
-
== Работа файрвола ==
 
-
Работает стратегия first wins.
 
-
Если правило сработало и оно является завершающим, то правило применится.
 
-
Иначе будет применяться следующее правило.
 
-
Правила другой цепочки будут применяться последовательно.
 
-
Если обработка дошла до конца и ничего не произошло, то:
 
-
если цепочка вложенная, обработка вернется.
 
-
Если цепочка основная, то сработает политика по умолчанию.
 
-
Может быть выброс пакета, либо его разрешение.
 
- 
-
Либо может сработать какое-то из правил, либо вернется в родительскую цепочку.
 
-
Можно принудительно вернуться.
 
- 
-
== Разделение ==
 
-
Самое неприятное.
 
-
В iptables можно решать разные задачи.
 
-
И фильтрация, и изменение полей пакета, и трансляция адресов.
 
-
Эти задачи достаточно специфичны каждая сама по себе, и объединять в одну большую таблицу невыгодно с точки зрения
 
-
производительности.
 
-
Может быть, одно правило применяется только для входящих пакетов.
 
-
Зачем его применять для исходящих?
 
-
Можно просто поставить одно из условий.
 
-
Но держать одну большую таблицу правил может быть сильно накладно.
 
-
Эти задачи, по-хорошему, лучше разделить.
 
-
Отдельно описывать трансляцию, отдельно модификацию, отдельно фильтрации.
 
- 
-
=== Таблицы ===
 
-
Есть 4 таблицы.
 
-
Таблица filter, nat, mangle, raw.
 
-
Raw — она появилась не так давно и она достаточно специфична.
 
-
Пример будет позже.
 
-
Mangle — модификация, filter и nat — понятно.
 
-
Картинка есть на презентации.
 
-
В начале пакет существует в сети.
 
-
Он приходит на интерфейс и проходит различные цепочки.
 
-
Проходит Prerouting: raw, mangle, nat; routing.
 
-
Затем разветвление, потом пути сходятся.
 
- 
-
В документации сказано, что есть таблицы, в таблицах есть цепочки.
 
-
С одной стороны правильно, с другой стороны сильно путает.
 
-
Понять, что как, сложно.
 
- 
-
=== Понимание Георгия Курячего ===
 
-
Пакет проходит через цепочки разных таблиц, затем дальше.
 
-
Объединение вершин графа по цепочкам.
 
-
Есть одна проблема.
 
-
Если создаем руками цепочку, мы ее создаем в рамках таблицы.
 
-
В одну и ту же цепочку мы можем перейти как из Input, так и из Output.
 
-
Забывать про то, что цепочки сгруппированы по таблицам, нельзя.
 
-
Отказаться от этого не получается.
 
- 
-
== Условия ==
 
-
Можно задать в качестве условия протокол.
 
-
Можно использовать адрес, диапазон адресов источника, назначения.
 
-
Имена интерфейсов, с которых пришел пакет.
 
-
Имя выходного интерфейса неизвестно.
 
-
На многие условия в правилах могут быть наложены ограничения.
 
-
Не все и не всегда могут применяться.
 
- 
-
Для протоколов TCP, UDP можно указывать порт.
 
-
Для ICMP — тип.
 
-
Помимо этого, можно указывать не один порт.
 
-
Различные характеристики пакета — флаги и т.п.
 
- 
-
Есть целое семейство правил, условие с несколькими вариантами.
 
-
Нас могут интересовать пакеты, адресованные одному из наших адресов.
 
-
Или пакеты, адресованные на unicast/broadcast адрес.
 
- 
-
== Правила ==
 
-
=== Accept ===
 
-
Мы можем сказать, что это хороший пакет.
 
-
Фильтрация пакета.
 
-
=== Drop ===
 
-
Правило drop имеет смысл в таблице фильтров.
 
-
В других таблицах не факт, что оно сработает.
 
-
Сейчас как минимум есть ругание на то, что он делается не там.
 
- 
-
Передача пакета дальше процессу.
 
-
Передача дальше по цепочкам.
 
- 
-
=== Reject ===
 
-
Помимо выброса пакета, хорошим тоном считается сообщить тому, кто прислал пакет, что мы не хотим этот пакет видеть.
 
-
Для этого используется ICMP.
 
-
При помощи reject мы можем сказать host unreachable, network unreachable и пр.
 
-
Все три правила прерывают обработку.
 
- 
-
=== Log, Ulog ===
 
-
Log — информация.
 
-
Ulog — не только вывод информации о пакете с характеристиками, но и вывести первые n байт пакета.
 
-
Вывод в специальный сокет, который могут слушать userspace демоны.
 
-
Подсчет трафика.
 
-
Мониторинг.
 
-
При перекидывании пакетов целиком, не факт, что выведутся все пакеты.
 
- 
-
=== Trace ===
 
-
Есть замечательное правило Trace.
 
-
Можно использовать в raw.
 
-
Эта таблица выполняется в самом начале работы, до какой-то другой работы.
 
-
Пакет пришел из сети или из локального процесса.
 
-
Trace — проходя каждую цепочку, если сработало правило, будет записано в лог.
 
-
Если все пакеты, это плохо, а если определенные, то сможем увидеть, как что работает.
 
- 
-
=== Return ===
 
-
Возврат из вложенной цепочки.
 
- 
-
=== Mirror ===
 
-
Отправляет назад идентичный пакет.
 
-
В случае, если они обнаруживают, что кто-то сканирует ssh на серверах, они разворачивают трафик и сканирующий брутфорсит
 
-
сам себя.
 
-
Там другие механизмы.
 
-
В реальной жизни использовать не стоит.
 
-
Если будут ддосить, возникнет перегрузка.
 
- 
-
Еще одно — аналог divert socket.
 
-
Так же, как и в BSD, перехода нет.
 
- 
-
=== Connection tracking ===
 
-
iptables как stateless использовать неэффективно и сложно.
 
-
Простой пример — кто-то из нашей сети пытается подключиться к хосту.
 
-
Мы разрешаем какие-то подключения.
 
-
Мы можем сказать, что разрешаем ICMP наружу всегда.
 
-
Это нехорошо.
 
-
Можем разрешить типа destination host unreachable.
 
-
Есть еще некоторое количество ситуаций.
 
-
Разрешаем другие типы ICMP.
 
-
Разрешаем ото всех всегда, это нехорошо.
 
-
Нам нужен какой-то механизм, который бы позволял понять, что входящий пакет относится к нашему трафику.
 
-
Для этого используется connection tracking.
 
-
У любого пакета есть match state.
 
-
В случае нового соединения, про него ничего неизвестно.
 
-
Кто-то из нашей сети пытается подключиться.
 
- 
-
Когда пойдет пакет назад, как понять, что он относится к установленному соединению?
 
-
state established.
 
-
Когда приходит пакет, не относящийся к установленному соединению, но он не левый, а ожидаемый.
 
-
В iptables есть модуль, который умеет анализировать проходящие пакеты, если пакет ftp, там установление соединения,
 
-
то он извлекает информацию и заносит в таблицу информацию.
 
-
Если проходит пакет со state established или related, то его пропускаем.
 
-
Снижение нагрузки.
 
- 
-
=== «Ручки» ===
 
-
У каждого модуля есть свои ручки.
 
- 
-
При помощи параметров модуля ядра — еще одна ручка.
 
-
Соединения на 21 порт — ftp.
 
-
Если есть сервер не на 21 порту, то соединение не пройдет.
 
- 
-
Возможность узнать состояние пакета.
 
-
Возможность проверить, что данный проходящий пакет принадлежит к сессии, которая описана в таблице.
 
-
Для каждого протокола свои таблицы.
 
-
Может возникнуть необходимость, чтобы система не отслеживала какие-то пакеты.
 
-
Для UDP нет установления соединения.
 
-
Если нам приходит пакет, то мы можем предполагать, что это работает прикладной протокол UDP.
 
-
И он относится к тому, что мы отправили.
 
- 
-
== NOTRACK ==
 
-
Таблица raw для NOTRACK.
 
-
В таблице можем отключить учет пакета в системе connection tracking.
 
-
Что еще стоит упомянуть?
 
-
В самом начале произвести какие-то сложные сравнения пакета.
 
-
Если условие выполнено, то это пакет интересного нам типа.
 
-
Мы можем хотеть применять условия каждый раз.
 
-
Может быть проверка условий растянута на несколько правил.
 
-
Если не является тем-то, тем-то и тем-то, то он нам интересен.
 
-
Выделяем в одну цепочку.
 
- 
-
Берем и помечаем пакет каким-то числом.
 
-
В другой цепочке, в другой таблице при помощи connmark match проверить отметку.
 
- 
-
== Метка пакета ==
 
-
В ipfw пакет можно помечать несколькими тегами.
 
-
Здесь только один mark.
 
-
mark — 32 разряда.
 
-
Если нужно пометить пакет по двум характеристикам, два марка нельзя.
 
-
Но мы можем применять некоторую маску и сравнить результаты.
 
-
Для остальных пакетов хотим отслеживать изменения.
 
- 
-
== Управление ==
 
-
Самая главная утилита управления — iptables.
 
-
iptables [-t table]
 
-
Мы можем создать цепочку, применить политику, удалить, посмотреть список правил, добавить правило в цепочку.
 
-
См. презентацию.
 
-
Удаляются цепочки так же.
 
-
Если мы знаем номер правила в цепочке, можно удалить его по номеру.
 
-
Можем вставить в середину.
 
- 
-
Формат правила см. презентацию.
 
-
Пример конфигурации см. презентацию.
 
- 
-
В принципе, есть такой хитрый таргет, с помощью которого можем вставить правило в цепочку.
 
-
Что это даст?
 
-
Он только для того, чтобы в каком-то виде сохранять комментарии.
 
- 
-
Надо не забывать, что модули как iptables, так и connection tracking должны быть загружены.
 
-
Для ipv6 существует отдельный инструмент ip6tables.
 
-
Он использует единую инфраструктуру.
 
-
Что-то общее есть, но структура пакетов другая.
 
-
По тому, как с ним работать, он похож на iptables.
 
- 
-
Может быть еще что-то.
 
-
Есть еще немного времени.
 
- 
-
== TCPMSS ==
 
-
Есть target TCPMSS.
 
-
Вдруг спасет какое-то количество нервов.
 
-
Есть некоторый хост.
 
-
Он подключен к Интернет.
 
-
Есть сервер.
 
-
В случае, если мы скачиваем что-то маленькое, все хорошо.
 
-
Если большое, соединение устанавливается и висит.
 
- 
-
Это может быть связано с тем, что когда посылаем большие пакеты или приходят,
 
-
пакеты не доходят из-за того, что посередине маленький MTU.
 
-
Полтора килобайта, а посередине есть MTU 1300.
 
-
Большой пакет не пролезет.
 
-
Есть такой механизм, как фрагментация.
 
-
Но некоторые узлы не умеют выполнять фрагментацию.
 
-
Тупые, или считают, что не барское это дело.
 
- 
-
Понятно, что пакет не пройдет.
 
-
Вернется ICMP сообщение.
 
-
Есть аналог с большим пакетом.
 
-
Мы умные, и считаем, что все нужно пропускать.
 
-
Провайдер же не пропускает входящие ICMP пакеты, говорящие об уменьшении пакетов.
 
-
Есть поле MSS.
 
-
Maximum segment size.
 
- 
-
Та информация, которую запишем — информация об узле, которую будет посылать.
 
-
На роутере крайне желательно включать правило.
 
-
Для пакетов с флагами syn, rst можно задать поле, описывающее ширину канала.
 
-
С этим лектор сталкивался дважды.
 
- 
-
На этом все.
 
- 
-
== Литература ==
 
-
Информация почерпнута в основном из iptables tutorial.
 
-
Есть старый перевод, тем не менее, в основном актуальный.
 
-
Есть man iptables (8).
 
- 
-
== Завершение ==
 
-
В следующий раз будет Георгий Курячий, расскажет про NAT и еще что-нибудь.
 
- 
{{UNИX, весна 2009}}
{{UNИX, весна 2009}}
{{Lection-stub}}
{{Lection-stub}}

Пожалуйста, обратите внимание, что все ваши добавления могут быть отредактированы или удалены другими участниками. Если вы не хотите, чтобы кто-либо изменял ваши тексты, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого (см. eSyr's_wiki:Авторское право).
НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!

Личные инструменты
Разделы