maly dokument o podzieleniu lacza
Arkadiusz Chomicki
duch w wla.pl
Śro, 24 Mar 2004, 21:57:21 CET
witam
popełniłem mały dokument na temat dzielenia łącza
smieci na jedno i preferowany ruch na drugie
moze jest warty tego by dodac do dokumentacji
poproszę o opinię
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
+-====================================================================-+
-------------- następna część ---------
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 ipchains 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
Więcej informacji o liście dyskusyjnej pld-devel-pl