Freesco, NND, CDN, EOS http://forum.freesco.pl/ |
|
Filtr tc - klasyfikacja po mark i IP jednocześnie http://forum.freesco.pl/viewtopic.php?f=22&t=16631 |
Strona 1 z 1 |
Autor: | agbis [ czwartek, 28 lutego 2008, 20:56 ] |
Tytuł: | Filtr tc - klasyfikacja po mark i IP jednocześnie |
Witam Pracuję nad skryptami umożliwiającymi routing z kilku LANów na dwa WANy. Podział ma się odbywać w ten sposób, że klienci są statycznie przypisani do konkretnego łącza. Każdy klient otrzymuje klasę z prędkością np 512kbps a w niej dwie podklasy: dla ruchu p2p (o ograniczonej prędkości do 150kbps) i pozostałego (prędkość do 512kbps). Odpowiednie regułki iptables markują pakiety w ten sposób: gość przypisany do WAN1, ruch "normalny" - MARK = 0x8 gość przypisany do WAN2, ruch "normalny" - MARK = 0x9 gość przypisany do WAN1, ruch p2p - MARK = 0x6 gość przypisany do WAN2, ruch p2p - MARK = 0x7 I teraz mam pewien kłopot z filtrami htb. Chciałem wyłapać ruch po dwóch kryteriach: źródłowym/docelowym adresie IP oraz po znaczniku MARK. Żeby sklasyfikować po MARK - użyłbym przykładowo: tc filter add dev imq1 parent 1:0 protocol ip prio 4 handle 0x6 fw flowid 1:2065 po ip: tc filter add dev imq1 parent 1:0 protocol ip prio 4 u32 match ip dst 10.1.1.55 flowid 1:2065 Próbując połączyć obydwa warunki zastosowałem konstrukcję: tc filter add dev imq1 parent 1:0 protocol ip prio 4 handle 0x6 u32 match ip dst 10.1.1.55 flowid 1:2065 Oczekiwałem, że do klasy 1:2065 zostaną skierowane tylko te pakiety, idące do ip 10.1.1.55, które są jednocześnie zamarkowane znacznikiem 0x6 (p2p). Jednak teraz do klasy tej trafia wszystko, co jest skierowane do 10.1.1.55 niezależnie od tego, jak jest zamarkowane. Przeszukałem net i znalazłem dużo przykładów klasyfikowania pakietów, ale zawsze opierały się one albo na u32, albo na fwmark, ale nigdy na obu łącznie. Proszę o podpowiedź, jak połączyć oba warunki w jednym filtrze. Poniżej fragmenty skryptu. Celowo wyciąłem z niego nieistotne dla sprawy fragmenty, w szczególności dotyczące rozróżnienia transferów zależnie od pory dnia. MARK1=0x8 MARK2=0x9 MARK1_P2P=0x6 MARK2_P2P=0x7 awk 'sub("^[ \t]*","") && /^[0123456789G]/ {print $0}' $hostfile | while read IP NAZWA USERDOWN[1] USERUP[1] USERDOWN[2] USERUP[2] USERDOWN[3] USERUP[3] USERDOWN[4] USERUP[4] LACZE REM; do CNT=$[$CNT+1] if [ $LACZE = WAN1 ]; then USERDOWN0=$USERDOWN1 USERUP0=$USERUP1 WANDOWN0=$WANDOWN1 WANUP0=$WANUP1 LANINT0=$LANINT1 WANINT0=$WANINT1 CP=1 # Prefix identyfikatora klasy download '1:' MARK0=$MARK1 MARK_P2P=$MARK1_P2P elif [ $LACZE = WAN2 ]; then USERDOWN0=$USERDOWN2 USERUP0=$USERUP2 WANDOWN0=$WANDOWN2 WANUP0=$WANUP2 LANINT0=$LANINT2 WANINT0=$WANINT2 CP=3 # Prefix identyfikatora klasy download '3:' MARK0=$MARK2 MARK_P2P=$MARK2_P2P else echo "Błędna nazwa łącza:"$lacze dla $ip; exit fi # DOWNLOAD 1: lub 3: $h class add dev $LANINT0 parent $CP:2 classid $CP:$[10+$CNT] htb rate ${USERDOWN0}kbit ceil ${USERDOWN[$pora]}kbit prio 3 quantum 1500 $h qdisc add dev $LANINT0 parent $CP:$[10+$CNT] $SFQ_LAN $h class add dev $LANINT0 parent $CP:$[10+$CNT] classid $CP:$[1010+$CNT] htb rate ${USERDOWN0}kbit ceil ${USERDOWN[$pora]}kbit prio 3 quantum 1500 $h qdisc add dev $LANINT0 parent $CP:$[1010+$CNT] $SFQ_LAN $h filter add dev $LANINT0 parent $CP:0 protocol ip prio 5 u32 match ip dst $IP flowid $CP:$[1010+$CNT] # UPLOAD 2: lub 4: $h class add dev $WANINT0 parent $[$CP+1]:1 classid $[$CP+1]:$[10+$CNT] htb rate ${USERUP0}kbit ceil ${USERUP[$pora]}kbit prio 3 quantum 1500 $h qdisc add dev $WANINT0 parent $[$CP+1]:$[10+$CNT] $SFQ_WAN $h class add dev $WANINT0 parent $[$CP+1]:$[10+$CNT] classid $[$CP+1]:$[1010+$CNT] htb rate ${USERUP0}kbit ceil ${USERUP[$pora]}kbit prio 3 quantum 1500 $h qdisc add dev $WANINT0 parent $[$CP+1]:$[1010+$CNT] $SFQ_WAN $h filter add dev $WANINT0 protocol ip prio 5 parent $[$CP+1]:0 u32 match ip src $IP flowid $[$CP+1]:$[1010+$CNT] $i -t mangle -A PREHTB -s $IP -j MARK --set-mark $MARK0 $i -t mangle -A PREHTB -d $IP -j MARK --set-mark $MARK0 if [ $P2P_ON = 1 ];then $i -t mangle -A PREHTB -s $IP -m ipp2p --ipp2p -j MARK --set-mark $MARK_P2P $i -t mangle -A PREHTB -d $IP -m ipp2p --ipp2p -j MARK --set-mark $MARK_P2P #DL $h class add dev $LANINT0 parent $CP:$[10+$CNT] classid $CP:$[2010+$CNT] htb rate 1kbit ceil ${USERDOWN_P2P[$pora]}kbit prio 6 quantum 1500 $h qdisc add dev $LANINT0 parent $CP:$[2010+$CNT] $SFQ_LAN # Tutaj jest problem: $h filter add dev $LANINT0 parent $CP:0 protocol ip prio 4 handle $MARK_P2P u32 match ip dst $IP flowid $CP:$[2010+$CNT] # UPL $h class add dev $WANINT0 parent $[$CP+1]:$[10+$CNT] classid $[$CP+1]:$[2010+$CNT] htb rate 1kbit ceil ${USERUP_P2P[$pora]}kbit prio 3 quantum 1500 $h qdisc add dev $WANINT0 parent $[$CP+1]:$[2010+$CNT] $SFQ_WAN # Tutaj jest problem: $h filter add dev $WANINT0 parent $[$CP+1]:0 protocol ip prio 4 handle $MARK_P2P u32 match ip src $IP flowid $[$CP+1]:$[2010+$CNT] fi done |
Autor: | -MW- [ czwartek, 28 lutego 2008, 22:08 ] |
Tytuł: | |
cos mi sie zdaje ze wyrwales nie sprawdzone kawalki skryptow. spruboj dodac reguly filtrujace: Cytuj: tc filter add dev imq1 parent 1:0 protocol ip prio 4 handle 0x6 fw flowid 1:2065 tc filter add dev imq1 parent 1:0 protocol ip prio 4 u32 match ip dst 10.1.1.55 flowid 1:2065 z tym samym prio sie nie uda, musza byc rozne. laczenie mark i u32 mnie nie wyszlo. Cytuj: h filter add dev $WANINT0 parent $[$CP+1]:0 protocol ip prio 4 handle $MARK_P2P u32 match ip src $IP flowid $[$CP+1]:$[2010+$CNT]
|
Autor: | zciech [ piątek, 29 lutego 2008, 00:12 ] |
Tytuł: | |
Nie jest przewidziane by łączyć oba filtry w jednej regule Ale.... możesz pakietom juz zamarkowanym zmienic mark np. if [ $P2P_ON = 1 ];then $i -t mangle -A PREHTB -s $IP -m ipp2p --ipp2p -j MARK --set-mark $MARK0_p2p oczywiscie mark MARK0_p2p jest inny dla kazdego IP # Znakowanie p2p $i -t mangle -A PREROUTING -m ipp2p --ipp2p -j MARK --set-mark 2 if [ "$layer7" == "1" ]; then for p in $programy; do $i -t mangle -A PREROUTING -m layer7 --l7proto $p -j MARK --set-mark 2 done fi $i -t mangle -A PREROUTING -p udp -j MARK --set-mark 2 #/-----------------/ # DOWNLOAD $h class add dev $LANINT parent 1:2 classid 1:$[10+$CNT] htb rate ${USERDOWN0}kbit ceil ${USERDOWN[$pora]}kbit prio 3 quantum 1500 $h class add dev $LANINT parent 1:$[10+$CNT] classid 1:$[1010+$CNT] htb rate ${USERDOWN0}kbit ceil ${USERDOWN[$pora]}kbit prio 3 quantum 1500 $h qdisc add dev $LANINT parent 1:$[1010+$CNT] $SFQ_LAN $h filter add dev $LANINT parent 1:0 protocol ip prio 5 u32 match ip dst $IP flowid 1:$[10+$CNT] $h filter add dev $LANINT parent 1:$[10+$CNT] protocol ip prio 5 u32 match ip dst $IP flowid 1:$[1010+$CNT] # UPLOAD $h class add dev $WANINT parent 2:1 classid 2:$[10+$CNT] htb rate ${USERUP0}kbit ceil ${USERUP[$pora]}kbit prio 4 quantum 1500 $h class add dev $WANINT parent 2:$[10+$CNT] classid 2:$[1010+$CNT] htb rate ${USERUP0}kbit ceil ${USERUP[$pora]}kbit prio 4 quantum 1500 $h qdisc add dev $WANINT parent 2:$[1010+$CNT] $SFQ_WAN $h filter add dev $WANINT protocol ip prio 5 parent 2:0 u32 match ip src $IP flowid 2:$[10+$CNT] $h filter add dev $WANINT protocol ip prio 5 parent 2:$[10+$CNT] u32 match ip src $IP flowid 2:$[1010+$CNT] if [ $pora = 2 -a $P2P_ON = 1 ];then $h class add dev $LANINT parent 1:$[10+$CNT] classid 1:$[2010+$CNT] htb rate 5kbit ceil ${USERDOWN_P2P[$pora]}kbit prio 3 quantum 1500 $h qdisc add dev $LANINT parent 1:$[2010+$CNT] $SFQ_LAN $h filter add dev $LANINT parent 1:$[10+$CNT] protocol ip prio 4 handle 2 fw flowid 1:$[2010+$CNT] $h class add dev $WANINT parent 2:$[10+$CNT] classid 2:$[2010+$CNT] htb rate 5kbit ceil ${USERUP_P2P[$pora]}kbit prio 3 quantum 1500 $h qdisc add dev $WANINT parent 2:$[2010+$CNT] $SFQ_WAN $h filter add dev $WANINT parent 2:$[10+$CNT] protocol ip prio 4 handle 2 fw flowid 2:$[2010+$CNT] fi rozwiazane zastosowane w pakiecie: http://ww2.devel-nnd.brb.pl/nnd/pakiety ... pkg.tar.gz tylko tam jest zepsute markowanie, bo skorzystalem z CONNMARK, ale to rozwiazanie zle markuje, trzeba wywalic cale markowanie i zastosowac to co podalem wyzej. A dzila to tak: pakiety trafiaja do kolejki x:$[10+$CNT] w ktorej jest z kolei kolejka x:$[1010+$CNT] prio 4 dla ruchu normalnego oraz kolejka x:$[2010+$CNT] prio 3 do ktorej tafia ruch zamarkowany p2p, ale tylko ten, ktory wczesniej byl juz zakwalifikowany do x:$[10+$CNT], jak widac priorytet tej kolejki jest wyzszy niż dla kolejki normalnej tc-viewer --iface=imq0 --unit=kbit fragment oczywiscie :) 2:1 < 4014Kbit - 4014Kbit > 1273.4 kbit/s 2:102 < 25Kbit - 192Kbit > 24.2 kbit/s 2:1102 < 25Kbit - 192Kbit > 24.2 kbit/s 2:103 < 25Kbit - 192Kbit > 27.3 kbit/s 2:1103 < 25Kbit - 192Kbit > 14.6 kbit/s 2:2103 < 5Kbit - 64Kbit > 12.7 kbit/s 2:107 < 25Kbit - 256Kbit > 40.6 kbit/s 2:1107 < 25Kbit - 256Kbit > 40.4 kbit/s 2:2107 < 5Kbit - 85Kbit > 0.4 kbit/s 2:117 < 25Kbit - 256Kbit > 282.4 kbit/s 2:1117 < 25Kbit - 256Kbit > 225.8 kbit/s 2:2117 < 5Kbit - 85Kbit > 34.5 kbit/s filtry p2p maj zly parent powinien byc nadrzednej kolejki x:10x a nie głownej wtedy trafia do niego ruch juz zaznaczony przez filtr IP kolejki x10 i można markiem oddzielic ruch p2p do kolejko x:201x |
Autor: | agbis [ piątek, 29 lutego 2008, 23:37 ] |
Tytuł: | |
Dziękuję za zainteresownie tematem. Skrypt jest przeróbką rchtb Zciecha wersja z grupami i imq. Zmiany polegają przede wszystkim na utworzeniu dodatkowych klas 2: i 3: przypisanych do imq2 i imq3 (download i upload przez drugiego WANa) i zdublowaniu odpowiednich podklas, filtrów itp. Generalnie wszystko działa (jeśli odpuszczę sobie wydzielanie ruchu p2p). Wtedy filtr wrzuca mi do odpowiednich kolejek na podstawie adresu IP, a z MARK'a korzysta tylko tablica reguł routowania (ip rule), która na podstawie fwmark wypuszcza pakiety odpowiednim WANem. @ -MW- Nie rozumiem co miałeś na myśli -MW- pisze: z tym samym prio sie nie uda, musza byc rozne. Wyczytałem gdzieś, że jeśli dwa filtry mają takie same prio, to są wykonywane w kolejności wpisania. Dałem prio=4, bo ten filtr miał być wykonany przed filtrem dla ruchu "normalnego" (nie p2p) z prio=5, przy którym sprawdzany jest tylko IP.Cytuj: spruboj dodac reguly filtrujace: Cytuj: tc filter add dev imq1 parent 1:0 protocol ip prio 4 handle 0x6 fw flowid 1:2065 tc filter add dev imq1 parent 1:0 protocol ip prio 4 u32 match ip dst 10.1.1.55 flowid 1:2065 To nie pójdzie, ponieważ: 1) powyższe wykonywane jest w pętli i dostaniemy: tc filter add dev imq1 parent 1:0 protocol ip prio 4 handle 0x6 fw flowid 1:2065 a za chwilę: tc filter add dev imq1 parent 1:0 protocol ip prio 4 handle 0x6 fw flowid 1:2066 co wygeneruje błąd: RTNETLINK answers: File exists Co nie jest dziwne, bo ten sam pakiet kierujemy do dwóch klas na raz. 2) taki zapis wykona sumę logiczną warunków a potrzebny jest iloczyn logiczny. Czyli muszą być spełnione OBYDWA warunki, żeby skierować pakiet do klasy 2066 a nie jeden DOWOLNY z nich. Natomiast rozwiązanie zaproponowane przez zciecha powinno się u mnie sprawdzić. Nie brałem czegoś takiego pod uwagę, bo gdzieś wyczytałem, że filtry powinno się podpinać pod klasę główną. Zastanawiam się jeszcze, czy klasa x:$[1010+$CNT] jest niezbędna. Czy nie możnaby się ograniczyć do skierowania całego ruchu z/do danego IP do klasy x:$[10+$CNT] i odfiltrować p2p do x:$[2010+$CNT]? Czy ruch "normalny" musi koniecznie mieć osobną podklasę? Cytuj: $i -t mangle -A PREHTB -s $IP -m ipp2p --ipp2p -j MARK --set-mark $MARK0_p2p
oczywiscie mark MARK0_p2p jest inny dla kazdego IP Akurat u mnie są tylko 4 możliwe wartości MARKa. Nie chcę komplikować reguł routowania: [root@nf5000 ~]# ip rule list 0: from all lookup local 50: from all lookup main 201: from 83.83.0.0/16 lookup WAN1 202: from 82.82.82.0/24 lookup WAN2 210: from all fwmark 9 lookup WAN2 211: from all fwmark 8 lookup WAN1 212: from all fwmark 7 lookup WAN2 213: from all fwmark 6 lookup WAN1 222: from all lookup DWA_WANY 32766: from all lookup main 32767: from all lookup default |
Autor: | zciech [ sobota, 1 marca 2008, 00:12 ] |
Tytuł: | |
Cytuj: Zastanawiam się jeszcze, czy klasa x:$[1010+$CNT] jest niezbędna. Czy nie możnaby się ograniczyć do skierowania całego ruchu z/do danego IP do klasy x:$[10+$CNT] i odfiltrować p2p do x:$[2010+$CNT]? Czy ruch "normalny" musi koniecznie mieć osobną podklasę?
Być może nie byc potrzebna. 1.03.2008 Niestety musi być. Bo inaczej wszystko pójdzie przez x:$[2010+$CNT] |
Autor: | marcin w [ sobota, 8 marca 2008, 09:36 ] |
Tytuł: | |
Witam Zainteresowałem się powyższymi skryptami. Mam wątpliwości co do markowania p2p. Obecne ipp2p oraz layer7 nie wyłapują całego ruchu p2p. Czy ktoś ma sprawdzone rozwiązanie markowania pakietów generowanych przez "internetowe zamulacze" ? W obecnej sytuacji ruch p2p pójdzie klasą przeznaczoną dla ruchu normalnego. |
Autor: | -MW- [ sobota, 8 marca 2008, 09:46 ] |
Tytuł: | |
odfiltrowac ruch strategiczny a cala reszte do malego wora. zas co do markowania pakietow strasznie tego nie lubie - zawsze brakowalo mi znacznikow ![]() |
Autor: | sq6iuv [ niedziela, 9 marca 2008, 23:45 ] |
Tytuł: | |
nie rozumie co wy z tym markowaniem, jakas obsesja,,,,,,,,,, markuje sie tylko pakiety , ktore nie idzie innym sposobem "zlapac", reszte robi sie na filtrach, a to co niesklasyfikowane skierowac do default,, zarzynacie procki i stwarzacie sobie problemy sami. |
Strona 1 z 1 | Strefa czasowa UTC+2godz. |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |