Предистория. Работа у нас сложная и напряжённая, о чём свидетельствуют протёртые клавиши W A S D на клавиатуре, а канал в инет не резиновый (к нашему всеобщему сожалению). Загвоздка состояла в том, что когда начинали активно серфить или кто-то осмеливался ещё и качать, то пинг в любой игре подскакивал до неприлично больших значений, ну и конечно большая вероятность дисконекта. На шлюзе стоит FreeBSD 7.0 Release с настроенным ipfw и претензий к нему нет. Именно поэтому при возникновении необходимости в altq я полез копаться в pf. Настроил, всё прекрасно заработало. Косяк вылез при редиректе на squid из-за того, что в FreeBSD 7 в pf по умолчанию включен keep state, а в rdr он не убирается. Убил неделю, но, как говорится: "А ларчик то просто открывался!". Настроенный ipfw переводится на работу с ALTQ за несколько минут. Теперь по порядку: Естественно надо ядро с поддержкой ALTQ, а именно:
Подробно очереди описывать не буду, в интернете множество примеров. Ну и теперь надо завернуть в очереди трафик из ipfw. При настроенном ipfw, делается это очень удобно через конструкцию count
ipfw add 1 count altq game_out all from any to any 8112 out via $ext_if
ipfw add 2 count altq game_in all from any 8112 to any out via $int_if
...
Ну и т.д. Все, кто не попал в очередь идут в дефолтную.
Для удобства ставим pftop и радуемся работе ALTQ в ifpw.
З.Ы. Замечания по man`у ipfw. При попадании пакета в несколько очередей срабатывает первое. Заворачивать в очереди надо до check-state и keep-state.