Strona 1 z 1

HTB i wysyłanie przez trzy łącza DSL

: 17 lutego 2009, 15:49
autor: smirnof
Witam.

Z Debianem zaczynam swoją przygodę i na razie jeszcze bardzo cienki jestem. Mam problem z poprawnym skonfigurowaniu kolejek HTB dla trzech łącz DSL Szukam, googluję i skleciłem coś takiego i nie wiem czy zmierzam w dobrą stronę. Chciałem to zrobić bez IMQ. Routing ustawiony jest dobrze, jedynie to kolejkowanie.

Część kodu:

Kod: Zaznacz cały

#!/bin/bash

INTERNET=eth1
INTERNET2=eth2
INTERNET3=eth3
SIEC=eth0

# Tutaj ustalamy dynamiczny gwarantowany oraz max DOWNLOAD i UPLOAD w kbit dla każdego ip wymienionego powyżej #
GD=96  # gwarantowany download
MD=512    # maksymalny downloadu
GU=30  # gwarantowany upload
MU=36	  # maksymalny upload

# Tutaj ustalamy przepustowość karty sieciowej(K) oraz max download(M) w kbit od strony karty do sieci wew #
K=99000
M=99000

# Podaj przepustowość łącza (D)-Download (U)-Upload w kbit #
D=8000
U=480

### Ponizej podaj network sieci bez ostatniej cyferki np: ###
LAN=192.168.0
### Ponizej podaj IP karty wewnetrznej dla sieci np: ###
HOST1=192.168.0.1
### Teraz adresy IP ktore HTB ma wlaczyc do podzialu ###
HOST2=${LAN}.2
HOST3=${LAN}.3
HOST4=${LAN}.4


if [ "$1" == "stop" ]
then
echo "HTB zostalo zatrzymane"
tc qdisc del root dev $SIEC 2>/dev/null
tc qdisc del root dev $INTERNET 2>/dev/null
tc qdisc del root dev $INTERNET2 2>/dev/null
tc qdisc del root dev $INTERNET3 2>/dev/null
iptables -t mangle -D POSTROUTING -o $INTERNET -j HTB-OUT 2>/dev/null
iptables -t mangle -F HTB-OUT 2>/dev/null
iptables -t mangle -X HTB-OUT 2>/dev/null
iptables -t mangle -D POSTROUTING -o $INTERNET2 -j HTB-OUT2 2>/dev/null
iptables -t mangle -F HTB-OUT2 2>/dev/null
iptables -t mangle -X HTB-OUT2 2>/dev/null
iptables -t mangle -D POSTROUTING -o $INTERNET3 -j HTB-OUT3 2>/dev/null
iptables -t mangle -F HTB-OUT3 2>/dev/null
iptables -t mangle -X HTB-OUT3 2>/dev/null

exit
fi
if [ "$1" == "start" ]
then
echo "HTB zostalo wlaczone"
tc qdisc del root dev $SIEC 2>/dev/null
tc qdisc del root dev $INTERNET 2>/dev/null
tc qdisc del root dev $INTERNET2 2>/dev/null
tc qdisc del root dev $INTERNET3 2>/dev/null
iptables -t mangle -D POSTROUTING -o $INTERNET -j HTB-OUT 2>/dev/null
iptables -t mangle -F HTB-OUT 2>/dev/null
iptables -t mangle -X HTB-OUT 2>/dev/null
iptables -t mangle -D POSTROUTING -o $INTERNET2 -j HTB-OUT2 2>/dev/null
iptables -t mangle -F HTB-OUT2 2>/dev/null
iptables -t mangle -X HTB-OUT2 2>/dev/null
iptables -t mangle -D POSTROUTING -o $INTERNET3 -j HTB-OUT3 2>/dev/null
iptables -t mangle -F HTB-OUT3 2>/dev/null
iptables -t mangle -X HTB-OUT3 2>/dev/null
Pobieranie pominę.

Kod: Zaznacz cały

tc qdisc add dev $INTERNET root handle 1:0 htb
tc class add dev $INTERNET parent 1:0 classid 1:1 htb rate ${U}kbit ceil ${U}kbit quantum 576



tc class add dev $INTERNET parent 1:1 classid 1:102 htb rate 800kbit ceil 1000kbit quantum 576
tc class add dev $INTERNET parent 1:1 classid 1:103 htb rate 80kbit ceil 100kbit quantum 576
tc class add dev $INTERNET parent 1:1 classid 1:104 htb rate 30kbit ceil 100kbit quantum 576
tc class add dev $INTERNET parent 1:1 classid 1:105 htb rate 20kbit ceil 30kbit quantum 576

.
.

tc qdisc add dev $INTERNET parent 1:102 handle 302:0 sfq perturb 10
tc qdisc add dev $INTERNET parent 1:103 handle 303:0 sfq perturb 10
tc qdisc add dev $INTERNET parent 1:104 handle 304:0 sfq perturb 10
tc qdisc add dev $INTERNET parent 1:105 handle 305:0 sfq perturb 10

.
.

tc filter add dev $INTERNET protocol ip preference 1 parent 1:0 handle 2 fw flowid 1:102
tc filter add dev $INTERNET protocol ip preference 1 parent 1:0 handle 3 fw flowid 1:103
tc filter add dev $INTERNET protocol ip preference 1 parent 1:0 handle 4 fw flowid 1:104
tc filter add dev $INTERNET protocol ip preference 1 parent 1:0 handle 5 fw flowid 1:105

.
.

iptables -t mangle -N HTB-OUT
iptables -t mangle -I POSTROUTING -o $INTERNET -j HTB-OUT
iptables -t mangle -A HTB-OUT -s $HOST2 -j MARK --set-mark 2
iptables -t mangle -A HTB-OUT -s $HOST3 -j MARK --set-mark 3
iptables -t mangle -A HTB-OUT -s $HOST4 -j MARK --set-mark 4
iptables -t mangle -A HTB-OUT -s $HOST5 -j MARK --set-mark 5

.
.
.
Tak samo dla pozostałych dwóch interfejsów.

Kod: Zaznacz cały

tc qdisc add dev $INTERNET2 root handle 2:0 htb
tc class add dev $INTERNET2 parent 2:0 classid 2:1 htb rate ${U}kbit ceil ${U}kbit quantum 576


tc class add dev $INTERNET2 parent 2:1 classid 2:102 htb rate 800kbit ceil 1000kbit quantum 576
tc class add dev $INTERNET2 parent 2:1 classid 2:103 htb rate 80kbit ceil 100kbit quantum 576
tc class add dev $INTERNET2 parent 2:1 classid 2:104 htb rate 30kbit ceil 100kbit quantum 576
tc class add dev $INTERNET2 parent 2:1 classid 2:105 htb rate 20kbit ceil 30kbit quantum 576
.
.
c qdisc add dev $INTERNET2 parent 2:102 handle 2302:0 sfq perturb 10
tc qdisc add dev $INTERNET2 parent 2:103 handle 2303:0 sfq perturb 10
tc qdisc add dev $INTERNET2 parent 2:104 handle 2304:0 sfq perturb 10
tc qdisc add dev $INTERNET2 parent 2:105 handle 2305:0 sfq perturb 10

.
.

tc filter add dev $INTERNET2 protocol ip preference 1 parent 2:0 handle 2 fw flowid 2:102
tc filter add dev $INTERNET2 protocol ip preference 1 parent 2:0 handle 3 fw flowid 2:103
tc filter add dev $INTERNET2 protocol ip preference 1 parent 2:0 handle 4 fw flowid 2:104
tc filter add dev $INTERNET2 protocol ip preference 1 parent 2:0 handle 5 fw flowid 2:105

.
.
.

iptables -t mangle -N HTB-OUT2
iptables -t mangle -I POSTROUTING -o $INTERNET2 -j HTB-OUT2
iptables -t mangle -A HTB-OUT2 -s $HOST2 -j MARK --set-mark 1002
iptables -t mangle -A HTB-OUT2 -s $HOST3 -j MARK --set-mark 1003
iptables -t mangle -A HTB-OUT2 -s $HOST4 -j MARK --set-mark 1004
iptables -t mangle -A HTB-OUT2 -s $HOST5 -j MARK --set-mark 1005
I tak samo dla trzeciego łącza.

I tu problem z tym markowaniem ,,set-mark 1002'' (jak markuję każdego użytkownika na każdym łączu tak samo to nie działa prawidłowo --set-mark 2 dla Eth1 Eth2 i Eth3). (wydawało mi sie jak przy każdym łączu zamarkuje --set-mark 2 to będzie działać a tu niestety tylko na 1 łączu poprawnie będzie chodzić wysyłanie (upload).

Teraz tak, czy idę dobrą drogą i czy dobrze rozumuje bo chcę dla każdego użytkownika zroibić kolejki na każdym łączu potem sobie ich dowolnie przerzucać między poszczególnymi łączami?


Pogubiłem sie z tym markowaniem --set-mark 2 działa prawidłowo.
Gdzie i jak dodać abym mógł sobie markować dla 2 łącza --set-mark 1002 i dla trzeciego --set-mark 2002. Nie umiem znaleźć gdzie jeszcze ustawić to markowanie. Nie wiem czy w ogóle się tak da?

Bardzo proszę o pomoc i ewentualną podpowiedź czy takie rozwiązanie ma sens?

Pozdrawiam.

: 17 lutego 2009, 21:22
autor: siarka
zainteresuj się łatami Juliana Anastasova, a dla uproszczenia zastosuj imq

: 18 lutego 2009, 14:55
autor: smirnof
Dziękuję za poradę ale chcę to kolejkowanie dobrze zrozumieć.

Już wiem gdzie zrobiłem byka ale jeszcze nie działa do końca jak chciałem:

Kod: Zaznacz cały

tc filter add dev $INTERNET2 protocol ip preference 1 parent 2:0 handle [b]1002[/b] fw flowid 2:102
tc filter add dev $INTERNET2 protocol ip preference 1 parent 2:0 handle [b]1003 [/b]fw flowid 2:103
tc filter add dev $INTERNET2 protocol ip preference 1 parent 2:0 handle [b]1004[/b] fw flowid 2:104
tc filter add dev $INTERNET2 protocol ip preference 1 parent 2:0 handle [b]1005 [/b]fw flowid 2:105

.
.
.

iptables -t mangle -N HTB-OUT2
iptables -t mangle -I POSTROUTING -o $INTERNET2 -j HTB-OUT2
iptables -t mangle -A HTB-OUT2 -s $HOST2 -j MARK --set-mark 1002
iptables -t mangle -A HTB-OUT2 -s $HOST3 -j MARK --set-mark 1003
iptables -t mangle -A HTB-OUT2 -s $HOST4 -j MARK --set-mark 1004
iptables -t mangle -A HTB-OUT2 -s $HOST5 -j MARK --set-mark 1005
Jeszcze mam jeden problem na Debianie 4.0r4a bodajże chodzi mi prawidłowo, a na Debianie 3.1r1 wywala mi przy linijce:

Kod: Zaznacz cały

iptables -t mangle -N HTB-OUT
wywala błąd:

Kod: Zaznacz cały

iptables: Chain already exists
i htb blokuje mi prawidłowe działanie na interfejsach eth2 i eth3.

Pozdrawiam.

: 19 lutego 2009, 10:25
autor: mariaczi
Cześć.

Myślę, że możesz spokojnie pominąć markowanie każdego użytkownika na interfejsie. Wyłap to sobie filtrem

Kod: Zaznacz cały

tc filter add dev eth1 parent 1:0 protocol ip prio 10 u32 match ip dst 10.0.0.10/0 flowid 1:10
Możesz zamiast dst użyć src dla ruchu wychodzącego (uploadu).

Pozdrawiam.

: 19 lutego 2009, 23:36
autor: smirnof
Nie za bardzo rozumiem o co chodzi z tym ip 10.0.0.10/0. Chodzi o to aby jednym poleceniem całą podsieć załatwić od razu?

Poza tym jeżeli coś jest źle zamarkowane bądź ustawione to routing i wszystko inne powinno działać jedynie nie będzie trzymać żadnych limitów.

U mnie po włączeniu HTB blokuje ruch przez 2 i 3 łącze (przy pierwszym chodzi normalnie), a w skrypcie dla łącz 2 i 3 jest wszystko tak samo jak dla jednego, który działa.

: 20 lutego 2009, 10:22
autor: mariaczi
Teraz markujesz pakiety dla danego hosta na kazdym interfejsie. Korzystajac z filtra wylapiesz pakiety per IP.
Zapodaj na filtr: zamiast /0 daj /32 czyli pojedynczy host i trafi to w dana kolejke.

: 20 lutego 2009, 11:35
autor: smirnof
Rozumiem.

Czyli jeżeli mam zdefiniowane:

Kod: Zaznacz cały

Host5=192.168.0.5
Mogę też zrobić tak:

Kod: Zaznacz cały

tc filter add dev eth1 parent 1:0 protocol ip prio 10 u32 match ip dst Host5 flowid 1:10
Zaraz sprawdzę czy pomogło?