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

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

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

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

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

Текущая версия Ваш текст
Строка 137: Строка 137:
В след раз про check-state, nat и очереди.
В след раз про check-state, nat и очереди.
- 
- 
- 
-
'''Конспект Kda'''
 
- 
-
Рассказа про iptables не будет.
 
-
Рассказ будет про ipfw.
 
-
Даже не одна лекция, а несколько.
 
-
Очень многие понятия, присущие фарйволу вообще, проще рассматривать не на примере древовидных структур вроде iptables.
 
-
Некоторая специфика реализации внутри ipfw зашита глубоко, и очень долго кажется, что сделать можно все.
 
-
В случае iptables это не так.
 
- 
-
Чтобы было понятно, о чем идет речь.
 
-
Само название довольно старое, в том смысле, что функциональность была реализована еще во второй версии freebsd.
 
-
Он обладал некоторыми недостатками по сравнению с толстыми файрволами.
 
-
Был портирован другой вариант файрвола ipf.
 
-
В 2002 появились сразу два новых.
 
-
ipfw стал ipfw2.
 
-
Пакет ipfilter.
 
-
Если не считать других вещей вроде нетграфа, файрволов 3 штуки.
 
-
Каждый предполагал покрывать функциональность предыдущих.
 
-
Но ipfw2 тоже весьма развесистая штука.
 
- 
-
Файрвол имеет строгий список правил, которые применяются к пакету, проходящему через tcp/ip стек, причем сразу в нескольких местах.
 
-
Давайте нарисуем картинку.
 
-
В мане по ipfw эта картинка есть в аски-арте.
 
-
Есть два случая, когда нужно отрабатывать пакеты, исходящие и входящие.
 
-
Одни обрабатываются, когда пакет вошел, другие — перед выходом из интерфейса.
 
-
Приняли все решения относительно судьбы пакета.
 
- 
-
Есть входящий и исходящий поток — ip_in, ip_out.
 
-
Вполне возможно, что пакет пройдет на более высокий уровень (транспортный, прикладной).
 
-
С более высокими уровнями тоже возможно работать.
 
-
Существует еще ethernet уровень.
 
-
На вход eth_demix, на выход eth_outp.
 
-
Можно включить в ядре опцию bridge, тогда появится еще пятый элемент — собственно bridge.
 
-
Интерфейсный уровень работает обычно с bridge.
 
- 
-
В чем хитрость линейного файрвола?
 
-
На каждом этапе ставится обработка по всей очереди правил, которые сформулированы на этот счет.
 
-
Пакет проходит область и прощелкивается в соответствии с правилами файрвола.
 
- 
-
Общий формат правил достаточно сложный.
 
-
Правила линейчатые и программа немного похожа на программу на бейсике — есть номера строк.
 
-
Есть правило делать шаг 100 — в бейсике шаг 10, а в ipfw шаг 100.
 
-
При этом одно из правил всегда пробито — 65535, в зависимости от параметров компиляции файрвола.
 
-
Частая практика — перекомпиляция ядра с разными ключами.
 
-
Либо всех выпустить, либо всех впустить.
 
-
Список правил организован по принципу first wins.
 
-
Если правил нет, или ни одно не сработало, применяется общее правило — всех убить или всех пропустить.
 
- 
-
Примерный вид правила.
 
-
Номер, действие, тело.
 
-
Правило может выполнять различные действия.
 
-
Помимо фильтрации могут быть другие действия — например, пометка пакета.
 
-
Проверка внутренних таблиц.
 
-
С момента выполнения действия пакеты проверяются на таблицы.
 
-
Нельзя определить точно, что есть последняя часть.
 
-
Цепочка — действие и условие (ранее рассмотрено).
 
-
Тело нельзя называть условием, там много разного.
 
- 
-
Самое популярное действие — allow, drop, reject, fwd.
 
-
Что касается allow — тело будет условием.
 
-
Если при прохождении правил это было первое совпавшее, то пакет просто пропускается.
 
-
Если он модифицирован или что-то произошло, значит да.
 
-
Давайте посмотрим на drop и reject.
 
-
Что касается правила drop, то пакет, попавший под него, просто исчезает.
 
-
Чем это плохо?
 
-
Это плохо тем, что если мы честные люди, то пакет, который мы не хотим, чтобы он был доставлен, нужно ответить по
 
-
ICMP хотя бы unreachable.
 
-
Если пользователь запустил программу, ломящуюся по UDP, то если написано drop, то он не будет знать, что они не дошли
 
-
и завалит пакетами.
 
- 
-
Если же reject, то будет сгенерировано unreachable.
 
-
ICMP пакет будет отправлен отправителю.
 
-
Если мы защищаемся от атак, то ответов слать не нужно, потому что он плевать хотел на них, а кроме того,
 
-
они будут загружать нашу сеть.
 
- 
-
fwd.
 
-
На выходные пакеты.
 
-
Относительно них принято решение о маршрутизации.
 
-
fwd это решение меняет.
 
-
Оно меняет и пробивает next hop на тот, который мы напишем.
 
-
Если машина не настроена на прием пакетов с чужими ip, то она выбросит пакет.
 
-
Не обязательно пользоваться для этого более глубинными инструментами.
 
-
Пакет не модифицируется.
 
-
Это бывает нужно: висит демон, который все пакеты принимает и журнализирует.
 
- 
-
65535 deny ip from any to any
 
- 
-
Все, что после deny — тело.
 
-
Это правило выбрасывает все отовсюду.
 
- 
-
100 allow ip from any to any via lo0
 
- 
-
lo0 — loopback
 
- 
-
Если будем интересоваться, то в freebsd называются интерфейсы по драйверам, а не eth*.
 
-
Потом появилось переименование интерфейсов.
 
- 
-
Что делает правило?
 
-
Кто бы что не пытался пропустить через loopback, пускай шлет.
 
-
Есть пример, когда пришедшие пакеты на 127.0.0.1 человек режет.
 
-
Если пакет через loopback изнутри, нормально, а вот если снаружи (с нашим маком, но с таким ip — глупая хакерская атака).
 
- 
-
200 deny all from any to 127.0.0.0/8
 
- 
-
Это будет работать, потому что в нормальном режиме до 200 анализатор не дойдет.
 
-
Редирект ip нужно сделать так, чтобы принимающая машина нормально приняла пакет с чужим ip.
 
-
В принципе слово ip — синоним для all.
 
-
Можно написать ip4.
 
-
На уровне ipfw мы манипулируем такими пакетами.
 
-
Можно написать me — любой их моих адресов, loopback, адреса сетевых карт.
 
-
Если речь идет о манипуляции пакетами, то выбор не очень большой.
 
-
Пишем тип, откуда, куда, опционально флаги.
 
- 
-
NAT — в ipfw не было.
 
-
Как изначально был сделан NAT в FreeBSD.
 
-
NAT делался в userspace.
 
-
Divert socket.
 
-
К нему можно забиндиться, но если указать адрес, он проигнорируется.
 
-
{divert tee} <ropt>
 
-
Перенаправляем в сокет пришедший пакет.
 
-
IP-адрес в таком сокете игнорируется.
 
-
В userspace запущена программа, которая биндится к сокету, слушает его.
 
-
Читает командой receive.
 
-
Делает все, что хочет с полученными пакетами, как-то их обрабатывает.
 
-
С помощью стандартных команд пишет обратно.
 
- 
-
Возможно несколько правил с одним номером для атомарности — удаление всех правил с одним номером.
 
-
Правила под одним номером идут в нужном порядке в таблице.
 
-
Можно делать что угодно с пакетами, не заморачиваясь написанием ядерного модуля.
 
-
Ядерный модуль писать сложнее userspace программы.
 
-
Если не забинден сокет, пакет исчезает, ничего плохого не происходит.
 
-
Мы записали в сокет, файрволинг идет своим чередом.
 
-
Программа прочухивается, пишет обратно.
 
-
Пакет возникает.
 
-
divert — пакет уйдет и удалится, а если tee — пойдет в обе стороны.
 
-
Может быть журнализатор на стороне сокета, а пакет будет обрабатываться дальше.
 
-
natd — догадайтесь, что он делает.
 
-
Слушает сокеты, вынимает пакеты, умеет все, что должен делать nat.
 
-
Он разбирается, в какую сторону натить.
 
-
Может быть запущен в режиме входного и выходного ната.
 
- 
-
Если мы хотим произвольным образом обрабатывать пакеты, мы можем написать референс, а потом для ускорения сделать
 
-
netgraph.
 
-
Можно написать что-нибудь на пакете для сведения нетграфа.
 
-
netgraph <Надпись>
 
-
Нетграф работает очень быстро.
 
-
Передача через divert работает достаточно долго.
 
-
Понадобился нормальный kernelspace NAT.
 
-
Пока интерфейсы были 10 мегабит, проблем не было.
 
-
Довольно забавно — у каждого правила есть счетчик, сколько раз оно применялось.
 
-
Можно ничего не делать, только считать.
 
-
Помимо netgraph есть еще ngtee (то же самое, только шлет дальше).
 
- 
-
skipto <номер>
 
-
Нужно обеспечить возможность применять куски правил в зависимости от условий.
 
-
Можно уйти назад, даже завесить намертво (не выйдет из kernelspace никогда).
 
-
Тем не менее, без этой штуки обойтись нельзя.
 
-
Все пакеты, проходящие через эти пять точек обрабатываются списком правил.
 
-
Есть флаги, которые позволяют определять фильтр.
 
-
Здоровенный свод правил, удобно использовать флаги и применять нужные куски правил.
 
-
Но это сильно усложняет линейную структуру.
 
- 
-
Очень часто из соображений быстродействия полезно делать следующее.
 
-
Прогнали пакет по своду правил и решили допускать его и все его класса.
 
-
Установление соединения tcp прошло и дальше пускаем все его пакеты.
 
-
Во-первых, есть правило checkstate.
 
-
У него нет параметров.
 
-
Это правило приводит к тому, что все пакеты обрабатываются куском анализа состояний.
 
-
Почему правило есть?
 
