LINUX.ORG.RU
ФорумAdmin

Снова shaper, в чем ошибка??


0

0

Хм.. вот и моя очередь разбираться с этим чудом, почитал документацию с opennetа, составил скрипт, но все равно не работает, в чем здесь может быть ошибка ??
Сам скрипт выполняется без ошибок и с виду даже работает, iptables пакеты маркирует, htb по группам раскидывает, но до сих пор получаю жалобы на тормоза в варкрафте, да и по интернету серфить при запущенном торренте не очень удается. Основная задача обеспечить работу варкрафта на соседнем компьютере, на сколько разобрался выставление приоритета применяется вне зависимости от того, локальный это трафик либо транслируемый через NAT, или я ошибаюсь?

PS: Все это запущено на родном дебиановском ядре, без патчей.
PPS: про то, что шейпится только исходящий трафик знаю, название цепоки SHAPER-IN взято из какого-то скрипта, да вот все не переименовалось.
#------------------------------------------------------------------------------ -
#Для шейпера
TC=/sbin/tc
#actually 256, но для того, чтобы реально управлять с приоритетом необходимо резать канал примерно на 25%
RATE_IN="192"

# Внешняя карта
EXTIF="eth1"
EXTIP="192.168.10.7"
EXTBC="255.255.255.0"
EXTNET=$EXTIP/$EXTBC

# Внутрисетевая карта
INTIF="eth0"
INTIP="192.168.20.1"
INTBC="255.255.255.0"
INTNET=$INTIP/$INTBC

# WiFi карта
WIFIIF="ath0"
WIFIIP="192.168.40.1"
WIFIBC="255.255.255.0"
WIFINET=$WIFIIP/WIFIBC

# Loop device/localhost
LPDIF="lo"
LPDIP="127.0.0.1"
LPDBC="255.0.0.0"
LPDNET="$LPDIP/$LPDBC"
#ШЕЙПЕР

# Создадим с помощью HTB классы :
# Задаем корневую дисциплиену
$TC qdisc add dev $EXTIF root handle 1:0 htb default 50
# Задаем корневоой класс
$TC class add dev $EXTIF parent 1:0 classid 1:1 htb rate ${RATE_IN}kbit burst 15k
# Создаём подклассы
# 2 класса, для которых резервируется скорость - от $RATE_IN/8 - до $RATE_IN/2
$TC class add dev $EXTIF parent 1:1 classid 1:10 htb rate $[$RATE_IN/8]kbit ceil $[$RATE_IN/2]kbit burst 15k prio 0
$TC class add dev $EXTIF parent 1:1 classid 1:20 htb rate $[$RATE_IN/8]kbit ceil $[$RATE_IN/2]kbit burst 15k prio 1
# 3 класса, для которых резервируется постоянная скорость в $RATE_IN/4
$TC class add dev $EXTIF parent 1:1 classid 1:30 htb rate $[$RATE_IN/4]kbit ceil ${RATE_IN}kbit burst 15k prio 2
$TC class add dev $EXTIF parent 1:1 classid 1:40 htb rate $[$RATE_IN/4]kbit ceil ${RATE_IN}kbit burst 15k prio 3
$TC class add dev $EXTIF parent 1:1 classid 1:50 htb rate $[$RATE_IN/4]kbit ceil ${RATE_IN}kbit burst 15k prio 4
# Задаем подклассовые дисциплины
# Этим мы сказали что "резать" трафик в классе 1:10 будем по алгоритму RED(Random Early Detection).
# Параметры для RED вычисляются следующим образом : min = (задержка)*bandwidt(bits/s), burst= (2*min+max)/(3*avpkt)), limit= 10*max,max > 2*min, avpkt 1000 для M$
#$TC qdisc add dev $EXTIF parent 1:10 red min 1600 max 3210 burst 2 limit 2560 avpkt 1000

# в остальных классах по алгоритму SFQ.
$TC qdisc add dev $EXTIF parent 1:10 handle 10: sfq perturb 10
$TC qdisc add dev $EXTIF parent 1:20 handle 20: sfq perturb 10
$TC qdisc add dev $EXTIF parent 1:30 handle 30: sfq perturb 10
$TC qdisc add dev $EXTIF parent 1:40 handle 40: sfq perturb 10
$TC qdisc add dev $EXTIF parent 1:50 handle 50: sfq perturb 10

