Реализация QoS для IP-телефонии Asterisk на FreeBSD+pf

ЕнотикиДобрый день, коллеги!
На сей раз задача у меня – настроить приоритеты трафика таким образом, чтобы голосовые пакеты и 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 from  to 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 ]

Похожие статьи

Leave a Reply

Your email address will not be published. Required fields are marked *