Linux Advanced Routing & Traffic Control HOWTO
Шрифт:
и зададим пусть и медленный, зато недорогой маршрут в таблице mail.out:
Это
Можно так же использовать поле TOS, в заголовке пакета, задавая различный тип обслуживания для трафика различного рода, и создавая правила, которые реагируют на это поле.
Само собой разумеется, все это прекрасно работает и на хостах, под NAT ('masquerading').
Warning
Некоторые наши читатели отмечают, что как минимум MASQ и SNAT конфликтуют с механизмом маркировки пакетов. Расти Рассел (Rusty Russell) описал эту проблему . Просто, отключите фильтр проверки обратного адреса (см. главу Параметры настройки сети в ядре) и все должно заработать.
Note
Чтобы иметь возможность маркировать пакеты, вы должны собрать ядро с рядом включенных опций: I
См. так же раздел Прозрачное проксирование с помощью netfilter, iproute2, ipchains и squid.
Глава 12. Расширенная фильтрация.
Как уже говорилось в разделе Классовые дисциплины обработки очередей, для того, чтобы определить в какую из подочередей направить пакет, используются фильтры-классификаторы.
Ниже приводится неполный список доступных классификаторов:
fw
Решение принимается на основе маркера пакета, установленного брандмауэром (например — iptables). Наиболее простой классификатор, который можно рекомендовать в том случае, если вам не хочется изучать синтаксис tc. За дополнительной информацией обращайтесь к главе 9.
u32
Решение принимается на основе значений полей в заголовке пакета (например, исходящий IP-адрес и т.п.).
route
Решение принимается на основе маршрута, по которому движется пакет.
rsvp, rsvp6
Маршрутизация пакетов производится на базе RSVP. Применимо только в том случае, если управление сетью полностью находится в ваших руках. В Интернет RSVP не поддерживается.
tcindex
Используется в DSMARK qdisc, см. соответствующий раздел.
Вообще есть множество способов классификации пакетов, но практически все они находятся в прямой зависимости от предпочитаемой вами системы.
Классификаторы, как правило, принимают некоторое количество аргументов. Перечислим их здесь, для удобства.
protocol
Протокол, принимаемый классификатором. Как правило вы будете принимать только IP-трафик.
parent
Существующий класс, к которому должен быть присоединен данный классификатор.
prio
Приоритет классификатора. Чем меньше число — тем выше приоритет.
handle
Назначение и смысл аргумента зависит от контекста использования.
Во всех следующих разделах мы будем исходить из условия, что формируется трафик, идущий к хосту HostA, что корневой класс сконфигурирован как 1:, а класс, которому посылается выбранный трафик – как 1:1.
12.1. Классификатор u32.
Фильтр U32 наиболее гибкий из доступных в текущей конфигурации. Он целиком основан на хеш-таблицах, которые повышают устойчивость фильтра при значительном количестве правил фильтрации.
В простейшем виде, фильтр U32 — это набор записей, каждая из которых состоит из двух полей: селектора и действия. Селекторы, описанные ниже, проверяют обрабатываемый IP-пакет до тех пор, пока не будет встречено первое совпадение, после чего выполняется соответствующее селектору действие. Самый простой тип действия — перенаправление пакета в определенный класс.
Для конфигурирования фильтра используется команда tc filter, состоящая из трех частей: определение фильтра, селектор и действие. Определение фильтра может быть записано как:
Поле protocol описывает обслуживаемый протокол. Здесь мы будем обсуждать исключительно протокол IP. Поле preference (в качестве синонима можно использовать priority) описывает приоритет определяемого фильтра, что позволяет задавать несколько фильтров (списков правил) с различными приоритетами. Вообще, правила обслуживаются в порядке добавления в список, в случае с приоритетами — первыми обслуживаются правила, имеющие наивысший приоритет (чем меньше число, тем выше приоритет). Поле parent определяет вершину дерева CBQ (например 10:1), к которой должен быть присоединен данный фильтр.
Описаные выше опции применимы ко всем фильтрам, а не только к U32.
12.1.1. Селектор u32.
Селектор U32 содержит определение шаблона, который будет сопоставляться с обрабатываемым пакетом. Если быть более точным, он определяет — какие биты в заголовке пакета будут проверяться и не более того, но, не смотря на свою простоту, это очень мощный и гибкий метод. Рассмотрим примеры, взятые из реально работающего и достаточно сложного фильтра: