
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:
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/
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...
cd /usr/src
Tutaj zostaną zainstalowane wersje żródłowe wszystkich potrzebnych pakietów i plików
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]
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]
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]
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]
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]
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]
bzip2 -dc imq-2.4.19.tar.bz2 | tar xf -
Powinieneś dostać 3 pliki:
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
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
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
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 ?
mv htb3.6_tc.diff /usr/src/iproute2
mv iptables-1.2.7a-imq.diff iptables-1.2.8
mv imq-2.4.19.diff /usr/src/linux
mv pom-imq.diff patch-o-matic-20030107
mv imqnat.diff /usr/src/linux/drivers/net
cd /usr/src/iptables-1.2.8
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
chmod a+x extensions/.IMQ-test
chmod a+x
extensions/.IMQ-test6
make
Powinieneś dostać nieco komunikatów z kompilacji kończących się tak:
rm libiptc/libip4tc.o libipq/libipq.o libiptc/libip6tc.o
make install
Powinieneś dostać nieco komunikatów kończących się tak:
cp extensions/libip6t_MARK.so
/usr/local/lib/iptables/libip6t_MARK.so
cd /usr/src/patch-o-matic-20030107
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
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.
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.
cd /usr/src/iproute2
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).
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'
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
cd /usr/src/linux
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
cd /usr/src/linux/drivers/net
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.
cd /usr/src/linux
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
make dep
make clean
make bzImage
make modules
make
modules_install
mv /usr/src/linux/arch/i386/boot/bzImage
/boot/moje_jadro
Dopisz je do pliku /etc/lilo:
image = /boot/moje_jadro
root = /dev/hda1
label =
MOJE_JADRO
read-only
/sbin/lilo
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
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