Strona 1 z 2

Jak markować

: 2007-03-11, 17:27
autor: Ad@m
Mam następujący problem z markowanie połączeń.
Siedzę nad tym już drugi dzień i nic mi nie wychodzi.
Na początek może download.
Jak do tej pory miałem podzielone łącze per user, odpowiednie kolejki a do nich filtry na odstawie adresów ip (dst IP). P2P miałem wycięte i udostępniałem tylko w nocy, ze względu na marudzenie użytkowników chcę zrobić osobną kolejkę dla tego typu połączeń i tam skierować cały ruch, oczywiście przycięty do odpowiedniej wielkości.
Jako znacznik pakietów do tej port używałem ipp2p i spisywał się całkiem dobrze, co prawda mam jeszcze layer7, ale to może odłożę na później.

Jak markować całe połączenie p2p a za razem markować połączenia dla userów.
Jeśli zrobię to tak:

Kod: Zaznacz cały

#user1
iptables -t mangle -A POSTROUTING -d 192.168.1.2  -j MARK --set-mark 102

#p2p
iptables -t mangle -A PREROUTING -p tcp -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -p tcp -m mark ! --mark 0 -j ACCEPT
iptables -t mangle -A PREROUTING -m ipp2p --ipp2p -j MARK --set-mark 200
iptables -t mangle -A PREROUTING -p tcp -m mark --mark 200 -j CONNMARK --save-mark
To markowane są tylko połączenia a p2p już nie i leci do kolejki, usera
Natomiast, jeśli przestawię regułki user pod p2p to jest odwrotnie, wszystko leci do p2p.

Re: Jak markować

: 2007-03-11, 19:31
autor: xil
mozesz dodac -j return po userze a markowanie p2p dac na sam koniec.

Re: Jak markować

: 2007-03-11, 20:11
autor: Ad@m
Niestety to nic nie pomaga

Kod: Zaznacz cały

Chain PREROUTING (policy ACCEPT 208936597 packets, 93603011722 bytes)
    pkts      bytes target     prot opt in     out     source               destination
    5149  1555470 CONNMARK   all  --  any    any     anywhere             anywhere            CONNMARK restore
    1127    64750 MARK       all  --  any    any     anywhere             anywhere            ipp2p v0.8.1_rc1 --ipp2p MARK set 0xc8
       0        0 MARK       tcp  --  any    any     anywhere             anywhere            STRING match "BearShare" MARK set 0xc8
    1996   322914 CONNMARK   all  --  any    any     anywhere             anywhere            MARK match 0xc8 CONNMARK save

Chain INPUT (policy ACCEPT 31399793 packets, 11325919504 bytes)
    pkts      bytes target     prot opt in     out     source               destination

Chain FORWARD (policy ACCEPT 282500597 packets, 139168268933 bytes)
    pkts      bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 38726544 packets, 34042161787 bytes)
    pkts      bytes target     prot opt in     out     source               destination

Chain POSTROUTING (policy ACCEPT 325606637 packets, 173300945369 bytes)
    pkts      bytes target     prot opt in     out     source               destination
    1746   311760 RETURN     all  --  any    any     anywhere             anywhere            MARK match 0xc8
     378   169644 MARK       all  --  any    any     anywhere             ADAM                MARK set 0x66
     378   169644 RETURN     all  --  any    any     anywhere             ADAM
     192    10388 MARK       all  --  any    any     MAREK                anywhere            MARK set 0x69
     136    64679 RETURN     all  --  any    any     anywhere             MAREK
Niestety to nic nie pomaga. Albo leci wszystko klasą p2p albo wszystko klasą usera.

Re: Jak markować

