("Alex2ndr") писал(а):В тот скрипте что вы привели внешний интерфейс по прежнему eth0. Хотя у вас должен быть ppp0.
Да, привел оригинальный скрипт т.к. в нем изначально не менял ничего кроме интерфейса. Вот скрипт, несколько измененный в соотв. с вашими замечаниями. Кроме того добавил правила чтобы http-трафик маркировался как высокоприоритетный, а торент-трафик, как низкоприоритетный :
Код: Выделить всё
DEV=ppp0
RATEUP=410
RATEDN=410 # Обратите внимание, что это значительно меньше реального значения 1500.
# Из-за этого вы можете не захотеть использовать ограничение входящего трафика
# пока оно не будет реализовано лучше, например на основе изменения размера окна.
#
# Конец раздела настроек
#
if [ "$1" = "status" ]
then
echo "[qdisc]"
tc -s qdisc show dev $DEV
tc -s qdisc show dev imq0
echo "[class]"
tc -s class show dev $DEV
tc -s class show dev imq0
echo "[filter]"
tc -s filter show dev $DEV
tc -s filter show dev imq0
echo "[iptables]"
iptables -t mangle -L MYSHAPER-OUT -v -x 2> /dev/null
iptables -t mangle -L MYSHAPER-IN -v -x 2> /dev/null
exit
fi
# Сбросить все в известное состояние (очищеное)
tc qdisc del dev $DEV root 2> /dev/null > /dev/null
tc qdisc del dev imq0 root 2> /dev/null > /dev/null
iptables -t mangle -D POSTROUTING -o $DEV -j MYSHAPER-OUT 2> /dev/null > /dev/null
iptables -t mangle -F MYSHAPER-OUT 2> /dev/null > /dev/null
iptables -t mangle -X MYSHAPER-OUT 2> /dev/null > /dev/null
iptables -t mangle -D PREROUTING -i $DEV -j MYSHAPER-IN 2> /dev/null > /dev/null
iptables -t mangle -F MYSHAPER-IN 2> /dev/null > /dev/null
iptables -t mangle -X MYSHAPER-IN 2> /dev/null > /dev/null
ip link set imq0 down 2> /dev/null > /dev/null
rmmod imq 2> /dev/null > /dev/null
if [ "$1" = "stop" ]
then
echo "Shaping removed on $DEV."
exit
fi
###########################################################
#
# Ограничение исходящего потока (ограничивает пропускную способность до RATEUP)
# установить размер очереди, соответствующий двухсекундной задержке на низкоприоритетном трафике
ip link set dev $DEV qlen 30
# изменяем значение mtu на исходящем устройстве. Понижение значения mtu уменьшит задержку, но
# и немного понизит пропускную способность из-за увеличения числа
# заголовков протоколов IP и TCP .
ip link set dev $DEV mtu 1000
# добавить корневую дисциплину HTB
tc qdisc add dev $DEV root handle 1: htb default 26
# добавить общее ограничение скорости по классу
tc class add dev $DEV parent 1: classid 1:1 htb rate ${RATEUP}kbit
# добавляем подклассы - мы гарантируем каждаму классу МИНИМУМ "честную часть" полосы пропускания.
# Этим способом мы избегаем возможности "голодания" классов. Каждому классу
# разрешается занимать всю полосу пропускания, если другие классы не
# используются.
tc class add dev $DEV parent 1:1 classid 1:20 htb rate $[$RATEUP/7]kbit ceil ${RATEUP}kbit prio 0
tc class add dev $DEV parent 1:1 classid 1:21 htb rate $[$RATEUP/7]kbit ceil ${RATEUP}kbit prio 1
tc class add dev $DEV parent 1:1 classid 1:22 htb rate $[$RATEUP/7]kbit ceil ${RATEUP}kbit prio 2
tc class add dev $DEV parent 1:1 classid 1:23 htb rate $[$RATEUP/7]kbit ceil ${RATEUP}kbit prio 3
tc class add dev $DEV parent 1:1 classid 1:24 htb rate $[$RATEUP/7]kbit ceil ${RATEUP}kbit prio 4
tc class add dev $DEV parent 1:1 classid 1:25 htb rate $[$RATEUP/7]kbit ceil ${RATEUP}kbit prio 5
tc class add dev $DEV parent 1:1 classid 1:26 htb rate $[$RATEUP/7]kbit ceil ${RATEUP}kbit prio 6
# подключаем дисциплины обработки очереди к подклассам - здесь мы используем SFQ для каждого класса.
# SFQ обеспечит почти честное деление полосы пропусканиямежду соединениями
# внутри каждого класса.
tc qdisc add dev $DEV parent 1:20 handle 20: sfq perturb 10
tc qdisc add dev $DEV parent 1:21 handle 21: sfq perturb 10
tc qdisc add dev $DEV parent 1:22 handle 22: sfq perturb 10
tc qdisc add dev $DEV parent 1:23 handle 23: sfq perturb 10
tc qdisc add dev $DEV parent 1:24 handle 24: sfq perturb 10
tc qdisc add dev $DEV parent 1:25 handle 25: sfq perturb 10
tc qdisc add dev $DEV parent 1:26 handle 26: sfq perturb 10
# направляем трафик в классы по fwmark - мы направляем трафик в классы, в соответствии со значением
# fwmark установленном на пакете (мы будем устанавливать это
# значение утилитой iptables позже). Обратите внимание, что
# выше мы установили класс по умолчанию1:26, так что
# немаркированные пакеты (или с неизвестными значениями fwmark
# будут направлены в низкоприоритетный класс.
tc filter add dev $DEV parent 1:0 prio 0 protocol ip handle 20 fw flowid 1:20
tc filter add dev $DEV parent 1:0 prio 0 protocol ip handle 21 fw flowid 1:21
tc filter add dev $DEV parent 1:0 prio 0 protocol ip handle 22 fw flowid 1:22
tc filter add dev $DEV parent 1:0 prio 0 protocol ip handle 23 fw flowid 1:23
tc filter add dev $DEV parent 1:0 prio 0 protocol ip handle 24 fw flowid 1:24
tc filter add dev $DEV parent 1:0 prio 0 protocol ip handle 25 fw flowid 1:25
tc filter add dev $DEV parent 1:0 prio 0 protocol ip handle 26 fw flowid 1:26
# добавить цепочку MYSHAPER-OUT в таблицу mangle - сейчас мы настроим таблицу,которую будем
# использовать для фильтрациии установки fwmark
iptables -t mangle -N MYSHAPER-OUT
iptables -t mangle -I POSTROUTING -o $DEV -j MYSHAPER-OUT
# маркируем пакеты с помощью fwmark - устанавливаем значения 20-26 в зависимости от
# нужного класса. Высший приоритет - 20.
iptables -t mangle -A MYSHAPER-OUT -p tcp --sport 0:1024 -j MARK --set-mark 23
# Низкоприоритетный трафик
iptables -t mangle -A MYSHAPER-OUT -p tcp --dport 0:1024 -j MARK --set-mark 23
# ""
iptables -t mangle -A MYSHAPER-OUT -p tcp --dport 20 -j MARK --set-mark 26
# порт ftp-data, низкий приоритет
iptables -t mangle -A MYSHAPER-OUT -p tcp --dport 5190 -j MARK --set-mark 23
# интернет-пейджер aol
iptables -t mangle -A MYSHAPER-OUT -p icmp -j MARK --set-mark 20
# ICMP (ping) - высокий приоритет,
# будем удивлять друзей
iptables -t mangle -A MYSHAPER-OUT -p udp -j MARK --set-mark 21
# распознавание имен DNS (маленькие пакеты)
iptables -t mangle -A MYSHAPER-OUT -p tcp --dport ssh -j MARK --set-mark 22
# secure shell
iptables -t mangle -A MYSHAPER-OUT -p tcp --sport ssh -j MARK --set-mark 22
# secure shell
#http
iptables -t mangle -A MYSHAPER-OUT -p tcp --dport 80 -j MARK --set-mark 22
iptables -t mangle -A MYSHAPER-OUT -p tcp --sport 80 -j MARK --set-mark 22
#https
iptables -t mangle -A MYSHAPER-OUT -p tcp --dport 443 -j MARK --set-mark 22
iptables -t mangle -A MYSHAPER-OUT -p tcp --sport 443 -j MARK --set-mark 22
iptables -t mangle -A MYSHAPER-OUT -p tcp --dport telnet -j MARK --set-mark 22
# telnet (ew...)
iptables -t mangle -A MYSHAPER-OUT -p tcp --sport telnet -j MARK --set-mark 22
# telnet (ew...)
iptables -t mangle -A MYSHAPER-OUT -p ipv6-crypt -j MARK --set-mark 24
# IPSec - мы не знаем полезную нагрузку, однако...
iptables -t mangle -A MYSHAPER-OUT -p tcp --sport http -j MARK --set-mark 25
# локальный веб-сервер
iptables -t mangle -A MYSHAPER-OUT -p tcp -m length --length :64 -j MARK --set-mark 21 # маленькие пакеты
# скорее всего ACK-пакеты
iptables -t mangle -A MYSHAPER-OUT -m mark --mark 0 -j MARK --set-mark 26
# избыточно - смаркировать все неотмаркированые
# пакеты как 26 (низкий проиритет)
# Конец ограничения исходящего потока
#
####################################################
echo "Outbound shaping added to $DEV. Rate: ${RATEUP}Kbit/sec."
# Раскомментируйте следующую строку, если хотите ограничить только исходящий трафик.
# exit
####################################################
#
# Ограничение входящего потока (ограничивает пропускную способность до RATEDN)
# убедимся, что модуль imq загружен
modprobe imq numdevs=1
ip link set imq0 up
# добавляем дисциплину - низкоприоритетный класс по умолчанию 1:21
tc qdisc add dev imq0 handle 1: root htb default 21
# добавляем общее ограничение скорости по классу
tc class add dev imq0 parent 1: classid 1:1 htb rate ${RATEDN}kbit
# добавляем подклассы - TCP traffic in 21, non TCP traffic in 20
#
tc class add dev imq0 parent 1:1 classid 1:20 htb rate $[$RATEDN/2]kbit ceil ${RATEDN}kbit prio 0
tc class add dev imq0 parent 1:1 classid 1:21 htb rate $[$RATEDN/2]kbit ceil ${RATEDN}kbit prio 1
# подключаем дисциплины обработки очереди к подклассам - здесь мы используем SFQ для каждого класса.
# SFQ обеспечит почти честное деление полосы пропусканиямежду соединениями
# внутри каждого класса.
tc qdisc add dev imq0 parent 1:20 handle 20: sfq perturb 10
tc qdisc add dev imq0 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 imq0 parent 1:0 prio 0 protocol ip handle 20 fw flowid 1:20
tc filter add dev imq0 parent 1:0 prio 0 protocol ip handle 21 fw flowid 1:21
# добавить цепочку MYSHAPER-OUT в таблицу mangle - сейчас мы настроим таблицу,которую будем
# использовать для фильтрациии установки fwmark
iptables -t mangle -N MYSHAPER-IN
iptables -t mangle -I PREROUTING -i $DEV -j MYSHAPER-IN
# маркируем пакеты с помощью fwmark - устанавливаем значения 20-26 в зависимости от
# нужного класса. Высший приоритет - 20.
iptables -t mangle -A MYSHAPER-IN -p ! tcp -j MARK --set-mark 20 #
# Маркировать не-tcp пакеты как высокоприоритетные
iptables -t mangle -A MYSHAPER-IN -p tcp -m length --length :64 -j MARK --set-mark 20 # маленькие TCP-пакеты - вероято ACK
iptables -t mangle -A MYSHAPER-IN -p tcp --dport ssh -j MARK --set-mark 20 # secure shell
iptables -t mangle -A MYSHAPER-IN -p tcp --sport ssh -j MARK --set-mark 20 # secure shell
iptables -t mangle -A MYSHAPER-IN -p tcp --dport telnet -j MARK --set-mark 20 # telnet (ew...)
iptables -t mangle -A MYSHAPER-IN -p tcp --sport telnet -j MARK --set-mark 20 # telnet (ew...)
iptables -t mangle -A MYSHAPER-IN -m mark --mark 0 -j MARK --set-mark 21 # избыточно - маркировать немаркированные #
# пакеты как 26 (низкий приоритет)
#torrent
iptables -t mangle -A MYSHAPER-IN -p tcp --dport 6881 -j MARK --set-mark 26
iptables -t mangle -A MYSHAPER-IN -p tcp --sport 6881 -j MARK --set-mark 26
#http
iptables -t mangle -A MYSHAPER-IN -p tcp --dport 80 -j MARK --set-mark 21
iptables -t mangle -A MYSHAPER-IN -p tcp --sport 80 -j MARK --set-mark 21
# Наконец, пропустить все эти пакеты через imq0
iptables -t mangle -A MYSHAPER-IN -j IMQ
# Конец ограничения входящего потока
#
####################################################
echo "Inbound shaping added to $DEV. Rate: ${RATEDN}Kbit/sec."
1. А где полосы для IMQ?
2. Лучше показывайте с опцией -s - тогда можно будет посмотреть попадают ли хоть какие пакеты в ваши классы.
Код: Выделить всё
tc -s class show dev imq0
class htb 1:1 root rate 410000bit ceil 410000bit burst 1599b cburst 1599b
Sent 385906 bytes 602 pkt (dropped 0, overlimits 0 requeues 0)
rate 96608bit 20pps backlog 0b 0p requeues 0
lended: 129 borrowed: 0 giants: 0
tokens: 351728 ctokens: 351728
class htb 1:20 parent 1:1 leaf 20: prio 0 rate 205000bit ceil 410000bit burst 1599b cburst 1599b
Sent 15513 bytes 148 pkt (dropped 0, overlimits 0 requeues 0)
rate 5264bit 6pps backlog 0b 0p requeues 0
lended: 148 borrowed: 0 giants: 0
tokens: 700512 ctokens: 351728
class htb 1:21 parent 1:1 leaf 21: prio 1 rate 205000bit ceil 410000bit burst 1599b cburst 1599b
Sent 370393 bytes 454 pkt (dropped 0, overlimits 0 requeues 0)
rate 91344bit 14pps backlog 0b 0p requeues 0
lended: 325 borrowed: 129 giants: 0
tokens: 936594 ctokens: 468296
class red 21:1 parent 21:
Похоже, низкоприоритетный трафик (26-класс) сюда не попал?
1. 480 при 512 это слишком оптимистично. Поставьте 410.
Поставил
2. Где именно находитя торрент, http и прочие потребители? по отношению к шейперу?
Торрент находится там же, где и шейпер. Но вроде как это уже не имеет значения, если мы пропускаем весь трафик через IMQ?
http может находится как там же где и шейпер, так и на еще 2-х компах в сети.
В данном скрипте входящий трафик ограничивается более чем странно. Разделяется всего на 2 типа - приоритетный и не очень. В приоритетный попали telnet и ssh, а все остальные во второй. Так что разницы между http и torrent быть не должно. Еще между ними есть полоса для ACK пакетов, но ее трудно считать забивающей канал... Исходящий тоже странно разбивается... почитайте комментарии. Вообщем, могу посоветовать перебрать маркировку на нужные вам порты самостоятельно. И поработать над входящим трафиком - сделать большее число полос. Тогда результат должен быть более заметен.
Для начала хотелось проверить, как вообще это будет работать, поэтому взял готовый, заведомо рабочий скрипт. Кроме того все прочие скрипты, найденные мной для примера были содраны с приведенного выше.