Bociek PLD - Pisarz
I. Informacje podstawowe
II. Instalacja
III. Podręcznik użytkownika
IV. Podręcznik administratora
Zastosowania sieciowe
Podział łącza w zależności od serwisów
V. Tworzenie PLD - Praktyczny poradnik
VI. O podręczniku
O tej książce
Spis treści
Inne wersje tego dokumentu
HTML (jeden plik)
Odnośniki
Tworzymy dokumentację PLD
Strona PLD
Listy dyskusyjne PLD

Podział łącza w zależności od serwisów

<- ->
 

Wstęp

Administratorzy sieci osiedlowych często natrafiają na problemy z programami p2p. Potrafią one skutecznie zapychać łącza. Jednym z możliwych rozwiązań jest zablokowanie takiego ruchu, a drugim opisanym w tym dokumencie, jest przekierowanie go na jedno z łącz - odciążając tym samym drugie.

Jednym z możliwych problemów może być "zatykanie" 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.

Podstawy

Ograniczenie można wykonać 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 powoduje ograniczenie użytkownikom do 300 wychodzących połączeń TCP. Wyeliminuje to problem, kiedy pakiety nie są w stanie wyjść w świat gdyż za dużo jest aktywnych połączeń i modem się zawiesza.

Drugim sposobem jest ograniczenie pasma wychodzącego w taki sposób, żeby router pilnował, aby na modemie nie było zbyt dużego ruchu sieciowego.

# 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 $ip_nat classid 1:2

Gdzie $ip_nat to adres ip serwera

Przekierowanie p2p i połączeń podobnych

Trzecim sposobem jest zakupienie drugiego, taniego łącza i puszczenie nim niechcianego ruchu np tak:

Cały niezidentyfikowany ruch przekierowywany jest na łącze dodatkowe, a zidentyfikowany na łącze drugie (szybsze).

Na początek ustawimy w tabeli mangle takie regułki, służąc do oznaczania odpowiednich 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, że jakieś 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ż oznaczony to wychodzi 
// z tabeli mangle i sprawdza kolejne regułki iptables
# iptables -t mangle -A PREROUTING -m mark ! --mark 0x0 -j RETURN

// znakuje 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 americans 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 serwerów
// 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 oznaczone pakiety należy je odpowiednio przekierować. Możemy skorzystać z dobrodziejstwa iproute2 i dodać 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 domyślne jest inne łącze
# ip route add from 192.168.0.0/18 lookup TABLE_SMIECI

Oczywiście trzeba dodać do tabeli odpowiednie wpisy default i informacje o sieciach obsługiwanych przez ten router. Należy jeszcze wykonać te polecenia dla interfejsu z wyjściem w świat:

# echo 0 >  /proc/sys/net/ipv4/conf/eth1/rp_filter

Po takich zabiegach użytkownicy powinni odczuć znaczny wzrost wydajności łącza PRIORYTET

Niestety łącze SMIECI jest maksymalnie zapchane, więc należy przygotować się na narzekania użytkowników którzy są przekierowani na to łącze.

Przy takim rozwiązaniu należy mieć stałą kontrolę nad usługami, które mają działać na łączu PRIORYTET i stale uaktualniać tabelę mangle o odpowiednie wpisy.

Nie udał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 i ogłoszenie ich 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 jednak wadę: 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.

 
<- ->