1 | изначальная версия редактировать | |
Шейпинг трафика VOIP
Приведу простой пример ограничения входящего трафика.
В Интернете много примеров. Я приведу действующий
скрипт для небольшой фирмы у которой сервер VOIP
и шлюз в Интернет один и тот же физический сервер. eth0 - смотрит в локальную сеть
eth1 - смотрит в Интернет (входящая скорость 7Мбит от провайдера)
Ограничивать будем на eth0, т.к. ограничивать возможно
только исходящий трафик. Разобьем трафик на 3 части
Итак непосредственно пример:
#!/bin/sh
TCOP="add"
IPTOP="-A"
IF=eth0
if [ "$1" == "stop" ]; then
echo "Stopping..."
TCOP="del"
IPTOP="-D"
fi
if [ "$1" == "stat" ]; then
tc -d qdisc
exit
fi
RATE - минимально гарантированная скорость, CEIL - максимальная
RATE=6000
CEIL=7000
Создаем корневой класс(неклассифицированный трафик попадает в канал 30)
tc qdisc ${TCOP} dev ${IF} root handle 1: htb default 30
Создаем классы(шаблоны ограничений)
tc class ${TCOP} dev ${IF} parent 1: classid 1:1 htb rate ${RATE}kbit ceil ${CEIL}kbit
voip
tc class ${TCOP} dev ${IF} parent 1:1 classid 1:10 htb rate 1024kbit ceil 1500kbit prio 0
http
tc class ${TCOP} dev ${IF} parent 1:1 classid 1:20 htb rate 1024kbit ceil 3000kbit prio 2
other
tc class ${TCOP} dev ${IF} parent 1:1 classid 1:30 htb rate 256kbit ceil 2500kbit prio 3
Указываем тип очередей
tc qdisc ${TCOP} dev ${IF} parent 1:10 handle 10: pfifo
tc qdisc ${TCOP} dev ${IF} parent 1:20 handle 20: sfq perturb 10
tc qdisc ${TCOP} dev ${IF} parent 1:30 handle 30: sfq perturb 10
Указываем фильтры для очередей.
tc filter ${TCOP} dev ${IF} parent 1:0 protocol ip prio 0 handle 1 fw classid 1:10
tc filter ${TCOP} dev ${IF} parent 1:0 protocol ip prio 2 handle 2 fw classid 1:20
tc filter ${TCOP} dev ${IF} parent 1:0 protocol ip prio 3 handle 3 fw classid 1:30
Непосредственно маркировка. 0x1 означает найти в "tc filter" "handle 1" назначить приоритет 0 и отправить в канал 1:10 и т.д. Обратите внимание на то что RTP пакеты маркируются в OUTPUT. Это связано с тем, что ASTERISK стоит на той же машине что и шлюз.
iptables -t mangle ${IPTOP} OUTPUT -p udp -m udp --sport 10000:15000 -j MARK --set-mark 0x1
iptables -t mangle ${IPTOP} OUTPUT -p udp -m udp --sport 10000:15000 -j RETURN
iptables -t mangle ${IPTOP} PREROUTING -p tcp -m tcp --sport 80 -j MARK --set-mark 0x2
iptables -t mangle ${IPTOP} PREROUTING -p tcp -m tcp --sport 80 -j RETURN
iptables -t mangle ${IPTOP} PREROUTING -p tcp -m tcp --sport 22 -j MARK --set-mark 0x2
iptables -t mangle ${IPTOP} PREROUTING -p tcp -m tcp --sport 22 -j RETURN
iptables -t mangle ${IPTOP} PREROUTING -j MARK --set-mark 0x3
iptables -t mangle ${IPTOP} OUTPUT -j MARK --set-mark 0x3
2 | No.2 Revision редактировать |
Шейпинг трафика VOIP Приведу простой пример ограничения входящего трафика. В Интернете много примеров. Я приведу действующий скрипт для небольшой фирмы у которой сервер VOIP и шлюз в Интернет один и тот же физический сервер.
eth0 - смотрит в локальную сеть eth1 - смотрит в Интернет (входящая скорость 7Мбит от провайдера)
Ограничивать будем на eth0, т.к. ограничивать возможно только исходящий трафик. Разобьем трафик на 3 части Итак непосредственно
пример:пример:
#!/bin/sh TCOP="add" IPTOP="-A" IF=eth0 if [ "$1" == "stop" ]; then echo "Stopping..." TCOP="del" IPTOP="-D" fi
if [ "$1" == "stat" ]; then tc -d qdisc exit fi
RATE - минимально гарантированная скорость, CEIL - максимальная
RATE=6000 CEIL=7000
Создаем корневой класс(неклассифицированный трафик попадает в канал 30)
tc qdisc ${TCOP} dev ${IF} root handle 1: htb default 30
Создаем классы(шаблоны ограничений)
tc class ${TCOP} dev ${IF} parent 1: classid 1:1 htb rate ${RATE}kbit ceil ${CEIL}kbit
voip
tc class ${TCOP} dev ${IF} parent 1:1 classid 1:10 htb rate 1024kbit ceil 1500kbit prio 0
http
tc class ${TCOP} dev ${IF} parent 1:1 classid 1:20 htb rate 1024kbit ceil 3000kbit prio 2
other
tc class ${TCOP} dev ${IF} parent 1:1 classid 1:30 htb rate 256kbit ceil 2500kbit prio 3
Указываем тип очередей
tc qdisc ${TCOP} dev ${IF} parent 1:10 handle 10: pfifo tc qdisc ${TCOP} dev ${IF} parent 1:20 handle 20: sfq perturb 10 tc qdisc ${TCOP} dev ${IF} parent 1:30 handle 30: sfq perturb 10
Указываем фильтры для очередей.
tc filter ${TCOP} dev ${IF} parent 1:0 protocol ip prio 0 handle 1 fw classid 1:10 tc filter ${TCOP} dev ${IF} parent 1:0 protocol ip prio 2 handle 2 fw classid 1:20 tc filter ${TCOP} dev ${IF} parent 1:0 protocol ip prio 3 handle 3 fw classid 1:30
Непосредственно маркировка. 0x1 означает найти в "tc filter" "handle 1" назначить приоритет 0 и отправить в канал 1:10 и т.д. Обратите внимание на то что RTP пакеты маркируются в OUTPUT. Это связано с тем, что ASTERISK стоит на той же машине что и шлюз.
iptables -t mangle ${IPTOP} OUTPUT -p udp -m udp --sport 10000:15000 -j MARK --set-mark 0x1 iptables -t mangle ${IPTOP} OUTPUT -p udp -m udp --sport 10000:15000 -j RETURN
iptables -t mangle ${IPTOP} PREROUTING -p tcp -m tcp --sport 80 -j MARK --set-mark 0x2 iptables -t mangle ${IPTOP} PREROUTING -p tcp -m tcp --sport 80 -j RETURN
iptables -t mangle ${IPTOP} PREROUTING -p tcp -m tcp --sport 22 -j MARK --set-mark 0x2 iptables -t mangle ${IPTOP} PREROUTING -p tcp -m tcp --sport 22 -j RETURN
0x3
iptables -t mangle ${IPTOP} PREROUTING -j MARK --set-mark 0x3 iptables -t mangle ${IPTOP} OUTPUT -j MARK --set-mark
0x3
3 | No.3 Revision редактировать |
Шейпинг трафика VOIP Приведу простой пример ограничения входящего трафика. В Интернете много примеров. Я приведу действующий скрипт для небольшой фирмы у которой сервер VOIP и шлюз в Интернет один и тот же физический сервер.
eth0 - смотрит в локальную сеть eth1 - смотрит в Интернет (входящая скорость 7Мбит от провайдера)
Ограничивать будем на eth0, т.к. ограничивать возможно
только исходящий трафик. Разобьем трафик на 3 части
Итак непосредственно пример:
пример:
#!/bin/sh TCOP="add" IPTOP="-A" IF=eth0 if [ "$1" == "stop" ]; then echo "Stopping..." TCOP="del" IPTOP="-D"fi
fi if [ "$1" == "stat" ]; then tc -d qdisc exit
fifi # RATE - минимально гарантированная скорость, CEIL -
максимальнаямаксимальная RATE=6000
CEIL=7000CEIL=7000 # Создаем корневой класс(неклассифицированный трафик попадает в канал
30)30) tc qdisc ${TCOP} dev ${IF} root handle 1: htb default
3030 # Создаем классы(шаблоны
ограничений)ограничений) tc class ${TCOP} dev ${IF} parent 1: classid 1:1 htb rate ${RATE}kbit ceil
${CEIL}kbitvoip
${CEIL}kbit # voip tc class ${TCOP} dev ${IF} parent 1:1 classid 1:10 htb rate 1024kbit ceil 1500kbit prio
0http
0 # http tc class ${TCOP} dev ${IF} parent 1:1 classid 1:20 htb rate 1024kbit ceil 3000kbit prio
2other
2 # other tc class ${TCOP} dev ${IF} parent 1:1 classid 1:30 htb rate 256kbit ceil 2500kbit prio
33 # Указываем тип
очередейочередей tc qdisc ${TCOP} dev ${IF} parent 1:10 handle 10: pfifo tc qdisc ${TCOP} dev ${IF} parent 1:20 handle 20: sfq perturb 10 tc qdisc ${TCOP} dev ${IF} parent 1:30 handle 30: sfq perturb
1010 # Указываем фильтры для
очередей.очередей. tc filter ${TCOP} dev ${IF} parent 1:0 protocol ip prio 0 handle 1 fw classid 1:10 tc filter ${TCOP} dev ${IF} parent 1:0 protocol ip prio 2 handle 2 fw classid 1:20 tc filter ${TCOP} dev ${IF} parent 1:0 protocol ip prio 3 handle 3 fw classid
1:301:30 # Непосредственно маркировка. 0x1 означает найти в "tc filter" "handle 1" назначить приоритет 0 и отправить в канал 1:10 и т.д. Обратите внимание на то что RTP пакеты маркируются в OUTPUT. Это связано с тем, что ASTERISK стоит на той же машине что и
шлюз.шлюз. iptables -t mangle ${IPTOP} OUTPUT -p udp -m udp --sport 10000:15000 -j MARK --set-mark 0x1 iptables -t mangle ${IPTOP} OUTPUT -p udp -m udp --sport 10000:15000 -j
RETURNRETURN iptables -t mangle ${IPTOP} PREROUTING -p tcp -m tcp --sport 80 -j MARK --set-mark 0x2 iptables -t mangle ${IPTOP} PREROUTING -p tcp -m tcp --sport 80 -j
RETURNRETURN iptables -t mangle ${IPTOP} PREROUTING -p tcp -m tcp --sport 22 -j MARK --set-mark 0x2 iptables -t mangle ${IPTOP} PREROUTING -p tcp -m tcp --sport 22 -j
RETURN
RETURN iptables -t mangle ${IPTOP} PREROUTING -j MARK --set-mark 0x3 iptables -t mangle ${IPTOP} OUTPUT -j MARK --set-mark 0x3
Проект компании "АТС Дизайн"
Asterisk® и Digium® являются зарегистрированными торговыми марками компании
Digium, Inc., США.
IP АТС Asterisk распространяется под лицензией
GNU GPL.