: 2007-03-15, 10:16
autor: mancin
mam podobny problem - tez podział per user i chciałbym troszkę posterować ruchem wewnątrz widełek usera. Chcę,żeby user miał widełki i cały jego ruch nie wychodził poza te widełki, ale jednocześnie chcę ponadawać priorytety wewnatrz widełek usera. Niestety nie wychodzi - próbowałem markować za pomoca ipp2p i l7 na podstawie adresu ip usera ale nie działa.
Może wypowiedziałby się ktos biegły w iptables jak skutecznie oznaczyć ruch od jednego usera w zależności od protokołu - tak ,zeby mozna było podzielić globalną klasę usera na klasy-dzieci i tam kierować odpowiednio voipy, www,pocztę i p2p a takze pozostały , niesklasyfikowany ruch , zeby nic nie wyciekało poza klasy w tc per user

Re: Jak markować

: 2007-03-15, 11:37
autor: bojleros
Ja to robie w troche inny sposób a oto drobny przykład:

Kod: Zaznacz cały

iptables -t mangle -N CHECK
iptables -t mangle -N PRIO
iptables -t mangle -N P2P

iptables -t mangle -A PRIO -j MARK --set-mark 1
#tu moze byc skok do imq
iptables -t mangle -A PRIO -j ACCEPT

iptables -t mangle -A P2P -j MARK --set-mark 2
#tu moze byc skok do imq
iptables -t mangle -A P2P -j ACCEPT

#prio
iptables -t mangle -A CHECK -p tcp --sport 22 -j PRIO
iptables -t mangle -A CHECK -p udp --sport 53 -j PRIO
#....
#p2p
iptables -t mangle -A CHECK -m ipp2p --ipp2p -j P2P
#.....
#uzytkownicy
iptables -t mangle -A CHECK -s tadek -j MARK --set mark 666
iptables -t mangle -A CHECK -s mietek -j MARK --set-mark 665
#ewentualny skok do imq
iptables -t mangle -A POSTROUTING -o $interfejs_lan -j CHECK
Dzieki łańcuchom PRIO i P2P pakiety które pasują do danych regułek w CHECK nie mają nadpisywanego marka ponieważ kończą swoją podróż w tablicy mangle wraz z jednozmnacznym zaklasyfikowaniem do jednej z reguł. Na samym początku mozna dodać matcha na pakiety ack<64bit co nie raz daje niezłego kopa sieci. Taka konstrukcja markół pociąga częściowo podejście do robienia klas . Ja mam prio , p2p i potem klasy użytkowników.

Re: Jak markować

: 2007-03-15, 16:08
autor: Ad@m
Ale jeśli to zrobimy tak jak napisał bojleros to markowane będą tylko pierwsze pakiety a nie całe połączenia p2p.
Ja, co prawda pokombinowałem z -j RETURN i niby jest ok ale i tak część połączeń p2p leci główna kolejką użytkownika. Nie wiem co jest przyczyną - szyfrowane p2p ??

Re: Jak markować

: 2007-03-15, 20:07
autor: bojleros
Ad@m, To bez connmarka chodzi tak samo dobrze jak i z nim :|

Re: Jak markować

: 2007-03-17, 09:06
autor: vitos
Ad@m pisze:To markowane są tylko połączenia a p2p już nie i leci do kolejki, usera
Natomiast, jeśli przestawię regułki user pod p2p to jest odwrotnie, wszystko leci do p2p
W tym wypadku istotnie tak będzie, gdyż reguły iptables są przetwarzane z góry do dołu.
Najpierw te, które pierwsze pojawią się w skrypcie, a skrypt jest przetwarzany z góry na dół :-)

Ja "wrzucanie" do odpowiednich klas realizuję w podobny, lecz minimalnie inny sposób.
Mianowicie. Tam, gdzie się da, używam filtrów polecenia tc. Wrzucanie ruchu do konkretnego ip'ika można zrealizować za pomocą takiego filtra, i to wychodzi lepiej niż na pomocą markowania pakietów, czy połączeń w iptables. Unika się zależności od kolejności przetwarzania poleceń iptables (jak w Twoim wypadku). Oczywiście jest ruch, np. p2p, media streamowe itd., dla którego nie ustawimy odpowiednich reguł pasujących filtra i wtedy jesteśmy zmuszeni używać narzędzi ipp2p lub layer7 wraz z MARK lub/i CONNMARK.

