Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2007-11-09 19:53:04

  luckyluk - Nowy użytkownik

luckyluk
Nowy użytkownik
Zarejestrowany: 2007-11-09

Piszemy skrypty QOS: HFSC, IMQ - HOWTO

Witam,

Mam zadanie na studiach, napisać skrypty QOS z podziałem na usługi i userów,
dla najczęściej spotykanych łącz dla małych ip, czyli coś około DSL 1 - 4 mb,
czy tez NEO i co tam niepopadnie jest stosowane.

Jako że nie jestem samolubem postanowiłem zrobić przy okazji HOWTO i udostępnić je w necie dla potomnych, aby nie musieli się już później męczyć tak jak ja.

Dużo takich skryptów w sieci już lata, ale trudno dogrzebać się czegoś z równoczesnym podziałem na userów i usługi, a zwlaszcza zeby bylo dobrze opisane.
Usługi chciałbym zmarkować za pomocą layer7 a nie po portach, bo wiadomo jacy userzy są (Ale o tym dalej).

Znalazlem już coś w sieci, ale jest to zrobione za pomocą filtrów po portach.

Proszę więc wszystkich którzy posiadają pomocną wiedzę w udziale w powstaniu HOWTO, oraz o sprawdzenie dotychczasowej pracy.
[b]Wszelkie komentarze są mile widziane[/b], tym bardziej że na HFSC mało się znam wcześniej lizniete mialem cos o htb.

Poniżej zaprezentuje co już posiadam. (większość w oparciu o skrypt Rafała Rajsa)


Plik ze zmiennymi (łącza, ip userów itp): rc.zmienne

Problem, czy ustawiać 90% lacza tak jak sie robilo w htb ?

Kod:

#!/bin/sh

# definiujemy interfejsy
ZEW=eth0 #publiczny do neta
WEW=eth1 #wewnetrzny LAN do lodkow

LAN="192.168.2.0/24"    # klasa lan
IP_ZEW="83.13.131.61"    #ip publiczne

# upload i download lacza
NET_DOWNLOAD=4096
NET_UPLOAD=512

# wylicz 90% ze wzgledu na opoznienia (czy dobry zapis ??)
MAX_DOWNLOAD=$[$NET_DOWNLOAD*90/100]
MAX_UPLOAD=$[$NET_UPLOAD*90/100]

MARK_START=0
MAX_RESERVE=20

# to moze pozniej wykorzystam do ograniczenia liczby polaczen na wysokich portach
MAX_CONNS=40

###


L_USERS=3 # liczba userow + serwer

#user 1
USER_IP[1]="10.1.1.50"
#user 2
USER_IP[2]="10.1.1.60"
#serwer
USER_IP[3]=$IP_ZEW 

###

IPTABLES=iptables
TC=tc

Kod:

#!/bin/sh
. ???/rc.zmienne # zmienic ??? na lokalizacje pliku


###
#download do imq0
TCQ_D="$TC qdisc add dev imq0"
TCC_D="$TC class add dev imq0"
TCF_D="$TC filter add dev imq0 parent 1: protocol ip"

#upload do imq1
TCQ_U="$TC qdisc add dev imq1"
TCC_U="$TC class add dev imq1"
TCF_U="$TC filter add dev imq1 parent 1: protocol ip"


#czyszczenie kolejki
#$TC qdisc del root dev imq0 
#$TC qdisc del root dev imq1

#dodajemy glowne kolejki 
$TCQ_D root handle 1: hfsc default 500 
$TCQ_U root handle 1: hfsc default 500 

co oznacza default 500 ?

Kod:

# download
$TCC_D parent 1: classid 1:1 hfsc sc rate ${MAX_DOWNLOAD}kbit ul rate ${MAX_DOWNLOAD}kbit 

# upload
$TCC_U parent 1: classid 1:1 hfsc sc rate ${MAX_UPLOAD}kbit ul rate ${MAX_UPLOAD}kbit 

#default reserve queue
$TCC_D parent 1:1 classid 1:500 hfsc sc rate ${MAX_RESERVE}kbit ul rate ${MAX_RESERVE}kbit 
$TCC_U parent 1:1 classid 1:500 hfsc sc rate ${MAX_RESERVE}kbit ul rate ${MAX_RESERVE}kbit 


# download dla usera
USER_UPLOAD=$[$MAX_UPLOAD/($L_USERS+1)]

# upload dla usera
USER_DOWNLOAD=$[$MAX_DOWNLOAD/($L_USERS+1)]


# podklasy z podziałem: 55% ruch wazny, 25% reszta ()

USER_D_PRIOR=$[$USER_DOWNLOAD*55/100]
USER_D_RESZTA=$[$USER_DOWNLOAD*25/100]

USER_U_PRIOR=$[$USER_UPLOAD*55/100]
USER_U_RESZTA=$[$USER_UPLOAD*25/100]

1.moglby byc podzial na trzy klasy wazny/reszta/p2p
2.czy % nie powinny sie sumowac do 100 ?

Kod:

#numery podklas
N_CLASS_D=10
N_CLASS_U=40

N_CLASS_D_1=70
N_CLASS_D_2=100
N_CLASS_U_1=130
N_CLASS_U_2=160

N_CLASS_D_1_Q=190
N_CLASS_D_2_Q=220
N_CLASS_U_1_Q=250
N_CLASS_U_2_Q=280

i=1
j=1


#dla kazdego usera w petelce
while [ $i -le $L_USERS ]
do

  #ograniczenie userow na IP
  $TCC_D parent 1:1 classid 1:$[$N_CLASS_D+$i] hfsc sc rate ${USER_DOWNLOAD}kbit ul rate ${MAX_DOWNLOAD}kbit #1 user
  $TCC_U parent 1:1 classid 1:$[$N_CLASS_U+$i] hfsc sc rate ${USER_UPLOAD}kbit ul rate ${MAX_UPLOAD}kbit #1 user

  # podzielic to na kolejne dwie klasy. Maksymalne opoznienie w waznej klasie! (prosze sprawdzic czy dobry zapis, komentarze porządane)
  #download
  $TCC_D parent 1:$[$N_CLASS_D+$i] classid 1:$[$N_CLASS_D_1+$i] hfsc sc umax 1500b dmax 20ms rate ${USER_D_PRIOR}kbit ul rate ${MAX_DOWNLOAD}kbit # wazne
  $TCC_D parent 1:$[$N_CLASS_D+$i] classid 1:$[$N_CLASS_D_2+$i] hfsc sc rate ${USER_D_RESZTA}kbit ul rate ${MAX_DOWNLOAD}kbit #reszta
  #upload    
  $TCC_U parent 1:$[$N_CLASS_U+$i] classid 1:$[$N_CLASS_U_1+$i] hfsc sc umax 1500b dmax 20ms rate ${USER_U_PRIOR}kbit ul rate ${MAX_UPLOAD}kbit # wazne
  $TCC_U parent 1:$[$N_CLASS_U+$i] classid 1:$[$N_CLASS_U_2+$i] hfsc sc rate ${USER_U_RESZTA}kbit ul rate ${MAX_UPLOAD}kbit # reszta
  
  # fifo dla waznych, sfq dla reszty (www i fifo nie pasuje stad 3 klasy porzadane, perturb to priorytet ?)
  $TCQ_D parent 1:$[$N_CLASS_D_1+$i] handle $[$N_CLASS_D_1_Q+$i]:0 pfifo
  $TCQ_D parent 1:$[$N_CLASS_D_2+$i] handle $[$N_CLASS_D_2_Q+$i]:0 sfq perturb 10
  $TCQ_U parent 1:$[$N_CLASS_U_1+$i] handle $[$N_CLASS_U_1_Q+$i]:0 pfifo
  $TCQ_U parent 1:$[$N_CLASS_U_2+$i] handle $[$N_CLASS_U_2_Q+$i]:0 sfq perturb 10




  #ruch kazdego usera kieruj do odpowiednich kolejek

  #upload waznego ruchu dla usera ( mozna dodac SSH, WWW, CS etc)
  $TCF_U prio 3 u32 match ip protocol 1 0xff match ip src ${USER_IP[${i}]} flowid 1:$[$N_CLASS_U_1+$i]
  $TCF_U prio 3 u32 match ip sport 22 0xffff match ip src ${USER_IP[${i}]} flowid 1:$[$N_CLASS_U_1+$i]
  $TCF_U prio 3 u32 match ip dport 22 0xffff match ip src ${USER_IP[${i}]} flowid 1:$[$N_CLASS_U_1+$i]
  $TCF_U prio 3 u32 match ip sport 53 0xffff match ip src ${USER_IP[${i}]} flowid 1:$[$N_CLASS_U_1+$i]
  $TCF_U prio 3 u32 match ip dport 53 0xffff match ip src ${USER_IP[${i}]} flowid 1:$[$N_CLASS_U_1+$i]

  #upload ogolny
  $TCF_U prio 20 u32 match ip src ${USER_IP[${i}]} flowid 1:$[$N_CLASS_U_2+$i]
  

  #download waznego ruchu dla usera ( mozna dodac SSH, WWW, CS etc)
  $TCF_D prio 2 u32 match ip protocol 1 0xff match ip dst ${USER_IP[${i}]} flowid 1:$[$N_CLASS_D_1+$i]
  $TCF_D prio 2 u32 match ip sport 22 0xffff match ip dst ${USER_IP[${i}]} flowid 1:$[$N_CLASS_D_1+$i]
  $TCF_D prio 2 u32 match ip dport 22 0xffff match ip dst ${USER_IP[${i}]} flowid 1:$[$N_CLASS_D_1+$i]
  $TCF_D prio 2 u32 match ip sport 53 0xffff match ip dst ${USER_IP[${i}]} flowid 1:$[$N_CLASS_D_1+$i]
  $TCF_D prio 2 u32 match ip dport 53 0xffff match ip dst ${USER_IP[${i}]} flowid 1:$[$N_CLASS_D_1+$i]

  #download ogolny dla usera
  $TCF_D prio 30 u32 match ip dst ${USER_IP[${i}]} flowid 1:$[$N_CLASS_D_2+$i]

### zamiast tego co powyzej chcialbym uzyc marka z layer7 czyli moze dla upload:
# tc filter add dev imq1 parent 1: protocol ip prio 1 handle $[$MARK_START+$j] fw classid 1:$[$N_CLASS_U_1+$i] # ruch wazny
# tc filter add dev imq1 parent 1: protocol ip prio 5 handle $[$MARK_START+$j+1] fw classid 1:$[$N_CLASS_U_2+$i] # ruch ogolny

#regolki iptables beda nizej

Kod:

 # j juz chyba niepotrzebne chyba ze do zakomentowanej propozycji z wartoscia +2
  j=$[$j+4]

  i=$[$i+1]
done

tak moglyby wygladac regolki iptables do markowania (mam nadzieje ze dobrze):
i=1
j=1
                                                                 
while [ $i -le $L_USERS ]
do
MARKOWANIE pakietow!   
upload ogolny dla  usera
    $IPTABLES -t mangle -A POSTROUTING -o $ZEW --src ${USER_IP[${i}]} -j MARK --set-mark $[$MARK_START+$j+3]
    #przemarkuj upload wazny
    $IPTABLES -t mangle -A POSTROUTING -o $ZEW -m layer7 --l7proto ssh --src ${USER_IP[${i}]} -j MARK --set-mark $[$MARK_START+$j+2]
    $IPTABLES -t mangle -A POSTROUTING -o $ZEW -m layer7 --l7proto dhcp --src ${USER_IP[${i}]} -j MARK --set-mark $[$MARK_START+$j+2]
    $IPTABLES -t mangle -A POSTROUTING -o $ZEW -m layer7 --l7proto dns --src ${USER_IP[${i}]} -j MARK --set-mark $[$MARK_START+$j+2]
   
    i=$[$i+1]
    j=$[$j+2]
done;

Kod:

# przekieruj ruch z lacza zewnetrznego do imq:
$IPTABLES -t mangle -A POSTROUTING -o $ZEW -j IMQ --todev 1 #upload
$IPTABLES -t mangle -A PREROUTING -i $ZEW -j IMQ --todev 0 #download

# podnies interfejsy imq
ip link set imq0 up
ip link set imq1 up

narazie tyle mam,
uprzejmie proszę o przyglądnięcie się kodzikowi i obkomentowanie, zwlaszcza propozycji.
// Ps. temat dałem też na innych forach

Offline

 

#2  2007-11-11 17:57:53

  Papik - Użytkownik

Papik
Użytkownik
Zarejestrowany: 2007-05-26

Re: Piszemy skrypty QOS: HFSC, IMQ - HOWTO

Ja do tego wszystkiego dorzuciłem pobieranie i ustawianie przepustowości w pętli. Przepustowości mam w pliku. Łatwiej będzie z większa ilością klientów ;). Tak samo z SNAT i DNAT w firewallu. Pobieram z /etc/hosts

Pozdrawiam ;)

Ostatnio edytowany przez Papik (2007-11-11 17:58:47)

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
To nie jest tylko forum, to nasza mała ojczyzna ;-)

[ Generated in 0.008 seconds, 11 queries executed ]

Informacje debugowania

Time (s) Query
0.00009 SET CHARSET latin2
0.00005 SET NAMES latin2
0.00108 SELECT u.*, g.*, o.logged FROM punbb_users AS u INNER JOIN punbb_groups AS g ON u.group_id=g.g_id LEFT JOIN punbb_online AS o ON o.ident='18.119.106.66' WHERE u.id=1
0.00090 REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '18.119.106.66', 1732301830)
0.00066 SELECT * FROM punbb_online WHERE logged<1732301530
0.00074 SELECT topic_id FROM punbb_posts WHERE id=74894
0.00074 SELECT id FROM punbb_posts WHERE topic_id=9656 ORDER BY posted
0.00059 SELECT t.subject, t.closed, t.num_replies, t.sticky, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, 0 FROM punbb_topics AS t INNER JOIN punbb_forums AS f ON f.id=t.forum_id LEFT JOIN punbb_forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3) WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id=9656 AND t.moved_to IS NULL
0.00008 SELECT search_for, replace_with FROM punbb_censoring
0.00111 SELECT u.email, u.title, u.url, u.location, u.use_avatar, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.poster_email, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online FROM punbb_posts AS p INNER JOIN punbb_users AS u ON u.id=p.poster_id INNER JOIN punbb_groups AS g ON g.g_id=u.group_id LEFT JOIN punbb_online AS o ON (o.user_id=u.id AND o.user_id!=1 AND o.idle=0) WHERE p.topic_id=9656 ORDER BY p.id LIMIT 0,25
0.00091 UPDATE punbb_topics SET num_views=num_views+1 WHERE id=9656
Total query time: 0.00695 s