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!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
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 ?
#!/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
#!/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 ?
# 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 ?
#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
# 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;
# 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
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
Time (s) | Query |
---|---|
0.00010 | SET CHARSET latin2 |
0.00004 | SET NAMES latin2 |
0.00149 | 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.219.231.197' WHERE u.id=1 |
0.00060 | REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '18.219.231.197', 1732282419) |
0.00038 | SELECT * FROM punbb_online WHERE logged<1732282119 |
0.00046 | SELECT topic_id FROM punbb_posts WHERE id=75117 |
0.00092 | SELECT id FROM punbb_posts WHERE topic_id=9656 ORDER BY posted |
0.00105 | 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.00005 | SELECT search_for, replace_with FROM punbb_censoring |
0.00109 | 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.00075 | UPDATE punbb_topics SET num_views=num_views+1 WHERE id=9656 |
Total query time: 0.00693 s |