Шейпинг трафика для voip

Автор Yuriy_Y, 24 Февраля 2014, 14:03

« предыдущая тема - следующая тема »

0 Пользователей и 1 Гость просматривают эту тему.

Yuriy_Y

Есть сервер, на нам стоит 12.04 с прозрачным прокси, eth0 - локалка, eth1 - роутер с инетом. На этой же машине стоит Asterisk с FreePBX. Настроил шейпинг по этой статье с помощью htbinit.
[spoiler=Файл eth1-2:10.voip]
# class for outgoing voip
RATE=256Kbit
CEIL=1Mbit
RULE=*:5060,
RULE=*:10000-20000,
PRIO=1
[/spoiler]
Тут вроде всё верно. Но при звонке с внешнего екстеншна, который заходит на Asterisk через интернет, с помощью jnettop наблюдаю, что порты не всегда находятся в диапазоне 10000-20000, как указано в rtp.conf Астера. На роутере проброшены порты этого же диапазона для UDP пакетов.
Вижу два пути выхода из засады:
1. Заставить Asterisk договариваться об использовании портов только из указанного диапазона;
2. Маркировать с помощью iptables пакеты, исходящие от Asterisk определенным маркером, а с помощью htb уже маркированные пакеты шейпить.

Вот теперь, собственно, как это сделать?
С уважением, Юрий

hedgeven

разве в rtp.conf порты не для входящего трафика указаны? т.е. у клиентов могут быть разные порты, но приходят они к вам на сервер в диапазоне 10000-20000. поэтому и шейпить надо не по исходящему, а по входящему трафику.
ну или я не совсем понял постановку задачи. :)
Jah will give us everything...

Yuriy_Y

А как шейпить по входящему, если регулируется только исходящий с интерфейса трафик?
Я толком инфу не нашел, но, имхо, у разных девайсов могут быть свои мысли по поводу портов. Они сначала ломятся по сигнальному порту 5060, а потом уже договариваются, какой UDP порт юзать для войса. Устанавливается коннект по этим портам и пошел голос.
С уважением, Юрий

hedgeven

24 Февраля 2014, 16:33 #3 Последнее редактирование: 24 Февраля 2014, 16:36 от hedgeven
Цитата: Yuriy_Y от 24 Февраля 2014, 16:20А как шейпить по входящему, если регулируется только исходящий с интерфейса трафик?

Я так понял, по той статье, что так
RULE=,*:10000-20000

Но вообще стоит больше собрать инфы о сетевых сессиях, например собрать статистику нескольких запусков команды netstat -naept|grep ESTABLISHED

P.S. хотя похоже я что-то путаю, и у тебя все правильно в конфиге написано. там как-то можно мониторить работет ли шейпер (может есть логирование)? ну или через iftop и его аналоги.
Jah will give us everything...

Yuriy_Y

Цитата: hedgeven от 24 Февраля 2014, 16:33
Я так понял, по той статье, что так
RULE=,*:10000-20000

Да, но ограничиваются и рулятся все равно только исходящие пакеты.

Вот если б средствами iptables маркировать пакеты, исходящие только от процесса asterisk, тогда было бы все проще. Так можно сделать?
С уважением, Юрий

hedgeven

в ядре 2.4 была возможность привязать правило к PID, но в 2.6 с введением многопоточности и других изменений эта возможность пропала.
зато есть возможность в iptables фильтровать пакеты по uid/gid, так что если астер работает из под отдельного юзера, то можно попробовать.

-m owner --uid-owner asterisk
Jah will give us everything...

Yuriy_Y

Цитата: hedgeven от 24 Февраля 2014, 17:51так что если астер работает из под отдельного юзера, то можно попробовать.
Код: [Выделить]
-m owner --uid-owner asterisk

Так-так, вот с этого места подробнее. Астер пашет от юзверя asterisk в группе dialout.
Блин, и от этого же юзверя апач сидит.  :rolleyes:
Всё хотел их разнести попробовать, руки не доходят.
С уважением, Юрий

hedgeven

странно, что апач работает от asterisk, да еще и в группе dialout... чего только не придумают...
лучше бы разнести по разным юзерам и маркировать потом трафик с определенным uid.
Jah will give us everything...

Yuriy_Y