# Добавить цепочку SHAPER-IN в таблицу mangle - сейчас мы настроим таблицу,которую будем использовать для фильтрациии установки fwmark
$IPTABLES -t mangle -N SHAPER-IN
$IPTABLES -t mangle -I POSTROUTING -o $EXTIF -j SHAPER-IN
# Маркируем пакеты с помощью fwmark - устанавливаем значения 10-99 в зависимости от нужного класса.
# Низкоприоритетный трафик
#$IPTABLES -t mangle -A SHAPER-IN -p tcp --sport 0:1024 -j MARK --set-mark 50
#$IPTABLES -t mangle -A SHAPER-IN -p tcp --dport 0:1024 -j MARK --set-mark 50
# secure shell
$IPTABLES -t mangle -A SHAPER-IN -p tcp --dport $ssh -j MARK --set-mark 10
$IPTABLES -t mangle -A SHAPER-IN -p tcp --sport $ssh -j MARK --set-mark 10
# ICMP (ping) - высокий приоритет,
$IPTABLES -t mangle -A SHAPER-IN -p icmp -j MARK --set-mark 20
# DNS (маленькие пакеты)
$IPTABLES -t mangle -A SHAPER-IN -p udp -j MARK --set-mark 20
# icq
$IPTABLES -t mangle -A SHAPER-IN -p tcp --sport $icq -j MARK --set-mark 20
# jabber
$IPTABLES -t mangle -A SHAPER-IN -p tcp --sport $xmpp -j MARK --set-mark 20
# WOW
$IPTABLES -t mangle -A SHAPER-IN -p tcp --sport $wow -j MARK --set-mark 20
$IPTABLES -t mangle -A SHAPER-IN -p tcp --dport $wow -j MARK --set-mark 20
# http
$IPTABLES -t mangle -A SHAPER-IN -p tcp --sport $http -j MARK --set-mark 30
$IPTABLES -t mangle -A SHAPER-IN -p tcp --dport $http -j MARK --set-mark 30
# https
$IPTABLES -t mangle -A SHAPER-IN -p tcp --sport $https -j MARK --set-mark 30
# избыточно - смаркировать все неотмаркированые пакеты как 50 (низкий проиритет)
$IPTABLES -t mangle -A SHAPER-IN -m mark --mark 0 -j MARK --set-mark 50

#Задаем подклассовые фильтры: привязывающие трафик,принадлежащий конкретному классу
$TC filter add dev $EXTIF protocol ip parent 1:0 prio 0 handle 10 fw classid 1:10
$TC filter add dev $EXTIF protocol ip parent 1:0 prio 1 handle 20 fw classid 1:20
$TC filter add dev $EXTIF protocol ip parent 1:0 prio 2 handle 30 fw classid 1:30
$TC filter add dev $EXTIF protocol ip parent 1:0 prio 3 handle 40 fw classid 1:40
$TC filter add dev $EXTIF protocol ip parent 1:0 prio 4 handle 50 fw classid 1:50

echo "Shaper on $EXTIF started ($RATE_IN kbit/s)"

#------------------------------------------------------------------------------ -


iptables пакеты маркирует:

iptables -L -n -v -t mangle

Chain PREROUTING (policy ACCEPT 663K packets, 335M bytes)
pkts bytes target prot opt in out source destination

Chain INPUT (policy ACCEPT 633K packets, 332M bytes)
pkts bytes target prot opt in out source destination

Chain FORWARD (policy ACCEPT 29389 packets, 3763K bytes)
pkts bytes target prot opt in out source destination

Chain OUTPUT (policy ACCEPT 633K packets, 214M bytes)
pkts bytes target prot opt in out source destination
2 246 TTL icmp -- * * 0.0.0.0/0 0.0.0.0/0 TTL set to 128

Chain POSTROUTING (policy ACCEPT 663K packets, 218M bytes)
pkts bytes target prot opt in out source destination
50036 3403K SHAPER-IN all -- * eth1 0.0.0.0/0 0.0.0.0/0

Chain SHAPER-IN (1 references)
pkts bytes target prot opt in out source destination
0 0 MARK tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 MARK xset 0xa/0xffffffff
0 0 MARK tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp spt:22 MARK xset 0xa/0xffffffff
2 246 MARK icmp -- * * 0.0.0.0/0 0.0.0.0/0 MARK xset 0x14/0xffffffff
32 2062 MARK udp -- * * 0.0.0.0/0 0.0.0.0/0 MARK xset 0x14/0xffffffff
0 0 MARK tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp spt:5190 MARK xset 0x14/0xffffffff
0 0 MARK tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp spt:5222 MARK xset 0x14/0xffffffff
0 0 MARK tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp spt:8129 MARK xset 0x14/0xffffffff
3311 195K MARK tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8129 MARK xset 0x14/0xffffffff
0 0 MARK tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp spt:3128 MARK xset 0x1e/0xffffffff
0 0 MARK tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp spt:80 MARK xset 0x1e/0xffffffff
46608 3201K MARK tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 MARK xset 0x1e/0xffffffff
0 0 MARK tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp spt:443 MARK xset 0x1e/0xffffffff
79 4315 MARK all -- * * 0.0.0.0/0 0.0.0.0/0 mark match 0x0 MARK xset 0x32/0xffffffff

sdm
() автор топика

