[duch@wla.pl: poprawiony s/ipchains/iptables/]

Sergiusz Pawlowicz ser w pld-linux.org
Czw, 25 Mar 2004, 11:23:36 CET


przesyłam, ale arku zapisz się proszę, bo widać z tekstu, że mógłbyś
nam bardzo pomóc...

----- Forwarded message from Arkadiusz Chomicki <duch w wla.pl> -----

From: Arkadiusz Chomicki <duch w wla.pl>
To: Sergiusz Pawlowicz <ser w pld-linux.org>
Date: Thu, 25 Mar 2004 11:21:30 +0100 (CET)
Subject: poprawiony s/ipchains/iptables/
X-Spam-Status: No, hits=-5.2 required=5.0
	tests=BAYES_00,USER_AGENT_PINE
	version=2.55

poprawilem w jednym miejscu zamiast iptables dalem ipchains 
mozesz przeslac na pld-doc. ja tam nie ejstem zapisany

Pozdrawiam
ChomAr
-- 
+-=========================| Arkadiusz Chomicki |=====================-+
  84-120 Władysławowo         GG#: 420515
  woj. pomorskie              e-mail:chomar(at)wla(dot)pl
  Registered User: 82605      http://www.chomar.wla.pl
  http://counter.li.org/cgi-bin/runscript/display-person.cgi?user=82605
+-====================================================================-+
Autor: Arkadiusz Chomicki <chomar w wla.pl>
Temat: Przekirowanie ruchu p2p i innych śmieci na dedykowane łącze.

0. Podziękowania.

Na początek chciałbym podziękować wszystkim którzy mnie nakierowywali 
na odpowiednie tory a w szczególności dla Tomasz Wrona <twr w wp.pl>
który podpowiedział mi dwie bardzo ważnew rzeczy

1. Z czym miałem problem
Administrując siecią osiedlową natrafiłem na problem z programami p2p. 
Mianowicie strasznie zapychały mi 2 łącza. Zablokowanie tego ruchu 
wystarczyło aby odzyskać większość łącza, więc pomyślałem sobie, że 
warto by było przekierować ruch p2p na jedno łącze a resztę na drugie.

Niestety po portach nie da się wykryć czy jest to p2p więc użyłem 
modułu iptables p2p, to wyróżnienia tych pakietów. Jednak to rozwiązanie 
miało wadę. Można dopiero to rozpoznać po nawiązaniu połączenia.

Podpowiedziano mi na sieci, żeby przekierować cały ruch na jedno łącze, 
a część preferowanych usług (rozpoznawanych po portach) na drugie łącze.

Tak też zrobiłem, teraz moim kłopotem jest tylko wyłuskiwanie ważniejszych 
servisów i ich portów np. gier internetowych.



2. Jakie mogły być powody zapychania się łącza.

Po pierwsze problemem może być niewydalaniem modemu, więc należy się
dowiedzieć ile modem może obsłużyć aktywnych połączeń i ograniczyć wyjście 
przez iptables do tej wartości. 



3. Jakie zastosowałem rozwiązania.

Ja u siebie wykonałem ograniczenie w ten sposób:

# iptables -t filter -A FORWARD -s 192.168.3.0/24 -o eth1 -p tcp -m mark \
  --mark 0x0 -m connlimit --connlimit-above 300 --connlimit-mask 32 \
  -j REJECT --reject-with tcp-reset

co mi ogranicza do max 300 połączeń na użytkownika połączeń TCP wychodzących

wyeliminuje to problem kiedy pakiety nie są w stanie wyjść w swiat gdyż za dużo jest 
aktywnych połączeń i modem nie wydala

Drugim sposobem jest ograniczenie pasma wychodzącego tak żeby ruter pilnowal by 
nie szło więcej niż może modem

# tc qdisc del dev eth1 root
# tc qdisc add dev eth1 root handle 1 cbq bandwidth 256Kbit avpkt 1000 cell 8
# tc class change dev eth1 root cbq weight 32bit allot 1514

# tc class add dev eth1 parent 1: classid 1:2 cbq bandwidth 256Kbit rate 216Kbit \
  weight 27Kbit prio 1 allot 1514 cell 8 maxburst 20 avpkt 1000 bounded
# tc qdisc add dev eth1 parent 1:2 handle 2 tbf rate 216Kbit buffer 10Kb/8 limit 15Kb mtu 1500
# tc filter add dev eth1 parent 1:0 protocol ip prio 100 u32 match ip src 80.53.220.75 classid 1:2

No i trzecim sposobem jest zakupienie drugiego łącza jakiegoś taniego i puścić nim ruch niechciany
wykonałem to w ten sposób:

cały ruch niezidentyfikowany (nie preferowany) przekierowałem na łącze dodatkowe 
a ruch preferowany na łącze drugie (szybsze)

na początek ustawiłem w tabeli mangle takie regułki do omarkowania pakietów:

// przywrócenie wartości mark dla nawiązanych już połączeń
# iptables -t mangle -A PREROUTING                                               -j CONNMARK --restore-mark

// jeśli się okaże ze ktores p2p działa na portach preferowanych to
// zaznaczy je i wtedy nie przepuści
# iptables -t mangle -A PREROUTING -p tcp -m ipp2p --ipp2p                       -j MARK --set-mark 0x1214
# iptables -t mangle -A PREROUTING -p tcp -m ipp2p --ipp2p-data                  -j MARK --set-mark 0x1214
// zachowanie dla potomności
# iptables -t mangle -A PREROUTING -p tcp -m mark --mark 0x1214                  -j CONNMARK --save-mark

