Добрый день, коллеги!
На сей раз задача у меня – настроить приоритеты трафика таким образом, чтобы голосовые пакеты и SIP-сигнализация обрабатывались в первую очередь. Это бывает полезно, когда, например, функции АТС выполняет офисный файрволл. Заодно настроим еще и приоритеты для SSH.
Для начала, определим критерии, по которым будет классифицироваться трафик:
1. SSH – при забитости канала, самое главное – сохранить управление системой, чтобы, к примеру, суметь заблокировать вредителя;
2. SIP – небольшое количество сигнализационных SIP-пакетов для начала и завершения VoIP-сессии;
3. собственно голосовой RTP-трафик;
4. всё остальное.
Под катом процедура настройки.
Необходимо будет собрать ядро FreeBSD с поддержкой altq и шедулеров CBQ и PRIQ. Это делается включением следующий опций:
options ALTQ options ALTQ_CBQ options ALTQ_PRIQ options ALTQ_NOPCC
Собираем ядро, после чего переходим собственно к настройке файрволла pf. Определяем очереди в секции Queueing:
altq on $ext_if1 priq bandwidth 95Mb queue { qssh, qvoip_sip, qvoip_rtp, qstd } queue qssh priority 15 priq queue qvoip_sip priority 10 priq queue qvoip_rtp priority 9 priq queue qstd priority 0 priq(default)
Отмечу, что рекомендуется выставлять значение ограничения пропускной способности чуть ниже реальной. Если у вас – 100 мегабит/сек, то выставлять нужно 95Mb и т.п. Далее, в секции Packet filtering определяем правила, согласно которым будет классифицироваться трафик:
# SSH pass in quick on $ext_if inet proto tcp fromto port 22 queue qssh # SIP pass in quick on $ext_if inet proto udp to $voip_ip port 5060 no state queue qvoip_sip pass out quick on $ext_if inet proto udp from $voip_ip port 5060 no state queue qvoip_sip # RTP pass in quick on $ext_if to self port 10000:65000 no state queue qvoip_rtp pass out quick on $ext_if from self port 10000:65000 no state queue qvoip_rtp
Разумеется, эти правила сильно зависят от вашей системы, поэтому настроить надо будет по-своему.
Просмотреть статистику трафика по приоритетам можно с помощью команды:
# pfctl -sq -v queue std on em0 priority 0 priq( default ) [ pkts: 21931349 bytes: 5315225420 dropped pkts: 2828 bytes: 1387654 ] [ qlength: 0/ 50 ] queue qvoip_rtp on em0 priority 9 [ pkts: 1733894 bytes: 209417293 dropped pkts: 0 bytes: 0 ] [ qlength: 0/ 50 ] queue qvoip_sip on em0 priority 10 [ pkts: 229837 bytes: 132500197 dropped pkts: 0 bytes: 0 ] [ qlength: 0/ 50 ] queue qssh on em0 priority 15 [ pkts: 6792 bytes: 1698953 dropped pkts: 0 bytes: 0 ] [ qlength: 0/ 50 ]