А htb раскидывает по классам:
tc -s -d qdisc show dev eth1

qdisc htb 1: root r2q 10 default 50 direct_packets_stat 0 ver 3.17
Sent 8439910 bytes 102506 pkt (dropped 0, overlimits 3610 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
qdisc sfq 10: parent 1:10 limit 127p quantum 1514b flows 127/1024 perturb 10sec
Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
qdisc sfq 20: parent 1:20 limit 127p quantum 1514b flows 127/1024 perturb 10sec
Sent 994510 bytes 14064 pkt (dropped 0, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
qdisc sfq 30: parent 1:30 limit 127p quantum 1514b flows 127/1024 perturb 10sec
Sent 7431841 bytes 88229 pkt (dropped 0, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
qdisc sfq 40: parent 1:40 limit 127p quantum 1514b flows 127/1024 perturb 10sec
Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
qdisc sfq 50: parent 1:50 limit 127p quantum 1514b flows 127/1024 perturb 10sec
Sent 13559 bytes 213 pkt (dropped 0, overlimits 0 requeues 0)

sdm
() автор топика

Но скорость от этого не гарантируется, и не меняется. Пытался выставить для http трафика ограничение от все/4 до все/2

$TC class add dev $EXTIF parent 1:1 classid 1:30 htb rate $[$RATE_IN/4]kbit ceil $[$RATE_IN/2]kbit burst 15k prio 2

,а тот все равно весь канал отьедает, чувствую ошибка где-то в описании подклассов, но найти не могу :(

sdm
() автор топика

А интернет то у вас с какой стороны, на каком интерфейсе? Просто в зачем то пишете пары правил (--dport и --sport), а срабатывает только --dport, зачем лишние правила? А так вроде получается, например, в случае с http, что вы ограничиваете скорость пакетов, идущих на порт 80, то есть http-запросов и SYN-пакетов, а сам http-трафик не ограничивается.

mky ★★★★★
()
Ответ на: комментарий от mky

>А интернет то у вас с какой стороны, на каком интерфейсе?
# Внешняя карта EXTIF="eth1" подключена к adsl модему она и является выходом,
>зачем лишние правила

уже несколько дней с этим скриптом борюсь, вот и пробую различные варианты.
>а сам http-трафик не ограничивается

Как я представляю ограничиваются ответы с моего компьютера о том, что http трафик получен, (протокол tcp должен получать/передавать информацию о том, что пакеты переданы), но..., возможно это не верно, нужно еще чего-нибуть почитать, тем не менее, в некоторых примерах такой вариант работает.

Уже после набора сообщения почитал немного информации, не знаю как оно должно работать/работает у других но, получается что шейпер имеет смысл только для компьютеров которые natятся, для самого сервера, шейпер имеет смысл лишь при раздаче (например тех же торрентов), а в случае заргузки любая служба все равно забирает весь канал ?. Тогда в моем случае шейпер не поможет?

sdm
() автор топика

ИТОГО: Получается что скрипт работает :) , но поднимать торрент нужно на соседнем компьютере, и там же качать что нужно по http, не совсем то, что я хотел :( , но все же вариант.

sdm
() автор топика
Ответ на: комментарий от sdm

Для ограничения скорости закачек с самого сервера есть IMQ и IFB, это псевдо-интрефейсы, через которые проходит весь трафик. Гуглите. Но ядро надо патчить.

На торренты, в принципе, должно распростроняться ограничение на исходящий трафик, там, вроде было, чем медленне отдаёшь, тем медленне получаешь.

Ну и можно попробовать рубить трафик ingress, только там ещё не будет проведено отNATивание пакетов, не будет видно чей это трафик и его не получиться рубить по маркировке в iptables. Ищите по словам "ingress traffic policing",
http://www.linux.org/docs/ldp/howto/Adv-Routing-HOWTO/lartc.adv-qdisc.ingress...
http://www.linux.org/docs/ldp/howto/Adv-Routing-HOWTO/lartc.cookbook.ultimate...

Только, это будет простая рубка лишних пакетов, расчитанная на протоколы с подтверждением доставки (TCP), но можно будет прижать весь входящий http-трафик, как то так:
tc qdisc add dev eth1 handle ffff: ingress
tc filter add dev eth1 parent ffff: protocol ip prio 50 \
u32 match u32 00500000 ffff0000 at nexthdr+0 police rate 128kbit \
burst 10k drop flowid :1

И написать скрипт, который "смотрит" наличие отркытой сессии в WoW и отключает торрент и зажимает другой трафик...

mky ★★★★★
()
Ответ на: комментарий от sdm

На дефолтном дебиановском ядре (lenny 2.6.26) отработало modprobe ifb lsmod | grep ifb ifb 8576 0 получается что патчей не нужно, думаю через некоторое время родится рабочий скрипт :)

sdm
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.