drixter’s blog

…przygody informatyka…

Shorewall - kolejkowanie

Kolejkowanie przeważnie dla mało zaawansowanych użytkowników systemu Linux budzi przerażenie z powodu komplikacji zagadnienia. W poniższym artykule postaram się pokazać jak za pomocą Shorewall (nakładki na iptables) ustawić całkiem zacnie działające kolejkowanie ruchu (przydział pasma na użytkownika końcowego). Dodatkowo pokaże jak ustawić aby:

  • ruch do/z serwera lokalnego który jest bramą do internetu pracował z maksymalną szybkością np. 100Mbit
  • na tym samym komputerze jest Squid, ruch z serwera proxy ma jednak być kolejkowany

Zakładamy że posiadamy łącze powiedzmy 6Mbit download oraz 512Kbit upload, serwer z systemem Linux, dwie karty sieciowe. Jedna karta służy nam do połączenia z ISP, druga do naszej sieci lokalnej. W pierwszej kolejności określamy możliwości naszych łącz WAN (eth0) i LAN (eth1) w pliku tcdevices:

#INTERFACE      IN-BANDWITH     OUT-BANDWIDTH
eth0            6144kbit        512kbit
eth1            100000kbit      100000kbit

Teraz zajmiemy się zaznaczaniem ruchu od/do komputerów w sieci lokalnej. Korzystamy z pliku tcrules. Pierwsze 4 reguły dotyczą ICMP (ping) oraz zapytań DNS. Zakładamy że nie chcemy ich kolejkować:

#MARK   SOURCE          DEST            PROTO   PORT(S) CLIENT  USER    TEST    LENGTH  TOS
1:F     0.0.0.0/0       0.0.0.0/0       icmp    echo-request
1:F     0.0.0.0/0       0.0.0.0/0       icmp    echo-reply
1:F     0.0.0.0/0       0.0.0.0/0       tcp     53
1:F     0.0.0.0/0       0.0.0.0/0       udp     53
1       $FW             192.168.0.0/24  all     -
2       eth1:192.168.0.3/32     0.0.0.0/0       all     -
3       eth1:192.168.0.3/32     0.0.0.0/0       all     -
4       eth1:192.168.0.4/32     0.0.0.0/0       all     -
5       eth1:192.168.0.5/32     0.0.0.0/0       all     -
6       eth1:192.168.0.6/32     0.0.0.0/0       all     -
7       eth1:192.168.0.7/32     0.0.0.0/0       all     -
8       eth1:192.168.0.8/32     0.0.0.0/0       all     -
9       eth1:192.168.0.9/32     0.0.0.0/0       all     -
10      eth1:192.168.0.10/32    0.0.0.0/0       all     -
2:F     eth0:0.0.0.0/0          192.168.0.2/32  all     -
3:F     eth0:0.0.0.0/0          192.168.0.3/32  all     -
4:F     eth0:0.0.0.0/0          192.168.0.4/32  all     -
5:F     eth0:0.0.0.0/0          192.168.0.5/32  all     -
6:F     eth0:0.0.0.0/0          192.168.0.6/32  all     -
7:F     eth0:0.0.0.0/0          192.168.0.7/32  all     -
8:F     eth0:0.0.0.0/0          192.168.0.8/32  all     -
9:F     eth0:0.0.0.0/0          192.168.0.9/32  all     -
10:F    eth0:0.0.0.0/0          192.168.0.10/32 all     -

Kolejną rzeczą jest określenie szybkości upload dla każdego z komputerów w naszej sieci lokalnej, robimy to w pliku tcclasses. Wartości w dużym skrótcie: pierwsza szybkość od lewej to wartość gwarantowana, druga wartość od lewej to wartość maksymalna (gdy jest wolne łączę)

#INTERFACE      MARK    RATE    CEIL    PRIORITY        OPTIONS
eth0            1       full            full            1       tcp-ack,tos-minimize-delay
eth0            2       64kbit          128kbit         6       default
eth0            3       128kbit         128kbit         6
eth0            4       64kbit          128kbit         6
eth0            5       16kbit          16kbit          6
eth0            6       64kbit          128kbit         6
eth0            7       64kbit          128kbit         6
eth0            8       16kbit          16kbit          6
eth0            9       64kbit          128kbit         6
eth0            10      64kbit          64kbit          6

Teraz download, ten sam plik:

eth1            1       full            full            1       tcp-ack,tos-minimize-delay
eth1            2       1024kbit        1024kbit        6       default
eth1            3       2048kbit        2048kbit        6
eth1            4       1024kbit        1024kbit        6
eth1            5       16kbit          16kbit          6
eth1            6       1792kbit        1792kbit        6
eth1            7       256kbit         256kbit         6
eth1            8       16kbit          16kbit          6
eth1            9       512kbit         512kbit         6
eth1            10      512kbit         512kbit         6

Poprawka na serwer proxy, niestety Shorewall nie potrafi kolejkować na tcout ale samo iptables tak:

iptables -t mangle -A tcout -o eth1 -s 192.168.0.1/32 -d 192.168.0.2/32  -p tcp --sport 3128 -j MARK --set-mark 0x2
iptables -t mangle -A tcout -o eth1 -s 192.168.0.1/32 -d 192.168.0.3/32 -p tcp --sport 3128 -j MARK --set-mark 0x3
iptables -t mangle -A tcout -o eth1 -s 192.168.0.1/32 -d 192.168.0.4/32 -p tcp --sport 3128 -j MARK --set-mark 0x4
iptables -t mangle -A tcout -o eth1 -s 192.168.0.1/32 -d 192.168.0.5/32 -p tcp --sport 3128 -j MARK --set-mark 0x5
iptables -t mangle -A tcout -o eth1 -s 192.168.0.1/32 -d 192.168.0.6/32 -p tcp --sport 3128 -j MARK --set-mark 0x6
iptables -t mangle -A tcout -o eth1 -s 192.168.0.1/32 -d 192.168.0.7/32 -p tcp --sport 3128 -j MARK --set-mark 0x7
iptables -t mangle -A tcout -o eth1 -s 192.168.0.1/32 -d 192.168.0.8/32 -p tcp --sport 3128 -j MARK --set-mark 0x8
iptables -t mangle -A tcout -o eth1 -s 192.168.0.1/32 -d 192.168.0.9/32 -p tcp --sport 3128 -j MARK --set-mark 0x9
iptables -t mangle -A tcout -o eth1 -s 192.168.0.1/32 -d 192.168.0.10/32 -p tcp --sport 3128 -j MARK --set-mark 0xa

Oczywiście teraz zmuszamy do korzystania z proxy przez użytkowników, dopisujemy regułę w pliku rules

DNAT                   loc      loc:192.168.0.1:3128    tcp      www              -          !192.168.0.1

Sam Shorewall ma wiele możliwości i znacznie ułatwia zarządzaniem regułami firewall’a. Więcej można poczytać ja jego stronach

Wpis “Shorewall - kolejkowanie” ma jeden komentarz

  1. pryszczata linuxiara pisze:

    Dzieki wielkie :) Prosto i na temat.

Dodaj komentarz

boinkme