FreeBSD. Настраиваем PF ALTQ на VLAN интерфейсах.
Аренда сервера. Выделенные серверы в Украине и Нидерландах
Аренда сервера
VPS, VDS, Windows VPS - от $10
VPS
Аренда сервера
VPS, VDS, Windows VPS - от $10
VPS
Если Вы попробуете настроить шейпинг или приоритезацию трафика на VLAN интерфейсе с помощью PF ALTQ, Вы увидете ошибку: pfctl: vlan0: driver does not support altq. Как же быть? Всё просто. Нужно просто ALTQ повесить на родительский интерфейс, создать нужные очереди, а затем раскладывать трафик по очередям правилами pf. Предположим, что на интерфейсе fxp0 у нас есть интерфейс vlan0 который смотрит в подсеть 192.168.0.0/24, тогда правила будут выглядеть примерно так:
# Queuing
# Создаем altq очередь и подочереди на интерфейсе fxp0
altq on fxp0 cbq bandwidth 100Mb queue { default, local }
queue default bandwidth 1Mb cbq(default)
queue local bandwidth 1Mb cbq(ecn)
# Создаем altq очередь и подочереди на интерфейсе fxp0
altq on fxp0 cbq bandwidth 100Mb queue { default, local }
queue default bandwidth 1Mb cbq(default)
queue local bandwidth 1Mb cbq(ecn)
Далее нужно разложить трафик по созданным очередям. Сделать это можно так:
# Filtering
# Добавляем подсеть в шейпер.
pass out quick on vlan0 from any to 192.168.0.0/24 queue local
# Добавляем подсеть в шейпер.
pass out quick on vlan0 from any to 192.168.0.0/24 queue local
Или вот так:
# Filtering
# Добавляем трафик проходящий через vlan0 в шейпер.
pass out on vlan0 queue local
# Добавляем трафик проходящий через vlan0 в шейпер.
pass out on vlan0 queue local
Или еще как будет угодно, но общий смысл тот же: в очереди трафик направляем правилами фильтрации.
Дополнительные записи:
10 комментариев
Уважаемый автор, покажите, пожалуйста, одну сточку из документации, в которой упоминается о “нарезка” трафика на вход (IN)
Спасибо.
Хорошее замечание. Я совсем упустил из виду тот факт, что у меня интерфейс fxp0 был интерфейсом как внешним, так и внутренним (для чего, собственно, vlan’ы и понадобились), поэтому конкретно в моем случае это было справедливо. Приношу свои извинения за неточность, запись исправил. Спасибо за ценное замечание.
1. Запись вида pass on interface_name можно смело разбивать на две (in/out), как это и делает pf, чтобы исключить ошибки.http://www.openbsd.org/faq/pf/filter.html ) и начиная с FreeBSD-7.0. Поэтому лучше указывать подобные детали, иначе на разных версиях будут разные результаты.
2.
>> pass quick from any to 192.168.0.0/24 queue local
Смысл queue local на всех интерфейсах системы + in/out ?
>> pass in on vlan0 queue local
Только out
Исправляем пожалуйста, и если есть возможность проверяем все практически. Теория хорошо, но практика (c) …
3.
>> In OpenBSD 4.1 and later, the default flags S/SA are applied to all TCP filter rules. (
Невнимательно исправил. Конечно же out. Отредактировал.
>> pass out quick from any to 192.168.0.0/24 queue local
Сразу на всех интерфейсах?
Почему на всех?
а) Шейпер на каком интерфейсе висит?
б) На всех интерфейсах будет _исходящий_ трафик в направлении 192.168.0.0/24?
P.S. Эта запись не претендует на полное справочное руководство по PF, она всего лишь образно иллюстрирует общую схему шейпинга на VLAN интерфейсе. Если у Вас возникли проблемы с составлением конкретного правила – обращайтесь к документации.
>> Почему на всех?
Потому что в правиле pass out quick from any to 192.168.0.0/24 queue local
не указан интерфейс, а следовательно это правило будет применино ко всем интерфейсам. Если сеть 192.168.0.0/24 находиться на vlan0, то зачем тогда это правило на fxp0? Или у Вас в направлении 192.168.0.0/24 черзе fxp0 тоже бегают пакеты?
>> Эта запись не претендует на полное справочное руководство по PF
Тяжело вообще судить, на что эти записи претендуют :(
>> Если у Вас возникли проблемы с составлением
Да, но к сожалению, не уменя
Если трудно, поясняю еще раз: запись не про то как написать правило, чтобы оно работало всегда, везде, у всех, во всех случаях и на всех версиях. Эта запись всего лишь про то, как устранить ошибку “pfctl: vlan0: driver does not support altq”. Именно данную, конкретную и именно эту ошибку. Всё. Больше ни о чем другом. Запись только об одной единственной ошибке и правила приведены исключительно как _пример_. При чем слово _пример_ не стоит путать с руководством к бездумному копипасту. Если это настолько принципиальный вопрос не читать документацию, то пожалуйста, добавил интерфейс. Мне не жалко :)
>> запись не про то как написать правило, чтобы оно работало всегда, везде, у всех, во всех случаях и на всех версиях. Эта запись всего лишь про то, как устранить ошибку “pfctl: vlan0: driver does not support altq”.
Тогда и нужно было ограничить эту запись словами:
>> Как же быть? Всё просто. Нужно просто ALTQ повесить на родительский интерфейс
В следующий раз обязательно проконсультируюсь с Вами ;)