//jeśli jakiś pakiet jest już omarkowany to wychodzi z tabeli mangle i sprawdza kolejne regułki iptables
# iptables -t mangle -A PREROUTING -m mark ! --mark 0x0                          -j RETURN

// oMARKowuję uprzywilejowane servisy
# iptables -t mangle -A PREROUTING -p icmp  -s 192.168.0.0/16                    -j MARK --set-mark 0x1
# iptables -t mangle -A PREROUTING -p udp   -s 192.168.0.0/16                    -j MARK --set-mark 0x1
// porty 1:1024
# iptables -t mangle -A PREROUTING -p tcp   -s 192.168.0.0/16 --dport 1:1024     -j MARK --set-mark 0x1
// mysql
# iptables -t mangle -A PREROUTING -p tcp   -s 192.168.0.0/16 --dport 3306       -j MARK --set-mark 0x1
// gg
# iptables -t mangle -A PREROUTING -p tcp   -s 192.168.0.0/16 --dport 8074       -j MARK --set-mark 0x1
// cache
# iptables -t mangle -A PREROUTING -p tcp   -s 192.168.0.0/16 --dport 8080       -j MARK --set-mark 0x1
// gra americas army
# iptables -t mangle -A PREROUTING -p tcp   -s 192.168.0.0/16 --dport 1716:1718  -j MARK --set-mark 0x1
// irc
# $iptables -t mangle -A PREROUTING -p tcp   -s 192.168.0.0/16 --dport 6665:6667  -j MARK --set-mark 0x1
// gra enemy terrytory
# iptables -t mangle -A PREROUTING -p tcp   -s 192.168.0.0/16 --dport 27960      -j MARK --set-mark 0x1
// gra  MU Online
# iptables -t mangle -A PREROUTING -p tcp   -s 192.168.0.0/16 --dport 55201      -j MARK --set-mark 0x1
# iptables -t mangle -A PREROUTING -p tcp   -s 192.168.0.0/16 --dport 44405      -j MARK --set-mark 0x1

// wszystkie porty dobrze znanych serverow
// www.wp.pl
# iptables -t mangle -A PREROUTING -p tcp   -s 192.168.0.0/16 -d 212.77.100.101  -j MARK --set-mark 0x1
// czat.wp.pl
# iptables -t mangle -A PREROUTING -p tcp   -s 192.168.0.0/16 -d 212.77.100.113  -j MARK --set-mark 0x1
// www.onet.pl
# iptables -t mangle -A PREROUTING -p tcp   -s 192.168.0.0/16 -d 213.180.130.200 -j MARK --set-mark 0x1
//strona z grami Online  www.miniclip.com
# iptables -t mangle -A PREROUTING -p tcp   -s 192.168.0.0/16 -d 69.0.241.20     -j MARK --set-mark 0x1
// www.kurnik.pl
# iptables -t mangle -A PREROUTING -p tcp   -s 192.168.0.0/16 -d 217.17.45.25    -j MARK --set-mark 0x1

// no i jeszcze zachować dla potomności
# iptables -t mangle -A PREROUTING -p tcp -m mark --mark 0x1     -j CONNMARK --save-mark


Jeśli już mamy omarkowane pakiety należy je odpowiednio przekierować:
skorzystałem z dobrodziejstwa iproute2 i dodałem następujące regułki
# ip route add from 192.168.0.0/16 fwmark 0x1214 lookup TABLE_SMIECI
# ip route add from 192.168.0.0/16 fwmark 0x1 lookup TABLE_PRIORYTET
// ta regułka kieruje cały nieoznakowany ruch na łącze śmieci
// potrzebne jeśli default jest inne łącze
# ip route add from 192.168.0.0/18 lookup TABLE_SMIECI

trzeba oczywiście dodać do tabeli odpowiednie wpisy default i informacje o sieciach
obsługiwanych przez ten ruter

należy jeszcze wykonać to dla interfejsu z wyjściem w świat
# echo 0 >  /proc/sys/net/ipv4/conf/eth1/rp_filter

po takich zabiegach użytkownicy odczuli znaczny wzrost wydajności łącza PRIORYTET
pingi nie przekraczają 100ms (kiedyś dochodziło do 3000ms)

niestety łącze SMIECI jest zapchane na maxa więc niektórzy narzekają na słaby transfer programów p2p
pingi na tym łączu są duże nieschodzą poniżej 500ms

przy takim rozwiązaniu należy mieć stałą kontrolę nad usługami które mają iść łączem PRIORYTET
i stale uaktualniać tabelę mangle o odpowiednie wpisy.


nie dało się niestety przekierować samego ruchu p2p gdyż podczas nawiązywania połączenia nie wiemy
jeszcze czy jest to pakiet należący do p2p.
Dzisiejsze programy p2p potrafią działać na portach poniżej 1024 np 80 (http)
więc rozróżnienie ich po portach nic nie da

innym rozwiązaniem może być wydzielenie portów dla programów p2p 
ogłoszenie tego użytkownikom sieci.
Należy wtedy zablokować ruch p2p na wszystkie porty oprócz tych wydzielonych
i jeśli ktoś się nie dostosuje to nie będzie miał transferu

to rozwiązanie ma wadę taką, że będzie generowało dużo połączeń nawiązywanych (pakiety SYN)
na obu łączach, gdyż iptables nie pozwoli na transfer dopiero po nawiązaniu połączenia
i rozpoznaniu połączania jako należącego do p2p




----- End forwarded message -----



Więcej informacji o liście dyskusyjnej pld-doc