-
Прогонка по всем состояниям — относительно тяжеловесная процедура, и если возможно принять решение до проверки состояний,
 
-
лучше это сделать.
 
-
Включаем это правило.
 
-
Если пакет принадлежит потоку данных с запомненным состоянием, то запомненное правило будет применено.
 
-
Рассказ будет продолжен в следующий раз.
 
-
Есть набор правил и флаг keep-state.
 
-
Если среди списка состояний есть такое, про которое было применено данное правило, оно будет использовано.
 
-
Не в таблице дело, а в том, что проверить, что такие пакеты уже пропускались.
 
-
Это способ убыстрить файрвол, проверив, не относится ли данный пакет к типу уже проверенных.
 
-
Общая идея в том, что мы допускаем пакеты setup в начале сессии и говорим сохранить состояние.
 
- 
-
Ограничение трафика.
 
-
pipe, queue.
 
-
Что делают эти команды?
 
-
Подробнее в следующий раз.
 
-
Для того, чтобы команда работала, должен быть модуль в ядре.
 
-
Вместо отсылки пакетов они засовываются в трубу с соответствующим номером.
 
-
Труба — некий конвейер.
 
-
У него определенная пропускная способность и другие свойства — процент потери пакетов, длина очереди и пр.
 
-
Очередь — другой механизм, нет процента потери пакетов, но есть политики обработки очереди.
 
-
У нас на факультете трубы используются для любителей запускать осла на бесконечно большой скорости и с
 
-
неограниченным количеством пользователей.
 
-
У такого пользователя несколько сотен соединений с большим трафиком на специальный ослиный порт.
 
-
Трафик такого пользователя ограничивается специальным каналом для всех таких людей.
 
-
Используется труба.
 
-
Когда количество мест в очереди заканчивается, то пакеты, которым не хватило места, выбрасываются.
 
-
Передергивается tcp.
 
-
Очередь — более хитрая.
 
- 
-
Основной способ работы файрвола — при прохождении пакеты снабжаются метаинформацией.
 
-
В частности, при каждом таком пакете можно сделать ipfw на предмет что с ним делать.
 
-
tag #
 
-
Приклеить бумажку очередного цвета.
 
-
Номера от одного до 65534.
 
-
Мы можем навесить метку и потом указать флаг tagging #, то есть если есть бумажка, сделать что-то.
 
-
Когда пакет уезжает в divert socket, бумажки снимаются.
 
-
А так будет таскать на себе.
 
- 
-
Мы можем указать вероятность применения правила.
 
-
Правило будет срабатывать не всегда.
 
-
Вряд ли оно будет ждать, пока накопится энтропия из /dev/random.
 
-
Скорее всего, механизм более простой.
 
- 
-
Возможность включать и выключать правила целыми блоками.
 
-
Днем политика одна, а ночью совершенно другая, потому что охранники качают специфические фильмы.
 
-
Какие интересные флаги есть?
 
-
Помимо типа откуда и куда, можно, например, затребовать userid.
 
-
Ограничиваем именно конкретного пользователя.
 
-
Если с пакетом что-то было — ходил через divert, bridge или еще что-то.
 
-
Проверяем, что было с пакетом.
 
-
Флаг in, out.
 
-
В freebsd есть виртуализация (простая) — jail.
 
-
Запуск процесса в ограниченном пространстве, файловом и ограниченном ipc.
 
-
Таблица процессов одна, но они изолированы в jail'ах.
 
-
Можно проверить, из какого jail пришел пакет.
 
-
Флагов очень много.
 
-
Можем указать протокол.
 
-
Вид ICMP.
 
-
Правильная настройка файрвола заключается в затыкании ICMP и разрешении большого числа типов ICMP.
 
-
Ограничение количества применений правила к пакетам.
 
-
В ipfw2 есть встроенный nat.
 
-
Про NAT разговор в следующий раз.
 
- 
-
Есть ipfw — замечательная утилита.
 
-
Позволяет делать все это из командной строки.
 
-
Есть скрипт старта файрвола.
 
-
Файрвол открытый всем.
 
-
Разрешить все всем и запретить все всем.
 
-
Клиентская машина с открытым пингом.
 
-
Сервер с открытыми 80 портом или другими.
 
-
ipfw предназначена не только для добавления-удаления правил, но и для настройки пайпов, очередей, таблиц.
 
-
Таблицы адресов.
 
-
В ipfw2 таблица адресов.
 
-
Просмотр по таблице имеет логарфмическую сложность.
 
- 
-
Чтобы закончить: еще один способ использования сеток.
 
-
Два множества правил — текущее и новое.
 
-
Текущее — действующее.
 
-
Новая выключена.
 
-
Когда заводим файрвол, обрабатываются и те правила, и другие.
 
-
Модифицируем файрвол, новые таблицы и проверяем новые таблицы.
 
-
Мы ничего не меняем, и ситуация пропадания доступа по ssh в свежеисправленном в файрволе почти исключается.
 
-
Строим новую таблицу, смотрим, свапаем таблицы.
 
- 
{{UNИX, весна 2009}}
{{UNИX, весна 2009}}
{{Lection-stub}}
{{Lection-stub}}

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

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