U ciebie wystąpił przypadek, gdzie użytkownik uruchamia program p2p i de facto pakiety generowane przez jego komputer pasują zarówno do -d JEGO_IP jak również do -m ipp2p --ipp2p. I na tym, jak sądzę, polega problem.

Ja mam zrobione tak:

Kod: Zaznacz cały

# Przekierowanie do imq0 - download
iptables -t mangle -A PREROUTING -i $INTERNET_INTERFACE -j IMQ --todev 0 

# Markowanie P2P
iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -m ipp2p --ipp2p -j MARK --set-mark 0x20
iptables -t mangle -A PREROUTING -m mark --mark 0x20 -j CONNMARK --save-mark
iptables -t mangle -A POSTROUTING -m mark --mark 0x20 -j RETURN 

# właściwe klasy "łapiące" ruch pochodzący od usera (1) oraz ruch z p2p (2)
# (1)
tc class add dev imq0 parent 1:1 classid 1:10 htb rate ${USER_RATE}kbit ceil ${USER_CEIL}kbit
tc qdisc add dev imq0 parent 1:10 sfq perturb 5
tc filter add dev imq0 parent 1:0 protocol ip prio 2 u32 match ip dst $USER_IP flowid 1:30 

# (2)
tc class add dev imq0 parent 1:1 classid 1:20 htb rate ${DOWN_RATE_P2P}kbit ceil ${DOWN_CEIL_P2P}kbit
tc qdisc add dev imq0 parent 1:20 esfq perturb 10 hash dst
tc filter add dev imq0 parent 1:0 protocol ip prio 1 handle 0x20 fw flowid 1:20
Cały figiel, do której klasy mają trafiać określone pakiety, jeśli pasują i do użytkownika i do ruchu p2p określa parametr prio w filtrze. Im mniejsza liczba prio tym większy priorytet. Na powyższym przykładzie pakiety p2p, które pochodzą od "pasującego" użytkownika trafią do klasy p2p. I odwrotnie. Jeśli w powyższym przykładzie zamienisz prio 1 na prio 2 w pierwszym filtrze i vice versa w drugim, uzyskasz odwrotny efekt, w którym pakiety ruchu p2p trafią do klasy wydzielonej dla użytkownika.

Pozdrawiam
vitos

Re: Jak markować

: 2007-03-20, 18:18
autor: Rion
Przepraszam,że dorzucam swoje 3 grosze ale też mam problem i nie wiem czy da się go rozwiązać.
Chce aby upload dla klienta 192.168.x.x wychodził eth0 a download wchodził eth2.
A żeby bardziej skomplikować żeby upload(www) wychodził eth0,pozostały eth2,
a download(www)wchodził eth2,a pozostały eth0.
Czy da się to zrobić ,a jeśli tak to w jaki sposób ?

Re: Jak markować

: 2007-03-20, 21:36
autor: mancin
Tzn. masz dwa łącza i chcesz,zeby pload wychodził jednym a wracał ? Nie da się

Re: Jak markować

: 2007-03-21, 13:28
autor: Rion
Czy iptables potrafi markować po wielkości pakietu ?
A jeśli tak to jaka jest składnia ?

Re: Jak markować

: 2007-03-21, 14:17
autor: bojleros
Rion, ja markowanie po wielkosci pakietu uzyskuje poprzez moduł u32 , przykłady znajdziesz w jego dokumentacji.

Re: Jak markować

: 2007-03-21, 15:07
autor: Rion
TO u32 da sie używać w iptables ? :-)
Na przykład na tablicy mangle ?:p

Re: Jak markować

: 2007-03-21, 15:09
autor: bojleros
Jak napisałem wczesniej jest moduł u32 do iptables. Odpowiada on mniejsiecej temu co oferuje u32 w tc.

Re: Jak markować

: 2007-03-21, 16:13
autor: Rion
Proszę o więcej szczegółów oraz jakieś przykłady wpisów :-)
Byłbym wdzięczny :-)