Dokument ten opisuje sposób instalacji jądra 2.4.20 i odpowiednich narzędzi (iptables, iproute2) wraz z HTB, IMQ oraz sposób wydzielenia oddzielnego pasma przychodzącego dla Squida w przypadku gdy mamy transparent proxy i NAT (maskarada). Zamiast z HTB można skorzystać z CBQ


W chwili gdy piszę te słowa (18 maja 2003) istnieją następujące wersje programów:

  1. Ściągasz wersję źródłową najnowszego jądra

    Ja używam Slackware 9.0 więc najnowsze jądro mam w postaci paczki tgz
    Ty w swojej dystrybucji możesz to zrobić inaczej i z innego źródła.
    Oryginał można ściągnąć z www.kernel.org/

  2. Instalujesz najnowsze jądro do /usr/src/linux

    Wersja źródłowa zostaje zainstalowana w /usr/src/linux
    Ja w Slackware 9.0 robię to tak:

    installpkg kernel-source-2.4.20-noarch-5.tgz

    Powinieneś dostać:

    Installing package kernel-source-2.4.20-noarch-5...
    PACKAGE DESCRIPTION:
    kernel-source: kernel-source (Linux kernel source)
    kernel-source:
    kernel-source: Source code for Linus Torvalds' Linux kernel.
    kernel-source:
    kernel-source: This is the complete source code for the Linux kernel.
    kernel-source:
    Executing install script for kernel-source-2.4.20-noarch-5...

  3. Przechodzisz do katalogo /usr/src

    cd /usr/src

    Tutaj zostaną zainstalowane wersje żródłowe wszystkich potrzebnych pakietów i plików

  4. Ściągasz IMQ patch:

    wget http://www.bloementuin.nl/netshaper/imq-2.4.19.tar.bz2

    Powinieneś dostać:

    --23:59:44-- http://www.bloementuin.nl/netshaper/imq-2.4.19.tar.bz2
    => `imq-2.4.19.tar.bz2'
    Resolving www.bloementuin.nl... done.
    Connecting to www.bloementuin.nl[62.250.4.133]:80... connected.
    HTTP request sent, awaiting response... 200 OK
    Length: 6,681 [application/x-tar]

    100%[=======================================================>] 6,681 17.78K/s ETA 00:00

    23:59:46 (17.78 KB/s) - `imq-2.4.19.tar.bz2' saved [6681/6681]

  5. Ściągasz najnowszą wersję iptables

    wget http://www.iptables.org/files/iptables-1.2.8.tar.bz2

    Powinieneś dostać:

    --00:06:27-- http://www.iptables.org/files/iptables-1.2.8.tar.bz2
    => `iptables-1.2.8.tar.bz2'
    Resolving www.iptables.org... done.
    Connecting to www.iptables.org[62.128.28.62]:80... connected.
    HTTP request sent, awaiting response... 200 OK
    Length: 125,446 [application/x-tar]

    100%[=======================================================>] 125,446 14.25K/s ETA 00:00

    00:06:36 (14.25 KB/s) - `iptables-1.2.8.tar.bz2' saved [125446/125446]

  6. Ściągasz patch-o-matic do iptables

    wget http://www.iptables.org/files/patch-o-matic-20030107.tar.bz2

    Powinieneś dostać:

    --00:13:44-- http://www.iptables.org/files/patch-o-matic-20030107.tar.bz2
    => `patch-o-matic-20030107.tar.bz2'
    Resolving www.iptables.org... done.
    Connecting to www.iptables.org[62.128.28.62]:80... connected.
    HTTP request sent, awaiting response... 200 OK
    Length: 236,542 [application/x-tar]

    100%[=======================================================>] 236,542 14.55K/s ETA 00:00

    00:14:00 (14.55 KB/s) - `patch-o-matic-20030107.tar.bz2' saved [236542/236542]

  7. Ściągasz pakiet iproue2

    wget ftp://ftp.inr.ac.ru/ip-routing/iproute2-2.4.7-now-ss020116-try.tar.gz

    Powinieneś dostać:

    --00:24:11-- ftp://ftp.inr.ac.ru/ip-routing/iproute2-2.4.7-now-ss020116-try.tar.gz
    => `iproute2-2.4.7-now-ss020116-try.tar.gz'
    Resolving ftp.inr.ac.ru... done.
    Connecting to ftp.inr.ac.ru[193.233.7.100]:21... connected.
    Logging in as anonymous ... Logged in!
    ==> SYST ... done. ==> PWD ... done.
    ==> TYPE I ... done. ==> CWD /ip-routing ... done.
    ==> PORT ... done. ==> RETR iproute2-2.4.7-now-ss020116-try.tar.gz ... done.
    Length: 197,008 (unauthoritative)

    100%[=======================================================>] 197,008 14.26K/s ETA 00:00

    00:24:30 (14.26 KB/s) - `iproute2-2.4.7-now-ss020116-try.tar.gz' saved [197008]

  8. Pobierasz najnowsze HTB

    wget http://luxik.cdi.cz/~devik/qos/htb/v3/htb3.6-020525.tgz

    Powinieneś dostać:

    --00:26:53-- http://luxik.cdi.cz/%7Edevik/qos/htb/v3/htb3.6-020525.tgz
    => `htb3.6-020525.tgz'
    Resolving luxik.cdi.cz... done.
    Connecting to luxik.cdi.cz[213.151.81.106]:80... connected.
    HTTP request sent, awaiting response... 200 OK
    Length: 64,218 [text/plain]

    100%[=======================================================>] 64,218 7.02K/s ETA 00:00

    00:27:03 (7.02 KB/s) - `htb3.6-020525.tgz' saved [64218/64218]

  9. Ściągasz patch poprawiający współprace IMQ z NAT

    wget http://alfa.tailor.com.pl/imqhtb/imqnat.diff

    Powinieneś dostać:

    --00:27:50-- http://alfa.tailor.com.pl/imqhtb/imqnat.diff
    => `imqnat.diff'
    Resolving alfa.tailor.com.pl... done.
    Connecting to alfa.tailor.com.pl[217.96.192.84]:80... connected.
    HTTP request sent, awaiting response... 200 OK
    Length: 475 [text/plain]

    100%[=================================================>] 475 463.87K/s ETA 00:00

    00:27:52 (463.87 KB/s) - `imqnat.diff' saved [475/475]

  10. Rozpakowujesz IMQ patch:

    bzip2 -dc imq-2.4.19.tar.bz2 | tar xf -

    Powinieneś dostać 3 pliki:

  11. Rozpakowujesz iptables

    bzip2 -dc iptables-1.2.8.tar.bz2| tar xf -

    Powinien powstać katalog /usr/src/iptables-1.2.8 a w nim wersja źródłowa iptables

  12. Rozpakowujesz iproute2

    tar xzvf iproute2-2.4.7-now-ss020116-try.tar.gz

    Powinien powstać katalog /usr/src/iproute2 a w nim wersja źródłowa iproute2

  13. Rozpakowujesz patch-o-matic

    bzip2 -dc patch-o-matic-20030107.tar.bz2 | tar xf -

    Powinien powstać katalog /usr/src/patch-o-matic-20030107 a w nim wersja źródłowa p-o-m

  14. Rozpakowujesz HTB

    tar xzvf htb3.6-020525.tgz

    Powinieneś dostać pliki:

    Stąd wykorzystamy tylko plik htb3.6_tc.diff do spatchowania iproute2.Nie musimy patchować jądra 2.4.20 ponieważ ono już zawiera HTB.Gdybyś miał starsze jądro to musisz użyć jeszcze htb3.6_2.4.17.diff .I być może coś jeszcze ?

  15. Przenosisz htb3.6_tc.diff do katalogu iproute2

    mv htb3.6_tc.diff /usr/src/iproute2

  16. Przenosisz "iptables IMQ patch" do iptables

    mv iptables-1.2.7a-imq.diff iptables-1.2.8

  17. Przenosisz "kernel IMQ patch" do /usr/src/linux

    mv imq-2.4.19.diff /usr/src/linux

  18. Przenosisz "pom IMQ patch" do patch-o-matic

    mv pom-imq.diff patch-o-matic-20030107

  19. Przenosisz "IMQNAT patch" do /usr/src/linux/drivers/net

    mv imqnat.diff /usr/src/linux/drivers/net

  20. Przechodzisz do katalogu iptables

    cd /usr/src/iptables-1.2.8

  21. Instalujesz "iptables IMQ patch"

    patch -p1 <iptables-1.2.7a-imq.diff

    Powinieneś dostać:

    patching file extensions/.IMQ-test
    patching file extensions/.IMQ-test6
    patching file extensions/libip6t_IMQ.c
    patching file extensions/libipt_IMQ.c

  22. Uaktywniasz IMQ w iptables:

    chmod a+x extensions/.IMQ-test
    chmod a+x extensions/.IMQ-test6

  23. Kompilujesz iptables

    make

    Powinieneś dostać nieco komunikatów z kompilacji kończących się tak:

    rm libiptc/libip4tc.o libipq/libipq.o libiptc/libip6tc.o

  24. Instalujesz iptables

    make install

    Powinieneś dostać nieco komunikatów kończących się tak:

    cp extensions/libip6t_MARK.so /usr/local/lib/iptables/libip6t_MARK.so

  25. Przechodzisz do /usr/src/patch-o-matic-20030107

    cd /usr/src/patch-o-matic-20030107

  26. Patchujesz p-o-m

    patch -p1 <pom-imq.diff

    Powinieneś dostać:

    patching file extra/IMQ.patch
    patching file extra/IMQ.patch.config.in
    patching file extra/IMQ.patch.configure.help
    patching file extra/IMQ.patch.help
    patching file extra/IMQ.patch.ipv6
    patching file extra/IMQ.patch.ipv6.config.in
    patching file extra/IMQ.patch.ipv6.configure.help
    patching file extra/IMQ.patch.ipv6.help
    patching file extra/IMQ.patch.ipv6.makefile
    patching file extra/IMQ.patch.makefile

  27. Uruchamiasz p-o-m dla IMQ

    KERNEL_DIR=/usr/src/linux-2.4.20 ./runme extra/IMQ.patch

    Powinieneś dostać:

    Welcome to Rusty's Patch-o-matic!
    Each patch is a new feature: many have minimal impact, some do not.
    Almost every one has bugs, so I don't recommend applying them all!
    -------------------------------------------------------
    Testing... IMQ.patch NOT APPLIED ( 2 missing files)
    The extra/IMQ patch:
    Author: Patrick McHardy <kaber@trash.net>
    Status: Working

    This patch adds a new target 'IMQ' which is required
    to direct packets through an imq device.
    -----------------------------------------------------------------
    Do you want to apply this patch [N/y/t/f/a/r/b/w/v/q/?]

    Wciskamy 'y' i Enter
    Po otrzymaniu:

    Testing patch extra/IMQ.patch...
    Placed new Config.in line
    Placed new Configure.help entry
    Placed new Makefile line
    Patch extra/IMQ.patch applied cleanly.
    Applying patch extra/IMQ.patch...
    Patch extra/IMQ.patch applied cleanly.
    Placed new Config.in line
    Placed new Configure.help entry
    Placed new Makefile line

    [Press enter to continue]

    Wciskamy Enter i dostajemy:

    Welcome to Rusty's Patch-o-matic!

    Each patch is a new feature: many have minimal impact, some do not.
    Almost every one has bugs, so I don't recommend applying them all!
    -------------------------------------------------------
    Already applied: extra/IMQ

    -----------------------------------------------------------------
    No more patches to apply! Q to Quit or ? for options [Q/a/r/b/?]

    Wciskamy Enter i dostajemy:

    Excellent! Kernel is now ready for compilation.

  28. Uruchamiasz inne łaty p-o-m

    Jest to dobry moment aby nałożyć inne potrzebne Ci łaty z p-o-m. Przykładowo jeśli chcesz nałożyć łatę 'string' piszesz:

    KERNEL_DIR=/usr/src/linux-2.4.20 ./runme extra/string.patch

    Jeśli chcesz wybrać więcej łatek z modułu 'extra' wpisujesz:

    KERNEL_DIR=/usr/src/linux-2.4.20 ./runme extra

    i wybierasz te potrzebne. Zdecydowanie nie zalecam nakładanie wszystkiego jak leci a jedynie tylko tych łatek, które są Ci konieczne.

  29. Przechodzisz do katalogu /usr/src/iproute2

    cd /usr/src/iproute2

  30. Patchujesz iproute2 do HTB

    patch -p1 <htb3.6_tc.diff

    Powinieneś dostać:

    patching file tc/q_htb.c
    patching file tc/Makefile
    Hunk #1 succeeded at 25 (offset 4 lines).

  31. Kompilujesz iproute2

    make

    Powinieneś dostać nieco komunikatów z kompilacji kończących się tak:

    gcc -D_GNU_SOURCE -O2 -Wstrict-prototypes -Wall -g -I../include-glibc -I/usr/include/db3 -include ../include-glibc/glibc-bugs.h -I/usr/src/linux/include -I../include -DRESOLVE_HOSTNAMES -o rtstat rtstat.o
    make[1]: Leaving directory `/usr/src/iproute2/misc'

  32. Instalujesz iproute2

    make install

    Powinieneś dostać nieco komunikatów kończacych sie na:

    make[1]: Leaving directory `/usr/src/iproute2/doc'

    UWAGA: Dla Slackware 9.0 punkty 28-31 nie musza byc wykonane bo tam juz jest iproute2 z HTB

  33. Przechodzisz do katalogu /usr/src/linux

    cd /usr/src/linux

  34. Patchujesz jądro dla imq

    patch -p1 <imq-2.4.19.diff

    Powinieneś dostać:

    patching file Documentation/Configure.help
    Hunk #1 succeeded at 8766 (offset 240 lines).
    patching file drivers/net/Config.in
    patching file drivers/net/Makefile
    Hunk #1 succeeded at 158 (offset 10 lines).
    patching file drivers/net/imq.c
    patching file include/linux/imq.h
    patching file include/linux/skbuff.h
    patching file net/core/skbuff.c
    patching file net/sched/sch_generic.c

  35. Przechodzisz do katalogu /usr/src/linux/drivers/net

    cd /usr/src/linux/drivers/net

  36. Patchujesz imq w jądrze do współpracy z NAT

    patch <imqnat.diff

    Powinieneś dostać komunikat:

    patching file imq.c

    Ten punkt wymaga nieco wyjaśnienia. Jak możesz zobaczyć na www.docum.org/stef.coene/qos/kptd/ pakiet w PREROUTING wchodzi najpierw do IMQ a dopiero potem do NAT. Przez to nie można w PREROUTING zidentyfikować czy pakiet jest przeznaczony do serwera czy do któregoś z userów za NAT-em i do którego. Dzięki temu patchowi zamieniana jest kolejność IMQ i NAT i wchodzący pakiet kierowany jest najpierw do NAT a potem do IMQ. Umożliwia to poprawne zidentyfikowanie adresu IP odbiorcy.

  37. Przechodzisz do katalogu /usr/src/linux

    cd /usr/src/linux

  38. Ustawiasz opcje jądra:

    make menuconfig

    Ustawiasz wszystkie opcje potrzebne tobie.
    Dla IMQ musisz włączyć:
    # Networking options ---> IP: Netfilter Configuration --->IMQ target support
    # Networking options ---> IPv6: Netfilter Configuration --->IMQ target support
    # Network device support --->IMQ (intermediate queueing device) support

    Powłączaj także opcje związane z QOS

  39. Teraz już wystarczy skompilować jądro

    make dep
    make clean
    make bzImage
    make modules
    make modules_install
    mv /usr/src/linux/arch/i386/boot/bzImage /boot/moje_jadro

  40. Jeśli wszystko jest OK to powinieneś otrzymać jądro jako plik /boot/moje_jadro

    Dopisz je do pliku /etc/lilo:

    image = /boot/moje_jadro
    root = /dev/hda1
    label = MOJE_JADRO
    read-only

  41. Uruchom lilo

    /sbin/lilo

  42. Restartujesz komputer

    Jeśli wszystko przebiegło prawidłowo to możesz zrestartować komputer
    Wpisujesz poprostu:

    shutdown -r now

    lub wciskasz Alt-Ctrl-Del
    Po wystartowaniu powinno wystartować Twoje nowe jądro z IMQ i HTB

  43. Zakładasz skrypty HTB

     Teraz możesz pozakładać ograniczenia na pasmo wchodzące.
    Oto przykład skryptu dla SDI przy następujących założeniach:


    iptables -t nat -A PREROUTING -p TCP -s 10.0.0.0/8 --dport 80 -j REDIRECT --to-port=3128

    modprobe imq numdevs=1
    iptables -t mangle -A PREROUTING -i eth1 -j IMQ
    ip link set imq0 up

    tc qdisc del root dev imq0
    tc qdisc add dev imq0 root handle 1:0 htb default 2

    tc class add dev imq0 parent 1:0 classid 1:1 htb rate 128kbit ceil 128kbit # glowna kolejka

    tc class add dev imq0 parent 1:1 classid 1:2 htb rate 8kbit ceil 120kbit # ssh, telnet
    tc class add dev imq0 parent 1:1 classid 1:3 htb rate 80kbit ceil 120kbit # www ze squida
    tc class add dev imq0 parent 1:1 classid 1:4 htb rate 40kbit ceil 120kbit # reszta

    tc class add dev imq0 parent 1:4 classid 1:10 htb rate 10kbit ceil 120kbit # serwer nie www
    tc class add dev imq0 parent 1:4 classid 1:11 htb rate 10kbit ceil 120kbit # 10.0.0.2
    tc class add dev imq0 parent 1:4 classid 1:12 htb rate 10kbit ceil 120kbit # 10.0.1.2
    tc class add dev imq0 parent 1:4 classid 1:13 htb rate 10kbit ceil 120kbit # dial-up

    tc filter add dev imq0 protocol ip parent 1:0 u32 match ip sport 23 0xffff flowid 1:2 # z telnetu
    tc filter add dev imq0 protocol ip parent 1:0 u32 match ip sport 22 0xffff flowid 1:2 # z ssh
    tc filter add dev imq0 protocol ip parent 1:0 u32 match ip dport 23 0xffff flowid 1:2 # do telnetu
    tc filter add dev imq0 protocol ip parent 1:0 u32 match ip dport 22 0xffff flowid 1:2 # do ssh
    tc filter add dev imq0 protocol ip parent 1:0 u32 match ip protocol 1 0xff flowid 1:2 # ICMP
    tc filter add dev imq0 protocol ip parent 1:0 u32 match ip protocol 6 0xff \
    match u8 0x05 0x0f at 0 match u16 0x0000 0xffc0 at 2 match u8 0x10 0xff at 33 flowid 1:2 # ACK

    tc filter add dev imq0 protocol ip parent 1:0 preference 1 u32 match ip dst 10.10.10.2 match ip sport 80 0xffff flowid 1:3

    tc filter add dev imq0 protocol ip parent 1:0 preference 2 u32 match ip dst 10.10.10.2 flowid 1:10
    tc filter add dev imq0 protocol ip parent 1:0 u32 match ip dst 10.0.0.2 flowid 1:11
    tc filter add dev imq0 protocol ip parent 1:0 u32 match ip dst 10.0.1.2 flowid 1:12
    tc filter add dev imq0 protocol ip parent 1:0 u32 match ip dst 10.1.1.2 flowid 1:13
    tc filter add dev imq0 protocol ip parent 1:0 u32 match ip dst 10.1.1.3 flowid 1:13
    tc filter add dev imq0 protocol ip parent 1:0 u32 match ip dst 10.1.1.4 flowid 1:13

     

    To jest oczywiście tylko przykład


A teraz wersja dla leniwych :)
Pod adresem alfa.tailor.com.pl/imqhtb/imq znajdziesz skrypt wykonujący po kolei większość podanych punktów

Nieco informacji na tematy poruszany w tym dokumencie znajdziesz na:

Po polsku:

Po angielsku:

Jeśli masz jakieś uwagi, pytania bądź propozycje to pisz na lzur małpa teczowe kropka eu kropka org
Jeśli znalazłeś tu jakiś błąd to napisz koniecznie
Wszystkie opisane tu pliki (poza jądrem) znajdziesz na alfa.tailor.com.pl/imqhtb/2.4.20

Inne wersje tego dokumentu znajdziesz na alfa.tailor.com.pl/imqhtb/imq_htb.html

Leszek Żur

.