Редактирование: UNИX, весна 2009, 09 лекция (от 22 апреля)
Материал из eSyr's wiki.
Внимание: Вы не представились системе. Ваш IP-адрес будет записан в историю изменений этой страницы.
Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия | Ваш текст | ||
Строка 1: | Строка 1: | ||
* '''Диктофонная запись:''' http://esyr.org/lections/audio/uneex_2009_summer/uneex_09_04_22.ogg | * '''Диктофонная запись:''' http://esyr.org/lections/audio/uneex_2009_summer/uneex_09_04_22.ogg | ||
- | Фактически, третью лекцию лектор пересказывает pf howto. В книге всё понятно, и её | + | Фактически, третью лекцию лектор пересказывает pf howto. В книге всё понятно, и её рекоимендуется читать всем, даже если не собир. пользоваться pf. |
- | Поверхностность обманчива: pf устроен так, чтобы облегчить работу пользователю, и если | + | Поверхностность обманчива: pf устроен так, чтобы облегчить работу пользователю, и если загл. внутрь простого правила в pf, то на самом деле оно раск. в довольно сложный набор, и тенденция в том. Недавно на опеннете была информационка, что отменили scrub (пересборка пакетов). Основная задача scrub — заменить кривые пакеты на опенбсдишные. Отменили потому, что он теперь включен по умолчанию. |
- | Это всё дует в одну и то же дудку: | + | Это всё дует в одну и то же дудку: инстр. должен ориент. на польз. задачи, а не плясать вокруг структуры ip-трафика. |
Якоря. | Якоря. | ||
- | Что такое якорь: как было сказано в прошлый раз, это похоже на | + | Что такое якорь: как было сказано в прошлый раз, это похоже на польз. цепочку в iptables: это свод правил, сущ. в дополнение к осн. своду правил pf, и может быть оттуда вызван. Смысл сост. не только в том, что уменьш. количество видимых правил в одном фрагменте кода настр. pf, хотя и это тоже: можно предст. некий набор правил, предн. для одной цели, и логично их оформить в виде якоря. Но главное достоинство якоря в том, что правила, которые лежат в якоре, не нах. в осн. своед правил фаерволла, и есть гибкий механизм эти правила менять. Якорь нужен для того, чтобы там помещать правила, которые часто меняются. Меняются в связи с сост. системы, в связи с тем, что залогинился польз., в связи с злобными действиями отдельных ip. Также, как это работает с таблицами, поск., этот свод памяти в отд. памяти и обр. отдельно, то есть надежда, что блокировки у него не будет вообще, кроме как в случае, когда его содержимое потребовалось в момент его изменения. |
- | + | Отн. того, что это такое, зачем это нужно. Какие они бывают: в прошлый раз лектор говорил, что в якорь можно складывать фильтр. правила и nat/binat/redirect, что в основном чаще всего исп. правила типа filter. Тут мы приходим к ещё одному забавному св-ву: поск. якорю — штука, которую можно менчять по ходу, то если где-то в тексте написано anchor goodguys, то в этом месте происх. нечто среднее между подст. и переходом. Это не макросы, подст. оно в момент выполнения. Соотв., как только модиф. якорь, поведение pf меняется. Как это менять из us: | |
pfctl -a goodguys -f <filename> | pfctl -a goodguys -f <filename> | ||
Можно в тексте конфига написать что-то типа | Можно в тексте конфига написать что-то типа | ||
Строка 18: | Строка 18: | ||
pass in proto tcp from 10.20.30.40 port 80 | pass in proto tcp from 10.20.30.40 port 80 | ||
} | } | ||
- | Якоря могут быть вложенные. Зачем это делать: чтобы не | + | Якоря могут быть вложенные. Зачем это делать: чтобы не модиф. содерж. одного подъякоря для модиф. другого. Можно например всязть и включить все подъякори якоря бех рек. обхода: |
anchor "spam/*" | anchor "spam/*" | ||
Когда пишется переход на анкор, то к нему можно приделать фильтр, например: | Когда пишется переход на анкор, то к нему можно приделать фильтр, например: | ||
anchor "spam/*" on $ext_if proto tcp from any to any port 25 | anchor "spam/*" on $ext_if proto tcp from any to any port 25 | ||
- | И если в этот момент не | + | И если в этот момент не ижёт трафик, соотв. данному фильтру, то не будет никакой потери произв. |
- | Далее в | + | Далее в док. след. утверждения, когда могут быть макросы, когда нет. Поск. макросы раск. compiletime, то их надо опис. там же, где и сам якорь. |
Очереди. | Очереди. | ||
- | Возвращаемся к трафик шейпингу. В след раз можно поговорить, как это делается в линуксе, но то, как это сделано pf, | + | Возвращаемся к трафик шейпингу. В след раз можно поговорить, как это делается в линуксе, но то, как это сделано pf, наастолько просто, что непонятно, почему все этого боятся. |
- | Все пакеты, которые ходят через tcp/ip стек, | + | Все пакеты, которые ходят через tcp/ip стек, нах. в очережи. Прочто очередь имеет самый простой алгоритм, фифо. |
- | Делать планирование | + | Делать планирование звходящих пакетов глупо, поэтому в pf такой возм. нет. |
Немного теории. Какие бывают планировщики: | Немного теории. Какие бывают планировщики: | ||
- | * Самый нерекомендуемый. В pf их два, они | + | * Самый нерекомендуемый. В pf их два, они дпросто соответст. двум диссертациям, соотв. на эту темы, одна из них — priority queueing, вторая — class-based queueing. В pf class-based тоже имеет свои приоритеты, поэтому первым полз. необяхз. С другой стороны, первый быстрее и более правилно работающий. Приоритезация: о чём вообще речь. Есть пресловутый интерфейс, из которог вылазят пакеты. Вы орг. неск. очередей fifo, в зависимости от того, как учтроен фильтр, пакет попадает в соотв. очередь и по разным правилам отп. Приоритетная орг. очредей постр. очень просто: Вы указ. пропуск. способ. очереди целиком. ... Как это делается в настройках: Идея следу.: вы должны объявить о том |
- | + | фдей щт ачз0 им 2Ьи йгугу Хыев_щгеб вты_щгеЪ | |
queue std_out priq(default) | queue std_out priq(default) | ||
#все пакеты, будущие выходить и з интерф., будут попадать по умолч. в std_out | #все пакеты, будущие выходить и з интерф., будут попадать по умолч. в std_out | ||
queue dns_out priority 5 priq | queue dns_out priority 5 priq | ||
- | Что | + | Что озн. более высокий проиритет? Если идёт dns-запрос, то он вылехзет первым, и если другие пакет ждут своей очереди, то они ещё подождут. |
Этого мало. Теперь нужно где-то написать: | Этого мало. Теперь нужно где-то написать: | ||
Строка 48: | Строка 48: | ||
поск. скзаано pass, то это будет сделано на пакете, и любой днс-трафик будет попадать в очередь с более высоким приоритетом. | поск. скзаано pass, то это будет сделано на пакете, и любой днс-трафик будет попадать в очередь с более высоким приоритетом. | ||
- | Почему лектор про это | + | Почему лектор про это расск., но не рек. польз. приоритетными очередями? Если вы впихнули в очередь с высоким проир. пост. трафик, то можете сделать всем хуже. |
- | Как этого избежать? | + | Как этого избежать? Дост. просто, если не будете польз. приор. очередями, а таким способом орг. очередей, когда приоритет наводится не в рамках всего трафика, а в рамках конкур. потоков. То есть если бы была возм. делать дерево, то там вполне можно устр. приоритеты. |
Шаманство с приор. это довльно тяжело, поэтому есть CBQ. Там изн. предпю, что траф. разд. на очереди, очереди на подочереди и так далее. Осн. способ манип: манип. проп. способностями, а не приоритетами. Пример: | Шаманство с приор. это довльно тяжело, поэтому есть CBQ. Там изн. предпю, что траф. разд. на очереди, очереди на подочереди и так далее. Осн. способ манип: манип. проп. способностями, а не приоритетами. Пример: | ||
- | + | фдей щт ачз0 сий зц 2Ьи йгугу Хыевб ssh, ftpЪ | |
queue std bw 50% cbq(default) | queue std bw 50% cbq(default) | ||
queue ssh bw 25% { ssh_loging, ssh_bulk } | queue ssh bw 25% { ssh_loging, ssh_bulk } | ||
Строка 60: | Строка 60: | ||
queue ftp bf 500Kb priority 3 cbr(borrow qred) #red делается, если ecn не поддерживается | queue ftp bf 500Kb priority 3 cbr(borrow qred) #red делается, если ecn не поддерживается | ||
- | borrow — то самое, о чём | + | borrow — то самое, о чём гворили в начале: ftp дали гарант. скорость передачи, и если никто больше не занимет канал, то исп. свободную пропуск. способность. |
- | Таким | + | Таким обр., мы оплучаем дост. неплохое описание очереди, ост. только напистаь что-нибудь типа |
pass out on fxp0 from any to any port 22 queue ssh | pass out on fxp0 from any to any port 22 queue ssh | ||
- | Что лектору не нравится: непонятно, в какую из подочередей упадёт поток. У pf есть замечательное свойство: можно | + | Что лектору не нравится: непонятно, в какую из подочередей упадёт поток. У pf есть замечательное свойство: можно указ. неск. очередей: |
pass out on fxp0 from any to any port 22 queue (ssh_bulk, ssh_login) | pass out on fxp0 from any to any port 22 queue (ssh_bulk, ssh_login) | ||
- | Если так пишете, то будет приниматься во внимание ToS и содержимое спец. флагов TCP типа SYN, ACK. ACK и ToS "low delay" будет попадать во вторую очередь, все | + | Если так пишете, то будет приниматься во внимание ToS и содержимое спец. флагов TCP типа SYN, ACK. ACK и ToS "low delay" будет попадать во вторую очередь, все ост. — в первую. |
- | Всё остальное примерно понятно. Лектор | + | Всё остальное примерно понятно. Лектор обр. внимание, что это действ. для исх. трафика. |
- | Redirect — в зависимости от того, на какой порт пришли, | + | Redirect — в зависимости от того, на какой порт пришли, перенапр. трафик. |
Какие есть упражнения: | Какие есть упражнения: | ||
Строка 108: | Строка 108: | ||
Каждый выпуск openbsd сопровождается музыкой и комиксами. Обычно они довольно злобные. В этот раз у них была описана история bsd. | Каждый выпуск openbsd сопровождается музыкой и комиксами. Обычно они довольно злобные. В этот раз у них была описана история bsd. | ||
- | |||
- | = Конспект Kda = | ||
- | Весна в разгаре, на улице еще холодно. | ||
- | Станет теплее, народу будет еще меньше. | ||
- | |||
- | == Тенденция == | ||
- | Поверхность обманчивая, об этом было раньше. | ||
- | Тенденция, как было в прошлый раз. | ||
- | Все правила во фре стали state по умолчанию. | ||
- | Еще одно подвтерждение. | ||
- | В pf отменили слово scrab (пересборка проходящих пакетов). | ||
- | Основная задача scrab — превратить пакеты в bsd-шные. | ||
- | Говорить о кривости стека bsd нельзя, потому что он используется в большинстве случаев. | ||
- | Теперь scrab включается автоматически, а раньше была строгая рекомендация включать. | ||
- | |||
- | == Якорь == | ||
- | Что такое якорь? | ||
- | Это похоже на пользовательскую цепочку iptables. | ||
- | Свод правил, существующий в дополнение к основному линейному, и может быть вызван. | ||
- | Можно оформить в виде якоря и ссылаться на него. | ||
- | Главное достоинство не в сокращении, а в том, что правила в якоре не лежат в основном своде правил, и есть достаточно | ||
- | гибкий механизм эти правила менять. | ||
- | Якорь нужен, чтобы помещать туда правила, которые часто меняются. | ||
- | Например, состояние системы, логин пользователя, которому нужно что-то разрешить. | ||
- | |||
- | === Нет блокировки === | ||
- | Есть ненулевая вероятность, что, когда мы меняем свод правил, блокировки на него не будет вообще. | ||
- | Только если содержимое якоря потребовалось проходящему пакету, будет блокировка. | ||
- | |||
- | === Типы === | ||
- | Какие они бывают? | ||
- | Правила фильтрующие, подмены адресов. | ||
- | Чаще используются фильтрующие. | ||
- | Еще одно забавное свойство якорей. | ||
- | Поскольку якорь можно менять по ходу, | ||
- | anchor goodguys | ||
- | Происходит что-то среднее между переключением на свод правил и вставлением его. | ||
- | Макросы подставляются в момент компиляции. | ||
- | Точно так же подставляется адрес интерфейса, если он не в скобках. | ||
- | block on 8ext_if all | ||
- | Как меняется userspace? | ||
- | pfctl -a goodguys -f - | ||
- | Можно в файле написать что-то вроде | ||
- | pass in proto tcp from 10.20.30.40 port 80 | ||
- | |||
- | === Вложенность === | ||
- | Якоря могут быть вложенными. | ||
- | Можем включить все подъякори из текущего якоря без рекурсивного обхода | ||
- | anchor "spam/*" | ||
- | |||
- | Возвращаемся к сказанному Евгением. | ||
- | anchor "spam/*" on $ext_if proto tcp from any to any port 25 | ||
- | Может случиться, что обновление не приведет к потере производительности ввиду ненужности в данный момент. | ||
- | |||
- | === pfctl === | ||
- | С помощью pfctl можно манипулировать якорями. | ||
- | Все оказалось гораздо проще, чем могло быть. | ||
- | |||
- | == Traffic shaping == | ||
- | Мы переходим к еще одной теме. | ||
- | pf — это штука для крутых перцев, если вы не высокий профессионал, он будет у вас работать, хоть это и странно. | ||
- | Мы возвращаемся к теме traffic shaping. | ||
- | Можно поговорить о том, как это делается в линуксе. | ||
- | В pf это поражает своей простотой. | ||
- | Одно непонятно, почему этого так боятся. | ||
- | По умолчанию алгоритм включен, просто используется fifo. | ||
- | |||
- | === Schedule (планировщик) === | ||
- | Какие еще есть планировщики? | ||
- | Можно подключить другой планировщик и он будет работать по другим правилам. | ||
- | Для входящих пакетов это бесполезно. | ||
- | Вдруг такая необходимость есть, нужно будет создать связку виртуальных интерфейсов. | ||
- | В pf есть только на выходе из интерфейса. | ||
- | |||
- | Какие бывают планировщики кроме fifo? | ||
- | В pf два нерекомендуемых. | ||
- | Они соответствуют двум диссертациям, защищенным на эту тему. | ||
- | DRIQ, CBQ. | ||
- | В pf DRIQ пользоваться необязательно. | ||
- | Вылезают пакеты. | ||
- | Организуем несколько очередей. | ||
- | Не одно fifo, как было раньше, а несколько вариантов. | ||
- | Пакет попадает в одну очередь, другую или третью и по разным правилам попадает на выход. | ||
- | Указываем пропускную способность (например, 2 Мбит/сек). | ||
- | Указываем приоритет очередь (например, 1, 2, 3 и 4). | ||
- | Пока есть неотосланные пакеты в очереди с более высоким приоритетом, очереди с низким приоритетом будут ждать. | ||
- | Очередь для тех, кто без очереди. | ||
- | Следующий уровень — для тех, кто без очереди в очереди тех, кто без очереди. | ||
- | |||
- | Команда | ||
- | altq on fxp0 bw 2Mb queue {stdout, dns_out} | ||
- | На интерфейсе альтернативная организация очереди. | ||
- | В случае приоритетной очереди не обязательно ограничивать пропускную способность. | ||
- | В интерфейсе вешается альтернативный планировщик. | ||
- | queue std_out priq (default) | ||
- | queue dns_out priority 5 priq(red) | ||
- | pass out on fxp0 inet proto {udp tcp} from (fxp0) to any | ||
- | port domain keep-state queue dns_out | ||
- | |||
- | === Дерево === | ||
- | Поскольку приоритет — штука жесткая, могут быть проблемы. | ||
- | Если мы не будем пользоваться приоритетными очередями, а сделаем некое дерево, то если одна ветвь заполнится одним | ||
- | процессом, это не страшно, другие ветви будут работать. | ||
- | alt on fxp0 cbq bw 2Mb queue {std, ssh, ftp} | ||
- | У нас есть некий ftp-трафик, про который известно, что он то есть, то нету. | ||
- | Если есть, не нужно давать воли. | ||
- | Если никого больше нет, можно давать волю. | ||
- | Есть ssh, который нужно пускать приоритетно. | ||
- | queue std bw 50% cbq(default) | ||
- | queue ssh bw 25% { ssh_login, ssh_bulk } | ||
- | Это вторая очередь. В нее вложено две. | ||
- | queue ssh_login bw 25% priority 4 cbq(ecn) | ||
- | queue ssh_bulk bw 75% cbq(ecn) | ||
- | |||
- | === FTP === | ||
- | Наконец, ftp | ||
- | queue ftp bw 500Kb priority 3 cbq(borrow red) | ||
- | Ситуация, когда пакеты выбрасываются из очереди до того, как канал переполнен. | ||
- | Если нет поддержки ecn, а есть обычное соединение. | ||
- | Для того, чтобы не жрало трафик, достаточно выкинуть один пакет. | ||
- | Принимающая сторона скажет о пропаже, скорость снизится. | ||
- | Если поддерживается прием сообщений о том, что канал издыхает, файрвол будет слать ecn еще до реального переполнения канала. | ||
- | Что касается borrow, это то, о чем говорили в начале. | ||
- | Если больше никто не занимает канал, дайте ему больше. | ||
- | Чем быстрее скачает, тем быстрее освободится. | ||
- | |||
- | === Дополнительно === | ||
- | Получили неплохое описание очереди. | ||
- | Осталось написать что-то вроде | ||
- | pass out on fxp0 from any to any port 22 queue(ssh_bulk, ssh_login) | ||
- | Есть замечательная фича. | ||
- | Есть queue, можно вписать не одну очередь, а две. | ||
- | Если у нас есть трафик, определяемый одним пакетом, и он делится на быстрый и медленный. | ||
- | Медленный — передача файлов по ssh. | ||
- | |||
- | Такое ощущение, что нас обманули, traffic shaping, а ничего особенного. | ||
- | |||
- | == Iptables, tc == | ||
- | iptables и tc сфокусированы вокруг трафика, а не пользовательских задач. | ||
- | Нужно иметь в голове представление о задаче и теорию и проецировать задачу. | ||
- | |||
- | == NAT == | ||
- | Когда есть распределение адресов, можно сделать подмену сети с оставлением адреса компьютера. | ||
- | /24 bi nat on $ex_if iren from $int_net to any bitmask | ||
- | |||
- | Есть внешний и внутренний диапазоны адресов, они не равны. | ||
- | Как сделать так, чтобы при подмене последних двух октетов генерировался один адрес, чтобы по внутреннему адресу | ||
- | однозначно генерировался внутренний. | ||
- | Если внутри завелся хулиган, можно сильно сузить круг поиска. | ||
- | Лектор написал на питоне хэш-функцию по мак-адресу. | ||
- | Не используется динамическое выделение адресов. | ||
- | --``-- / source-hash | ||
- | pf обладает тем свойством, что легко решает пользовательские задачи при сохранении низкоуровневости. | ||
- | Люди много занимались файрволами. | ||
- | Метка у пакета может быть только одна. | ||
- | Метки в pf текстовые, длина текста 63 символа. | ||
- | Политика раздачи простая. | ||
- | При входе мы можем пометить пакет, а при выходе на основании метки поступить с ним правильно. | ||
- | Если пакет был помечен меткой, она остается. | ||
- | |||
- | Помечание пакетов — технический инструмент. | ||
- | Задача может решаться другим способом. | ||
- | |||
- | == Журнализация == | ||
- | Ситуация такая. | ||
- | У вас есть специальный интерфейс log all. | ||
- | Либо в правиле слово log, тогда пакет пойдет в интерфейс. | ||
- | logd. | ||
- | Он формирует лог tcpdump. | ||
- | |||
- | == FTP == | ||
- | Ftp — классическое двунаправленное соединение. | ||
- | Через файрвол не пролезают. | ||
- | В pf есть работа с ним. | ||
- | Basic Ftp — два соединения для легкого определения, что передавать мало и быстро, а что много и медленно. | ||
- | Пассивное соединение требует подключения к серверу по произвольному порту. | ||
- | Если и клиент, и сервер за файрволом, то в одном файрволе нужно выковыривать дырки. | ||
- | Как правило, в серверном. | ||
- | Внутрь протокола Ftp входит понятие адреса сервера. | ||
- | Ftp на прикладном уровне передает адрес, по которому нужно подсоединяться. | ||
- | Клиент лезет на внутренний адрес. | ||
- | Некоторые клиенты понимают, что бывают идиоты, например, файрфокс может подконтачиться на тот же адрес, что и основной. | ||
- | Другой вариант — использовать замороченные ftp-серверы. | ||
- | Третий вариант — ftp-proxy. | ||
- | На сервере запущена программа, которая подменяет все, что надо. | ||
- | |||
- | == Userspace == | ||
- | Две вещи. | ||
- | |||
- | === authpf === | ||
- | Раз уж перешли к userspace, программа authpf. | ||
- | Что это? | ||
- | Такой шелл. | ||
- | Пользователь логинится и запускается программа. | ||
- | Определение, откуда залогинился пользователь. | ||
- | Включается нужный анкор, после логофа отключается. | ||
- | Точнее, ip добавляется в таблицу и потом убирается. | ||
- | authpf. | ||
- | Когда пользователь заходит в систему, это обрабатывается. | ||
- | |||
- | Что можно сделать? | ||
- | Ну, например, не хотим чтобы всем давался доступ, и все могли попытаться захакать движок. | ||
- | Http доступен, а https не всем разрешить. | ||
- | Для всех пользоватей из таблицы разрешить доступ на 443 порт. | ||
- | Логинимся — есть 443 порт, разлогиниваемся — отключается. | ||
- | В браузере у лектора стоит расширение. | ||
- | Хотим, чтобы были на сервере. | ||
- | Anti-social bookmarks. | ||
- | Syncplaces. | ||
- | Лень заводить WebDav. | ||
- | По ftp закачивать и скачивать. | ||
- | Пароль передается открытым текстом. | ||
- | Пользователь bookmarks_george, пароль bookmarks_george. | ||
- | |||
- | Открывается ssh, логинится, синхронизируются закладки через развесистый порт, разлогиниваемся. | ||
- | Попыток взломать не было. | ||
- | |||
- | === Common address redundancy protocol === | ||
- | Технология, позволяющая держать несколько однотипных серверов, с одними адресами на интерфейсах. | ||
- | Есть три файрвола, абсолютно одинаковых. | ||
- | Работает один. | ||
- | Если сломается, второй тут же подхватит, даже соединения не порвутся. | ||
- | |||
- | Cisco Systems вышли со своим изделием, аналогичным, только для роутеров, а не файрволов. | ||
- | Протокол запатентован, для реализации нужно платить деньги. | ||
- | А BSDшники сказали, что они делали то же самое, только денег не хотят. | ||
- | Сайт OpenBSD, там интересный аудиофайл. | ||
- | В 3.5 длинный скетч про покупателя, который хочет купить лицензию. | ||
- | |||
- | == Следующий раз == | ||
- | В следующий раз разговор про traffic shaping отдельно. | ||
{{UNИX, весна 2009}} | {{UNИX, весна 2009}} | ||
{{Lection-stub}} | {{Lection-stub}} |