Настройка шейпера: различия между версиями
Перейти к навигации
Перейти к поиску
Misha (обсуждение | вклад) м Защищена страница «Настройка шейпера» ([edit=sysop] (бессрочно) [move=sysop] (бессрочно)) |
|||
| (не показаны 2 промежуточные версии 2 участников) | |||
| Строка 7: | Строка 7: | ||
4. Использовать справедливое деление канала ESFQ | 4. Использовать справедливое деление канала ESFQ | ||
==Литература== | ==Литература== | ||
Использовалась [http://www. | Использовалась [http://www.opennet.ru/docs/RUS/LARTC/ Linux Advanced Routing & Traffic Control HOWTO] | ||
==Сам скрипт== | ==Сам скрипт== | ||
Файл speed.sh | Файл speed.sh | ||
| Строка 257: | Строка 257: | ||
# | # | ||
####################################################</pre> | ####################################################</pre> | ||
===Скрипт по сбросу всех установок=== | |||
Файл high_speed.sh | |||
<pre> | |||
#!/bin/bash | |||
#set -x | |||
# Внутренняя сеть VPN | |||
in_net=172.16.131.0/24 | |||
# Сбросить все в известное состояние (очищеное) | |||
$ipr qdisc del dev imq0 root 2> /dev/null > /dev/null | |||
$ipr qdisc del dev imq1 root 2> /dev/null > /dev/null | |||
# очистка таблицы mangle | |||
$ipt -t mangle -F | |||
$ipr qdisc del dev imq0 root &> /dev/null | |||
$ipr qdisc del dev imq1 root &> /dev/null | |||
$ipt -t mangle -D POSTROUTING -o ppp+ -d $in_net -j POST_MY 2> /dev/null > /dev/null | |||
$ipt -t mangle -F POST_MY 2> /dev/null > /dev/null | |||
$ipt -t mangle -X POST_MY 2> /dev/null > /dev/null | |||
$ipt -t mangle -F MYSHAPER-IN 2> /dev/null > /dev/null | |||
$ipt -t mangle -X MYSHAPER-IN 2> /dev/null > /dev/null | |||
$ipt -t mangle -D PREROUTING -i ppp+ -s $in_net -j PRE_MY 2> /dev/null > /dev/null | |||
$ipt -t mangle -F PRE_MY 2> /dev/null > /dev/null | |||
$ipt -t mangle -X PRE_MY 2> /dev/null > /dev/null | |||
ip link set imq0 down 2> /dev/null > /dev/null | |||
ip link set imq1 down 2> /dev/null > /dev/null | |||
rmmod imq 2> /dev/null > /dev/null | |||
</pre> | |||
===Тестирование=== | ===Тестирование=== | ||
С помощью команды | С помощью команды | ||
Текущая версия от 12:36, 20 июля 2010
Тут я приведу пример своего шейперра. Для того, что бы все функции его заработали нужно пропачить ядро, iptables и iproute.
Смотри Наложение патчей IMQ, ESFQ и Layer7
Задачи, решаемые шейпером
1. Обеспечить справедливое разделение internet канала между пользователями
2. Ввести ограничение на входящий трафик, что бы у исходящего трафика не было задержек.
3. Использовать IMQ интерфейсы
4. Использовать справедливое деление канала ESFQ
Литература
Использовалась Linux Advanced Routing & Traffic Control HOWTO
Сам скрипт
Файл speed.sh
#!/bin/bash
#set -x
# Загружаем модули, если они были не загружены
/sbin/modprobe ip_tables
/sbin/modprobe ip_conntrack
/sbin/modprobe iptable_filter
/sbin/modprobe iptable_mangle
/sbin/modprobe iptable_nat
/sbin/modprobe ipt_LOG
/sbin/modprobe ipt_limit
/sbin/modprobe ipt_state
/sbin/modprobe ipt_owner
/sbin/modprobe ipt_REJECT
/sbin/modprobe ipt_MASQUERADE
/sbin/modprobe ip_conntrack_ftp
/sbin/modprobe ip_conntrack_irc
/sbin/modprobe ip_nat_ftp
/sbin/modprobe ip_nat_irc
echo "1" > /proc/sys/net/ipv4/ip_forward
#eth2 - внешний интерфейс
#eth0 - внутренний интерфейс
# IP адрес человека, которог надо ограничить более низкой скоростью
ip_bad=172.16.131.13
ip_bad1=172.16.131.49
ipt=/usr/local/sbin/iptables
ipr=/usr/sbin/tc
# Интернетовская внутренняя сеть VPN
in_net=172.16.131.0/24
# Внешния IP адрес сервера
out_adr=78.36.15.11
touch /var/lock/subsys/local
#DEV_OUT=eth0
# Внешний интерфейс
DEV_OUT=eth2
# Внутренний интерфейс
DEV_IN=eth1
# Загружаем модуль IMQ
modprobe imq numdevs=4
# Максимальная входящая от прова скорость интернета (kbit)- Делаем четь меньше скорости, которую
# +дает провайдер
RATEOUT=500
# Максимальная исходящая от прова скорость интернета (kbit)- Делаем четь меньше скорости, которую
# +дает провайдер
RATEDN=500
# Сбросить все в известное состояние (очищеное)
$ipr qdisc del dev imq0 root 2> /dev/null > /dev/null
$ipr qdisc del dev imq1 root 2> /dev/null > /dev/null
# очистка таблицы mangle
$ipt -t mangle -F
$ipr qdisc del dev imq0 root &> /dev/null
$ipr qdisc del dev imq1 root &> /dev/null
$ipt -t mangle -D POSTROUTING -o ppp+ -d $in_net -j POST_MY 2> /dev/null > /dev/null
$ipt -t mangle -F POST_MY 2> /dev/null > /dev/null
$ipt -t mangle -X POST_MY 2> /dev/null > /dev/null
$ipt -t mangle -F MYSHAPER-IN 2> /dev/null > /dev/null
$ipt -t mangle -X MYSHAPER-IN 2> /dev/null > /dev/null
$ipt -t mangle -D PREROUTING -i ppp+ -s $in_net -j PRE_MY 2> /dev/null > /dev/null
$ipt -t mangle -F PRE_MY 2> /dev/null > /dev/null
$ipt -t mangle -X PRE_MY 2> /dev/null > /dev/null
ip link set imq0 down 2> /dev/null > /dev/null
ip link set imq1 down 2> /dev/null > /dev/null
rmmod imq 2> /dev/null > /dev/null
modprobe imq numdevs=4
#ip link set imq0 up
ip link set imq0 up
# ограничение скорости канала -----------------------------------------------------------------
###########################################################
#
# Ограничение исходящего потока (ограничивает пропускную способность до RATEUP)
# установить размер очереди, соответствующий двухсекундной задержке на низкоприоритетном трафике
ip link set dev imq0 qlen 10
# изменяем значение mtu на исходящем устройстве. Понижение значения mtu уменьшит задержку, но
# и немного понизит пропускную способность из-за увеличения числа
# заголовков протоколов IP и TCP .
ip link set dev imq0 mtu 1400
$ipr qdisc add dev imq0 root handle 1: htb default 14 r2q 1
#$ipr qdisc add dev $ethi root handle 1: htb
$ipr class add dev imq0 parent 1: classid 1:1 htb rate $[$RATEOUT]kbit ceil ${RATEOUT}kbit
# ssh, DNS, Голосовая почта
$ipr class add dev imq0 parent 1:1 classid 1:10 htb rate $[$RATEOUT/3]kbit ceil ${RATEOUT}kbit prio 0
# HTTP
$ipr class add dev imq0 parent 1:1 classid 1:11 htb rate $[$RATEOUT/4]kbit ceil ${RATEOUT}kbit prio 1
# ftp, bittonet
$ipr class add dev imq0 parent 1:1 classid 1:12 htb rate $[$RATEOUT/6]kbit ceil ${RATEOUT}kbit prio 4
# bad users
$ipr class add dev imq0 parent 1:1 classid 1:13 htb rate $[$RATEOUT/8]kbit ceil $[$RATEOUT/3]kbit prio 6
# Other
$ipr class add dev imq0 parent 1:1 classid 1:14 htb rate $[$RATEOUT/4]kbit ceil ${RATEOUT}kbit prio 3
$ipr qdisc add dev imq0 parent 1:10 handle 100: esfq perturb 10
$ipr qdisc add dev imq0 parent 1:11 handle 110: esfq perturb 10
$ipr qdisc add dev imq0 parent 1:12 handle 120: esfq perturb 10
$ipr qdisc add dev imq0 parent 1:13 handle 130: esfq perturb 10
$ipr qdisc add dev imq0 parent 1:14 handle 140: esfq perturb 10
$ipr filter add dev imq0 protocol ip parent 1:0 prio 0 handle 1 fw flowid 1:10
$ipr filter add dev imq0 protocol ip parent 1:0 prio 1 handle 2 fw flowid 1:11
$ipr filter add dev imq0 protocol ip parent 1:0 prio 2 handle 3 fw flowid 1:12
$ipr filter add dev imq0 protocol ip parent 1:0 prio 4 handle 4 fw flowid 1:13
$ipr filter add dev imq0 protocol ip parent 1:0 prio 3 handle 5 fw flowid 1:14
#set -x
$ipt -t mangle -N POST_MY
$ipt -t mangle -N PRE_MY
$ipt -t mangle -I POSTROUTING -o ppp+ -d $in_net -j POST_MY
$ipt -t mangle -I PREROUTING -i ppp+ -s $in_net -j PRE_MY
$ipt -t mangle -A POST_MY -p tcp --sport 5190 -j MARK --set-mark 0x2
# интернет-пейджер aol
# ICMP (ping) - высокий приоритет,
$ipt -t mangle -A POST_MY -p icmp -j MARK --set-mark 0x1
$ipt -t mangle -A POST_MY -m tos --tos Minimize-Delay -j MARK --set-mark 0x1
$ipt -t mangle -A POST_MY -m tos --tos Maximize-Throughput -j MARK --set-mark 0x4
$ipt -t mangle -A POST_MY -p tcp -m length --length :64 -j MARK --set-mark 0x1
# маленькие пакеты
# скорее всего ACK-пакеты
#set -x
# SSH
$ipt -t mangle -A POST_MY -p tcp -m tcp --sport 22 -j MARK --set-mark 0x1
# Голсовая почта
$ipt -t mangle -A POST_MY -p tcp -m tcp --sport 5038 -j MARK --set-mark 0x1
#$ipt -t mangle -A PRE_MY -p tcp -m tcp --sport 2000 -j MARK --set-mark 0x1
# SYN
$ipt -t mangle -A POST_MY -p tcp -m tcp --tcp-flags SYN,RST,ACK, SYN -j MARK --set-mark 0x1
# DNS
$ipt -t mangle -A POST_MY -p UDP -j MARK --set-mark 1
$ipt -t mangle -A POST_MY -p tcp -m tcp --sport 53 -j MARK --set-mark 1
#set +x
# HTTP трафик
$ipt -t mangle -A POST_MY -m layer7 --l7proto http -j MARK --set-mark 0x2
$ipt -t mangle -A PRE_MY -p tcp -m layer7 --l7proto http -j MARK --set-mark 0x2
# Плохие пользователи
$ipt -t mangle -A POSTROUTING -o ppp+ -p tcp -s $ip_bad/255.255.255.255 -j MARK --set-mark 0x4
$ipt -t mangle -A POSTROUTING -o ppp+ -p tcp -d $ip_bad/255.255.255.255 -j MARK --set-mark 0x4
$ipt -t mangle -A POSTROUTING -o ppp+ -p tcp -s $ip_bad1/255.255.255.255 -j MARK --set-mark 0x4
$ipt -t mangle -A POSTROUTING -o ppp+ -p tcp -d $ip_bad1/255.255.255.255 -j MARK --set-mark 0x4
# FTP Bittonet
$ipt -t mangle -A POST_MY -m layer7 --l7proto bittorrent -j MARK --set-mark 0x3
$ipt -t mangle -A POST_MY -m layer7 --l7proto directconnect -j MARK --set-mark 0x3
$ipt -t mangle -A POST_MY -m layer7 --l7proto ftp -j MARK --set-mark 0x3
# Паренаправляем очередь на IMQ
$ipt -t mangle -A POST_MY -j IMQ --todev 0
$ipt -t mangle -A FORWARD -i eth0 -o eth0 -j DROP
$ipt -t mangle -A FORWARD -i eth1 -o eth1 -j DROP
$ipt -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
####################################################
#
# Ограничение входящего потока (ограничивает пропускную способность до RATEDN)
# убедимся, что модуль imq загружен
#exit
modprobe imq numdevs=4
ip link set imq1 up
ip link set dev imq1 qlen 1000
# добавляем дисциплину - низкоприоритетный класс по умолчанию 1:21
tc qdisc add dev imq1 handle 1: root htb default 21
# добавляем общее ограничение скорости по классу
tc class add dev imq1 parent 1: classid 1:1 htb rate ${RATEDN}kbit
# добавляем подклассы - TCP traffic in 21, non TCP traffic in 20
#
tc class add dev imq1 parent 1:1 classid 1:20 htb rate $[$RATEDN/2]kbit ceil ${RATEDN}kbit prio 0
tc class add dev imq1 parent 1:1 classid 1:21 htb rate $[$RATEDN/2]kbit ceil ${RATEDN}kbit prio 1
# подключаем дисциплины обработки очереди к подклассам - здесь мы используем SFQ для каждого класса.
# SFQ обеспечит почти честное деление полосы пропускания между соединениями
# внутри каждого класса.
tc qdisc add dev imq1 parent 1:20 handle 20: sfq perturb 10
tc qdisc add dev imq1 parent 1:21 handle 21: red limit 1000000 min 5000 max 100000 avpkt 1000 burst 50
# направляем трафик в классы по fwmark - мы направляем трафик в классы, в соответствии со значением
# fwmark установленном на пакете (мы будем устанавливать это
# значение утилитой iptables позже). Обратите внимание, что
# выше мы установили класс по умолчанию 1:26, так что
# немаркированные пакеты (или с неизвестными значениями fwmark
# будут направлены в низкоприоритетный класс.
tc filter add dev imq1 parent 1:0 prio 0 protocol ip handle 20 fw flowid 1:20
tc filter add dev imq1 parent 1:0 prio 0 protocol ip handle 21 fw flowid 1:21
# добавить цепочку MYSHAPER-OUT в таблицу mangle - сейчас мы настроим таблицу, которую будем
# использовать для фильтрации и установки fwmark
$ipt -t mangle -N MYSHAPER-IN
$ipt -t mangle -I PREROUTING -i $DEV_OUT -j MYSHAPER-IN
# маркируем пакеты с помощью fwmark - устанавливаем значения 20-26 в зависимости от
# нужного класса. Высший приоритет - 20.
$ipt -t mangle -A MYSHAPER-IN -p ! tcp -j MARK --set-mark 20 # Маркировать не-tcp пакеты как высокоприоритетные
$ipt -t mangle -A MYSHAPER-IN -p tcp -m length --length :64 -j MARK --set-mark 20 # маленькие TCP-пакеты - вероято ACK
$ipt -t mangle -A MYSHAPER-IN -p tcp --dport ssh -j MARK --set-mark 20 # secure shell
$ipt -t mangle -A MYSHAPER-IN -p tcp --sport ssh -j MARK --set-mark 20 # secure shell
#$ipt -t mangle -A MYSHAPER-IN -p tcp --dport telnet -j MARK --set-mark 20 # telnet (ew...)
#$ipt -t mangle -A MYSHAPER-IN -p tcp --sport telnet -j MARK --set-mark 20 # telnet (ew...)
$ipt -t mangle -A MYSHAPER-IN -m mark --mark 0 -j MARK --set-mark 21 # избыточно - маркировать немаркированные
# пакеты как 26 (низкий приоритет)
# Наконец, пропустить все эти пакеты через imq0
$ipt -t mangle -A MYSHAPER-IN -j IMQ --todev 1
# Конец ограничения входящего потока
#
####################################################
Скрипт по сбросу всех установок
Файл high_speed.sh
#!/bin/bash #set -x # Внутренняя сеть VPN in_net=172.16.131.0/24 # Сбросить все в известное состояние (очищеное) $ipr qdisc del dev imq0 root 2> /dev/null > /dev/null $ipr qdisc del dev imq1 root 2> /dev/null > /dev/null # очистка таблицы mangle $ipt -t mangle -F $ipr qdisc del dev imq0 root &> /dev/null $ipr qdisc del dev imq1 root &> /dev/null $ipt -t mangle -D POSTROUTING -o ppp+ -d $in_net -j POST_MY 2> /dev/null > /dev/null $ipt -t mangle -F POST_MY 2> /dev/null > /dev/null $ipt -t mangle -X POST_MY 2> /dev/null > /dev/null $ipt -t mangle -F MYSHAPER-IN 2> /dev/null > /dev/null $ipt -t mangle -X MYSHAPER-IN 2> /dev/null > /dev/null $ipt -t mangle -D PREROUTING -i ppp+ -s $in_net -j PRE_MY 2> /dev/null > /dev/null $ipt -t mangle -F PRE_MY 2> /dev/null > /dev/null $ipt -t mangle -X PRE_MY 2> /dev/null > /dev/null ip link set imq0 down 2> /dev/null > /dev/null ip link set imq1 down 2> /dev/null > /dev/null rmmod imq 2> /dev/null > /dev/null
Тестирование
С помощью команды
$/usr/local/sbin/iptables -L -n -v -t mangle
Можно посмотреть цепочки таблицы mangle и попадает туда трафик или нет
С помощью команды
/usr/sbin/tc -s class show dev imq0
можно просмотреть очереди и их изменения.