Не, апач от астериска пашет, чтоб чет там FreePBX писал. Я уже не помню для чего это. Как-то пытался по уму сделать, сильно много глюков с правами вылезло, бросил до лучших времен.
С уважением, Юрий

B@F

Цитата: Yuriy_Y от 24 Февраля 2014, 14:03
Есть сервер, на нам стоит 12.04 с прозрачным прокси, eth0 - локалка, eth1 - роутер с инетом. На этой же машине стоит Asterisk с FreePBX. Настроил шейпинг по этой статье с помощью htbinit.
[spoiler=Файл eth1-2:10.voip]
# class for outgoing voip
RATE=256Kbit
CEIL=1Mbit
RULE=*:5060,
RULE=*:10000-20000,
PRIO=1
[/spoiler]
Тут вроде всё верно. Но при звонке с внешнего екстеншна, который заходит на Asterisk через интернет, с помощью jnettop наблюдаю, что порты не всегда находятся в диапазоне 10000-20000, как указано в rtp.conf Астера. На роутере проброшены порты этого же диапазона для UDP пакетов.
Вижу два пути выхода из засады:
1. Заставить Asterisk договариваться об использовании портов только из указанного диапазона;
2. Маркировать с помощью iptables пакеты, исходящие от Asterisk определенным маркером, а с помощью htb уже маркированные пакеты шейпить.

Вот теперь, собственно, как это сделать?


В общем мое мнение.
1. голосовой трафик должен быть приоритетным перед сигналингом. У вас они равны.
2. Входящий трафик шейпить нельзя и нет смысла в этом. Т.к. очереди выставляются только для исходящего, т.е. в вашем случаи провайдер должен выставлять приоритеты. Я уже писал про это на linuxcentr.kz, что весь интернет трафик идет с 0 приоритетом и рубится во всем мире в первую очередь. Если вы хотите иметь качество, то должны использовать специальный порт , кажется в дсл это 0/41. В этом порту выставлены сигналинг в 3 приоритет, а голос в 5.
Вывод: непарится и шейпить исходящий, это максимум что можно сделать, ну или исходящий в сторону локалки.

По портам. В конфиге указывается входящие порты, что бы их пробросить на нате. Но протокол SIP не такой уж и простой, если в экстеншене указано что клиент за натом или какой-то из рфс то станция с клиентом могут договариваться о портах, это видно если снефирить, и устанавливать соединение через нат, причем нат и не замечает подстановки, так как он не нат на самом деле а PAT, это верное определение.
Если что-то осенит мож и добавлю, а пока более ничего другого не пришло на ум.
Поправьте, если я ошибаюсь, буду тока рад.

Yuriy_Y

Цитата: B@F от 24 Февраля 2014, 22:081. голосовой трафик должен быть приоритетным перед сигналингом. У вас они равны.

Сигнального трафика на порядок меньше, чем голосового. Не вижу смысла.
Цитата: B@F от 24 Февраля 2014, 22:08
2. Если вы хотите иметь качество, то должны использовать специальный порт , кажется в дсл это 0/41. В этом порту выставлены сигналинг в 3 приоритет, а голос в 5.

Это да, но сторонние VoIP провайдеры через 0/41 почему-то не пашут.  ^_^ Типа задармы, петронета и проч. Кстати, сам себе противоречишь. Приоритетнее трафик с меньшим номером приоритета.
Цитата: B@F от 24 Февраля 2014, 22:08
Вывод: непарится и шейпить исходящий, это максимум что можно сделать, ну или исходящий в сторону локалки.

Так я так и делаю. Субъективно стало лучше.
С уважением, Юрий

B@F

как гнать дело каждого я лишь рекомендовал так как принято в мире.
0/41 это закрытая сеть для адифона и только.
чем выше значение cos тем выше приоритеты. Курс CISCO CCNA DISKAVERY.
если ваше устройство и астер и шлюх для кучи юзеров то по-любому лучще;если только астер то особого смысла нет.
Поправьте, если я ошибаюсь, буду тока рад.

Yuriy_Y

Цитата: B@F от 25 Февраля 2014, 13:26если ваше устройство и астер и шлюх для кучи юзеров то по-любому лучще;

Вот именно, комбайн у меня, и не один. Но помогает. Проверил.  -_-
Теперь буду на всех внедрять.
С уважением, Юрий