iptables + tc -> проблема нарезки скорости

Автор viking, 05 декабря 2015, 17:39:49

« назад - далее »

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

viking

Здравствуйте джедаи и те кто только учится.
Пытался я нарезать в своей локальной сети скорость всем пользователям, да вот не преуспел в этом:

Открыть содержимое (спойлер)

# uname -a
Linux orion 3.2.0-4-amd64 #1 SMP Debian 3.2.68-1+deb7u6 x86_64 GNU/Linux

#iptables -L -v -n -t mangle
.....
Chain FORWARD (policy ACCEPT 1324K packets, 1662M bytes)
pkts bytes target     prot opt in     out     source               destination         
30555   73M MARK       all  --  *      *       0.0.0.0/0            10.1.0.25            MARK set 0x84
13796   40M MARK       all  --  *      *       10.1.0.25            0.0.0.0/0            MARK set 0x1024
......

# htb stats
### wan: queueing disciplines

qdisc htb 1: root refcnt 2 r2q 100 default 0 direct_packets_stat 2582868
Sent 1638413450 bytes 2814134 pkt (dropped 0, overlimits 93809 requeues 88)
backlog 0b 0p requeues 88

### wan: traffic classes

class htb 1:4132 parent 1:2 prio 0 rate 10240Kbit ceil 10240Kbit burst 1598b cburst 1598b
Sent 40336357 bytes 39168 pkt (dropped 0, overlimits 0 requeues 0)
rate 40bit 0pps backlog 0b 0p requeues 0
lended: 13810 borrowed: 0 giants: 0
tokens: 18656 ctokens: 18656

class htb 1:2 root rate 100000Kbit ceil 100000Kbit burst 1600b cburst 1600b
Sent 165827493 bytes 150565 pkt (dropped 0, overlimits 0 requeues 0)
rate 40bit 0pps backlog 0b 0p requeues 0
lended: 0 borrowed: 0 giants: 0
tokens: 1922 ctokens: 1922

### wan: filtering rules

filter parent 1: protocol ip pref 3 fw
filter parent 1: protocol ip pref 3 fw handle 0x1024 classid 1:4132

### lan: queueing disciplines

qdisc htb 1: root refcnt 2 r2q 100 default 0 direct_packets_stat 4174351
Sent 5028324300 bytes 4174393 pkt (dropped 0, overlimits 0 requeues 3877)
backlog 0b 0p requeues 3877

### lan: traffic classes

class htb 1:2 root prio 0 rate 100000Kbit ceil 100000Kbit burst 1600b cburst 1600b
Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
lended: 0 borrowed: 0 giants: 0
tokens: 2000 ctokens: 2000

### lan.300: traffic classes

class htb 1:132 parent 1:2 prio 0 rate 10240Kbit ceil 10240Kbit burst 1598b cburst 1598b
Sent 9090411 bytes 10599 pkt (dropped 303, overlimits 0 requeues 0)
rate 40bit 0pps backlog 0b 0p requeues 0
lended: 8869 borrowed: 0 giants: 0
tokens: 18656 ctokens: 18656

class htb 1:2 root rate 100000Kbit ceil 100000Kbit burst 1600b cburst 1600b
Sent 35368963 bytes 44001 pkt (dropped 0, overlimits 0 requeues 0)
rate 40bit 0pps backlog 0b 0p requeues 0
lended: 0 borrowed: 0 giants: 0
tokens: 1922 ctokens: 1922

### lan.300: filtering rules

filter parent 1: protocol ip pref 3 fw
filter parent 1: protocol ip pref 3 fw handle 0x84 classid 1:132
[свернуть]

И вот что самое интересное:
Если делать speedtest от клиента того самого 10.1.0.25, то исходящая скорость ровно 10 Mbps  (или 20 Mbps - столько сколько и укажу), а вот входящая скорость  выше 5 Mbps не прыгала (что бы я не указывал в TC)
Трафик ходит между интерфейсами wan <-> lan.300

кто что может подсказать в этой ситуации? :-\
Debian squeez (Linux 2.6.32-5-686 i686 GNU/Linux), GDM 2.30.5

GrDEV

Почему трафик маркируете по-разному?

Попробуйте как то так:


#!/bin/bash

IPT="/sbin/iptables"
TC="/sbin/tc"

if_wan="eth0"
if_lan="eth1"

ID=25

let id=${ID}+5000

$IPT -t mangle -D FORWARD -s 0/0 -d 10.1.0.25/32  -j MARK --set-mark $id
$IPT -t mangle -D FORWARD -d 0/0 -s 10.1.0.25/32 -j MARK --set-mark $id

$IPT -D FORWARD -s 0/0 -d 10.1.0.25/32 -j ACCEPT
$IPT -D FORWARD -d 0/0 -s 10.1.0.25/32 -j ACCEPT

# UPLOAD speed
$TC filter add dev $if_wan parent 1: protocol ip prio 3 handle $id fw classid 1:$id
$TC class add dev $if_wan parent 1:1 classid 1:$id htb rate $4kbit burst 20k
# DOWNLOAD speed
$TC filter add dev $if_lan parent 1: protocol ip prio 3 handle $id fw classid 1:$id
$TC class add dev $if_lan parent 1:1 classid 1:$id htb rate $5kbit burst 20k

viking

#2
извини, наверное стоило сразу написать в таком виде:


IFUP="wan"
IFDOWN="lan.300"
ID=$1
SCOUNT="Kbit"
SPEED=`$2`
UPSPEED=`$2`
IP="10.1.0.$ID"

declare -i mark=$ID+101
declare -i mark1=$ID+4101

IPT="/sbin/iptables"
tc="/sbin/tc"

# Маркируем входящий трафик
$IPT -t mangle -A FORWARD -d $IP -j MARK --set-mark $mark

# Маркируем исходящий трафик
$IPT -t mangle -A FORWARD -s $IP -j MARK --set-mark $mark1

#Download
$tc class  add dev $IFDOWN parent 1:2 classid 1:$mark htb rate $SPEED$SCOUNT
$tc filter add dev $IFDOWN parent 1: protocol ip prio 3 handle $mark fw classid 1:$mark

#Upload
$tc class  add dev $IFUP parent 1:2 classid 1:$mark1 htb rate $UPSPEED$SCOUNT
$tc filter add dev $IFUP parent 1: protocol ip prio 3 handle $mark1 fw classid 1:$mark1



Cообщение объединено 16 декабря 2015, 19:36:53

Цитата: GrDEV от 14 декабря 2015, 22:04:48
$IPT -t mangle -D FORWARD -s 0/0 -d 10.1.0.25/32  -j MARK --set-mark $id
$IPT -t mangle -D FORWARD -d 0/0 -s 10.1.0.25/32 -j MARK --set-mark $id

$IPT -D FORWARD -s 0/0 -d 10.1.0.25/32 -j ACCEPT
$IPT -D FORWARD -d 0/0 -s 10.1.0.25/32 -j ACCEPT

наверное ты имел в виду "$IPT -A"

Cообщение объединено 16 декабря 2015, 19:50:41

Цитата: GrDEV от 14 декабря 2015, 22:04:48Почему трафик маркируете по-разному?
нет разной маркировки, просто
в iptables значения передаются в 10-чном виде, а в выводе  htb stats  эти же метки отображаются в 16-ричном
Debian squeez (Linux 2.6.32-5-686 i686 GNU/Linux), GDM 2.30.5

viking

Блин ребята ну неужели никто ничего не подскажет?
Debian squeez (Linux 2.6.32-5-686 i686 GNU/Linux), GDM 2.30.5

gardarea51

А зачем для такого фильтра вообще нужна маркировка, используйте классификатор u32. Кароче классифицируйте трафик самим шейпером.
К тому же в шейпере для htp у васне указан ceil, только rate, я не уверен, но меби дело в этом.
И да, какую литературу читали перед ваянием шейпера?

viking

ЦитироватьА зачем для такого фильтра вообще нужна маркировка, используйте классификатор u32. Кароче классифицируйте трафик самим шейпером.
Да вы правы так действительно удобнее, а самое главное нет этого неясного глюка с входящей скоростью трафика.

Но возникает другая интересная ситуация если подобным же методом нарезать скорость исходящую, то ничего не выходит. На сколько понял связанно это с NAT-ом. Дело в том что шейпер отрабатывает уже после преобразований серых IP в Белые. а значит в правиле для исходящего трафика должен участвовать внешний IP и он один для всех. И как следствие не получается разграничить исходящую скорость меду  разными клиентскими машинами.

На данный момент все работает так:

# Маркируем исходящий трафик
$IPT -t mangle -A FORWARD -s $IP -j MARK --set-mark $mark1

#Upload
$tc class  add dev $IFUP parent 1:2 classid 1:$mark1 htb rate $UPSPEED$SCOUNT
$tc filter add dev $IFUP parent 1: protocol ip prio 3 handle $mark1 fw classid 1:$mark1

#Download
$tc class  add dev $IFDOWN      parent 1:0      classid 1:$mark         htb rate $SPEED$SCOUNT burst 4k prio 1
$tc qdisc  add dev $IFDOWN      parent 1:$mark  handle $mark:           sfq perturb 10 quantum 1500
$tc filter add dev $IFDOWN      parent 1:0      protocol ip prio $mark  u32 match ip dst $IP flowid 1:$mark


Вопрос можно ли это сделать еще более красиво?

ЦитироватьК тому же в шейпере для htp у васне указан ceil, только rate, я не уверен, но меби дело в этом.
Нет если параметр ceil не указывается, то он принимается равным rate

ЦитироватьИ да, какую литературу читали перед ваянием шейпера?
Большей частью форумы и хабр. Вообще для меня эта тема до сих пор является весьма темной.
Debian squeez (Linux 2.6.32-5-686 i686 GNU/Linux), GDM 2.30.5

gardarea51

Почитайте "повесть о linux и управлении трафиком".
Есть еще интересная литература, забыл название, но тоже довольно старенькая.

Насчет нарезки исходящего, да, тут видимо только метками iptables.