
Traffic shaping sa p2p filterom - howto
Nadnevak 31.08.2006 16:09:25 | Tema: Internet
| U novije vrijeme konačno je i kod nas počelo sve jače prodiranje širokopojasnih internet veza, kako u tvrtke, tako i u kućanstva. Ovime dobivamo mogućnost jeftinijeg pristupa internetu, sa sve većim brzinama. Naravno, otvorila se i mogućnost dijeljenja zajedničkih internet veza na više korisnika, što se posebno koristi u tvrtkama, udrugama, i sl. No, pojavom velikih brzina prijenosa podataka putem interneta, pojavili su se i programi te protokoli koji takve mogućnosti iskorištavaju do krajnjih granica. Glavni predstavnici takvih programa su programi za peer-to-peer dijeljenje datoteka. Iako to zvuči vrlo dobro, u praksi dolazimo do velikih problema. Glavni problem je u tome što takvi programi otvaraju iznimno velik broj konekcija na internet , pa time "ubijaju" vezu, pa makar sam "bandwidth" i nije potpuno iskorišten.
No, tu možemo odlično primijeniti linux kao router koji će određivati prioritete prema protokolima, oblikovati internet promet, a samim time znanto poboljšati performanse našeg internet linka. Primjer iz prakse je kada jedan klijent uključi neki p2p program, svi ostali gotovo da i ne mogu otvoriti internet stranicu, ili sve to radi užasno sporo. Za rješenje ovog problema treba nam noviji kernel, iptables paket sa odgovarajućim patchevima za prepoznavanje prometa prema protokolima, i jedna skripta koja će sve to obaviti. Pošto je ovo sve dosta komplicirano, odlučio sam napisati mali howto, kako bih pomogao drugima, ali i sebi, ako zaboravim kako sam to izveo . Howto je izveden iz više sličnih koji se mogu pronaći na internetu, no pošto nijedan nije kompletan, nadam se da će ovaj biti. Howto je pisan za ubuntu-server 6.06 , ali na gotovo isti način se može primijeniti na bilo kojoj drugoj distribuciji. Pa krenimo redom:
Dakle, treba nam: - bilo koja linux distribucija - kernel sa patchem za IMQ device - iptables sa layer7 patchem za prepoznavanje protokola - layer7 protokoli
Ako vam se neda sve ovo skidati i patchirati, imate već gotov kernel sa svim potrebnim patchevima na ovoj adresi: http://dragec.dyndns.org/linux-2.6.14-layer7+IMQ.tar.gz
U tome slučaju možete odmah krenuti na korak broj 8. Ako želite raditi sve ispočetka, krenite po redu:
1. Skinuti zadnji kernel sa kojim provjereno radi layer7
cd /usr/src wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.14.tar.bz2
1.a) Instalirajte sve potrebno za kompajliranje kernela (vrijedi za Ubuntu i Debian)
apt-get install gcc make libncurses5-dev
2. U istom direktoriju skinuti iptables source:
wget http://www.netfilter.org/projects/iptables/files/iptables-1.3.4.tar.bz2
3. skinite layer7 patch za kernel:
wget http://ufpr.dl.sourceforge.net/sourceforge/l7-filter/netfilter-layer7-v2.1.tar.gz
4. Skinite IMQ patch za kernel i za iptables:
wget http://www.linuximq.net/patchs/linux-2.6.14-imq6.diff wget http://www.linuximq.net/patchs/iptables-1.3.0-imq1.diff
5. skinite layer7 protokole:
wget http://ufpr.dl.sourceforge.net/sourceforge/l7-filter/l7-protocols-2006-01-22.tar.gz
6. sve to otpakirati i napraviti softlinkove:
tar -xzvf netfilter-layer7-v2.1.tar.gz tar -xjvf iptables-1.3.4.tar.bz2 tar -xjvf linux-2.6.14.tar.bz2 tar -xzvf l7-protocols-2006-01-22.tar.gz mv l7-protocols-2006-01-22 /etc/l7-protocols ln –s iptables-1.3.4 iptables ln –s linux-2.6.14 linux
7. Primijenite layer7 i IMQ patch na iptables-e i na kernel:
cd /usr/src/iptables patch -p1 < ../iptables-1.3.0-imq1.diff patch -p1 < ../netfilter-layer7-v2.1/iptables-layer7-2.1.patch chmod +x extensions/.layer7-test
cd /usr/src/linux patch -p1 < ../linux-2.6.14-imq6.diff patch -p1 < ../netfilter-layer7-v2.1/kernel-2.6.13-2.6.15-layer7-2.1.patch
8. Sad slijedi konfiguracija i kompajliranje kernela:
cd /usr/src/linux make menuconfig
Ako ste skinuli već patchirani kernel s gornjeg linka, obavezno dodajte podršku za uređaje koje imate (pogotovo IDE kontrolere), jer u mojem kernelu je uključen driver samo za Realtekov 8139 chipset (koji najčešće i pronalazimo u mrežnim karticama).
također, pazite na sljedeće opcije:
Networking ---> Networking options ---> [*] Network packet filtering (replace ipchains) ---> IP: Netfilter Configuration ---> <M> Layer 7 match support (EXPERIMENTAL) [ ] Layer 7 debugging output
Device Drivers ---> Network device support ---> <M> IMQ (intermediate queueing device) support
Nakon toga slijedi instalacija kernela:
make make modules_install cp arch/i386/boot/bzImage /boot/vmlinuz-2.6.14 cp System.map /boot/System.map-2.6.14
I editirajte datoteku menu.lst za bootloader:
cd /boot/grub vim menu.lst
Dodajte ovo:
title Ubuntu, kernel 2.6.14 root (hd0,0) kernel /boot/vmlinuz-2.6.14 root=/dev/hda1 ro savedefault boot
Naravno, hda1 ovisi na kojem disku se nalazi vaš kernel. Nakon toga slijedi reboot, i dignite novi kernel.
Ako je sve uspjelo, imate vrlo dobar sustav za traffic shaping, klasifikaciju prema protokolima i sl. No, pitate se kako. Ako vas zanimaju VRLO detaljna objašnjenja kako to radi, obavezno pročitajte sljedeće: http://luxik.cdi.cz/~devik/qos/htb/manual/userg.htm i http://gentoo-wiki.com/HOWTO_Packet_Shaping
No, za detaljnjo objašnjavanje svega ovoga trebalo bi mi još 20 stranica, pa ću priječi odmah na konkretni primjer, gdje imamo za prioritet postavljen ICMP, ssh i slično, na normalnim prioritetima su nam http promet i ostali „normalni“ protokoli, a na najniže prioritete stavljamo naravno, p2p protokole.
Evo, dat ću jedan primjer skripte koju koristim, sa komentarima: Napomena: ADSL interface nam je ppp0. Ako kod vas nije tako, možete ga preimenovati, ili ga staviti kao varijablu. Većinu postavki nije potrebno mijenjati, dovoljno je podesiti UPRATE i DOWNRATE.
#!/bin/bash
### Brišemo sve firewall chainove iptables -F iptables -X iptables -F -t nat
### Podešavanje MTU-a za adsl ### iptables -A FORWARD -o ppp0 -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu ###
################# Q O S ################################################
# Ponistim postavke za imq device ##### tc qdisc del dev imq0 root 2> /dev/null tc qdisc del dev imq1 root 2> /dev/null
ip link set imq0 down ip link set imq1 down
ip link set dev imq0 qlen 30 ip link set dev imq0 mtu 1492
ip link set dev imq1 qlen 30 ip link set dev imq1 mtu 1492
############################################### # Traffic shaping ###############################################
# Interfaceovi - imq0 je za upload, imq1 za download IFACE=imq0 IFACE1=imq1
# Prioriteti MARKPRIO1="1" MARKPRIO2="2" MARKPRIO3="3" MARKPRIO4="4"
# Bandwith i klasifikacije bandwitha za prioritete ## P2PRATE je max rate za P2P ## ## UP-limiti – UPRATE nam je ukupni Upload UPRATE="512" let P2PRATE=($UPRATE / 8) let PRIORATE1=($UPRATE / 4) let PRIORATE2=($UPRATE / 4) let PRIORATE3=($UPRATE / 4) let PRIORATE4=($UPRATE / 4) ## Downlimiti – DOWNRATE nam je ukupni Download ### DOWNRATE="2048" let P2PRATE2=($DOWNRATE/8) let PRIORATE5=($DOWNRATE/4) let PRIORATE6=($DOWNRATE/4) let PRIORATE7=($DOWNRATE/4) let PRIORATE8=($DOWNRATE/4)
# Quantums - vidi http://gentoo-wiki.com/HOWTO_Packet_Shaping QUANTUM1="12187" QUANTUM2="8625" QUANTUM3="5062" QUANTUM4="750"
# Burst - dozvoljena prekoracenja po klasama ### UPLOAD BURST1=($UPRATE / 32) BURST2=($UPRATE / 48) BURST3=($UPRATE / 64) BURST4="0" ### DOWNLOAD BURST5=($DOWNRATE / 32) BURST6=($DOWNRATE / 48) BURST7=($DOWNRATE / 64) BURST8="0"
### UPLOAD CBURST CBURST1=($UPRATE / 32) CBURST2=($UPRATE / 48) CBURST3=($UPRATE / 64) CBURST4="0" ### DOWNLOAD CBURST CBURST5=($DOWNRATE / 32) CBURST6=($DOWNRATE / 48) CBURST7=($DOWNRATE / 64) CBURST8="0"
###### Kraj osnovnih postavki #####
ip link set imq0 up ip link set imq1 up
# PODESENJA ZA IMQ0 - TO JE ZA UPLOAD tc qdisc add dev $IFACE root handle 1:0 htb default 103
# Set root class tc class add dev $IFACE parent 1:0 classid 1:1 htb rate ${UPRATE}kbit burst ${BURST1}kbit cburst ${CBURST1}kbit # Specify sub classes tc class add dev $IFACE parent 1:1 classid 1:101 htb rate ${PRIORATE1}kbit ceil ${UPRATE}kbit quantum $QUANTUM1 burst ${BURST1}kbit prio 0 tc class add dev $IFACE parent 1:1 classid 1:102 htb rate ${PRIORATE2}kbit ceil ${UPRATE}kbit quantum $QUANTUM2 burst ${BURST2}kbit cburst ${CBURST2}kbit prio 1 tc class add dev $IFACE parent 1:1 classid 1:103 htb rate ${PRIORATE3}kbit ceil ${UPRATE}kbit quantum $QUANTUM3 burst ${BURST3}kbit cburst ${CBURST3}kbit prio 2 tc class add dev $IFACE parent 1:1 classid 1:104 htb rate ${PRIORATE4}kbit ceil ${P2PRATE}kbit quantum $QUANTUM4 burst ${BURST4}kbit cburst ${CBURST4}kbit pri o 3
# Filter packets tc filter add dev $IFACE parent 1:0 protocol ip prio 0 handle $MARKPRIO1 fw classid 1:101 tc filter add dev $IFACE parent 1:0 protocol ip prio 1 handle $MARKPRIO2 fw classid 1:102 tc filter add dev $IFACE parent 1:0 protocol ip prio 2 handle $MARKPRIO3 fw classid 1:103 tc filter add dev $IFACE parent 1:0 protocol ip prio 3 handle $MARKPRIO4 fw classid 1:104
# Queuing disciplines tc qdisc add dev $IFACE parent 1:101 sfq perturb 16 quantum $QUANTUM1 tc qdisc add dev $IFACE parent 1:102 sfq perturb 16 quantum $QUANTUM2 tc qdisc add dev $IFACE parent 1:103 sfq perturb 16 quantum $QUANTUM3 tc qdisc add dev $IFACE parent 1:104 sfq perturb 16 quantum $QUANTUM4 ### Kraj podesenja za upload ###
# PODESENJA ZA IMQ1 - DOWNLOAD tc qdisc add dev $IFACE1 root handle 1:0 htb default 103
# root class tc class add dev $IFACE1 parent 1:0 classid 1:1 htb rate ${DOWNRATE}kbit burst ${BURST5}kbit cburst ${CBURST5}kbit # sub classes tc class add dev $IFACE1 parent 1:1 classid 1:101 htb rate ${PRIORATE5}kbit ceil ${DOWNRATE}kbit quantum $QUANTUM1 burst ${BURST5}kbit cburst ${CBURST5}kbit p rio 0 tc class add dev $IFACE1 parent 1:1 classid 1:102 htb rate ${PRIORATE6}kbit ceil ${DOWNRATE}kbit quantum $QUANTUM2 burst ${BURST6}kbit cburst ${CBURST6}kbit p rio 1 tc class add dev $IFACE1 parent 1:1 classid 1:103 htb rate ${PRIORATE7}kbit ceil ${DOWNRATE}kbit quantum $QUANTUM3 burst ${BURST7}kbit cburst ${CBURST7}kbit p rio 2 tc class add dev $IFACE1 parent 1:1 classid 1:104 htb rate ${PRIORATE8}kbit ceil ${P2PRATE2}kbit quantum $QUANTUM4 burst ${BURST8}kbit cburst ${CBURST8}kbit p rio 3
# Filters tc filter add dev $IFACE1 parent 1:0 protocol ip prio 0 handle $MARKPRIO1 fw classid 1:101 tc filter add dev $IFACE1 parent 1:0 protocol ip prio 1 handle $MARKPRIO2 fw classid 1:102 tc filter add dev $IFACE1 parent 1:0 protocol ip prio 2 handle $MARKPRIO3 fw classid 1:103 tc filter add dev $IFACE1 parent 1:0 protocol ip prio 3 handle $MARKPRIO4 fw classid 1:104
# Queuing disciplines tc qdisc add dev $IFACE1 parent 1:101 sfq perturb 16 quantum $QUANTUM1 tc qdisc add dev $IFACE1 parent 1:102 sfq perturb 16 quantum $QUANTUM2 tc qdisc add dev $IFACE1 parent 1:103 sfq perturb 16 quantum $QUANTUM3 tc qdisc add dev $IFACE1 parent 1:104 sfq perturb 16 quantum $QUANTUM4
### novi chainovi u mangle tablici za klasifikaciju paketa ###
iptables -F -t mangle
iptables -t mangle -N adsl-out iptables -t mangle -N adsl-in
### Layer 7 filteri za upload
iptables -t mangle -A adsl-out -p tcp --syn -j MARK --set-mark $MARKPRIO1 iptables -t mangle -A adsl-out -p icmp -j MARK --set-mark $MARKPRIO1 iptables -t mangle -A adsl-out -m layer7 --l7proto dns -j MARK --set-mark $MARKPRIO1 iptables -t mangle -A adsl-out -m layer7 --l7proto sip -j MARK --set-mark $MARKPRIO1 iptables -t mangle -A adsl-out -m layer7 --l7proto rdp -j MARK --set-mark $MARKPRIO1 iptables -t mangle -A adsl-out -m layer7 --l7proto vnc -j MARK --set-mark $MARKPRIO1 iptables -t mangle -A adsl-out -m layer7 --l7proto exe -j MARK --set-mark $MARKPRIO3 iptables -t mangle -A adsl-out -m layer7 --l7proto flash -j MARK --set-mark $MARKPRIO3 iptables -t mangle -A adsl-out -m layer7 --l7proto ogg -j MARK --set-mark $MARKPRIO3 iptables -t mangle -A adsl-out -m layer7 --l7proto pdf -j MARK --set-mark $MARKPRIO3 iptables -t mangle -A adsl-out -m layer7 --l7proto rar -j MARK --set-mark $MARKPRIO3 iptables -t mangle -A adsl-out -m layer7 --l7proto tar -j MARK --set-mark $MARKPRIO3 iptables -t mangle -A adsl-out -m layer7 --l7proto zip -j MARK --set-mark $MARKPRIO3 iptables -t mangle -A adsl-out -m layer7 --l7proto validcertssl -j MARK --set-mark $MARKPRIO2 iptables -t mangle -A adsl-out -m layer7 --l7proto ftp -j MARK --set-mark $MARKPRIO3 iptables -t mangle -A adsl-out -m layer7 --l7proto http -j MARK --set-mark $MARKPRIO2 iptables -t mangle -A adsl-out -m layer7 --l7proto imap -j MARK --set-mark $MARKPRIO3 iptables -t mangle -A adsl-out -m layer7 --l7proto nntp -j MARK --set-mark $MARKPRIO3 iptables -t mangle -A adsl-out -m layer7 --l7proto pop3 -j MARK --set-mark $MARKPRIO3 iptables -t mangle -A adsl-out -m layer7 --l7proto smtp -j MARK --set-mark $MARKPRIO3 iptables -t mangle -A adsl-out -m layer7 --l7proto ssh -j MARK --set-mark $MARKPRIO1 iptables -t mangle -A adsl-out -m layer7 --l7proto irc -j MARK --set-mark $MARKPRIO3 iptables -t mangle -A adsl-out -m layer7 --l7proto aim -j MARK --set-mark $MARKPRIO3 iptables -t mangle -A adsl-out -m layer7 --l7proto msnmessenger -j MARK --set-mark $MARKPRIO3 iptables -t mangle -A adsl-out -m layer7 --l7proto msn-filetransfer -j MARK --set-mark $MARKPRIO3 iptables -t mangle -A adsl-out -m layer7 --l7proto jabber -j MARK --set-mark $MARKPRIO3 iptables -t mangle -A adsl-out -m layer7 --l7proto bittorrent -j MARK --set-mark $MARKPRIO4 iptables -t mangle -A adsl-out -m layer7 --l7proto directconnect -j MARK --set-mark $MARKPRIO4 iptables -t mangle -A adsl-out -m layer7 --l7proto edonkey -j MARK --set-mark $MARKPRIO4 iptables -t mangle -A adsl-out -m layer7 --l7proto fasttrack -j MARK --set-mark $MARKPRIO4 iptables -t mangle -A adsl-out -m layer7 --l7proto gnutella -j MARK --set-mark $MARKPRIO4 iptables -t mangle -A adsl-out -m layer7 --l7proto tesla -j MARK --set-mark $MARKPRIO3 iptables -t mangle -A adsl-out -m layer7 --l7proto unknown -j MARK --set-mark $MARKPRIO3 iptables -t mangle -A adsl-out -m layer7 --l7proto ntp -j MARK --set-mark $MARKPRIO2 iptables -t mangle -A adsl-out -m mark --mark 0 -j MARK --set-mark $MARKPRIO3
### Pa za download ############ iptables -t mangle -A adsl-in -p icmp -j MARK --set-mark $MARKPRIO1 iptables -t mangle -A adsl-in -m layer7 --l7proto dns -j MARK --set-mark $MARKPRIO1 iptables -t mangle -A adsl-in -m layer7 --l7proto sip -j MARK --set-mark $MARKPRIO1 iptables -t mangle -A adsl-in -m layer7 --l7proto rdp -j MARK --set-mark $MARKPRIO1 iptables -t mangle -A adsl-in -m layer7 --l7proto vnc -j MARK --set-mark $MARKPRIO1 iptables -t mangle -A adsl-in -m layer7 --l7proto exe -j MARK --set-mark $MARKPRIO3 iptables -t mangle -A adsl-in -m layer7 --l7proto flash -j MARK --set-mark $MARKPRIO3 iptables -t mangle -A adsl-in -m layer7 --l7proto ogg -j MARK --set-mark $MARKPRIO3 iptables -t mangle -A adsl-in -m layer7 --l7proto pdf -j MARK --set-mark $MARKPRIO3 iptables -t mangle -A adsl-in -m layer7 --l7proto rar -j MARK --set-mark $MARKPRIO3 iptables -t mangle -A adsl-in -m layer7 --l7proto tar -j MARK --set-mark $MARKPRIO3 iptables -t mangle -A adsl-in -m layer7 --l7proto zip -j MARK --set-mark $MARKPRIO3 iptables -t mangle -A adsl-in -m layer7 --l7proto validcertssl -j MARK --set-mark $MARKPRIO2 iptables -t mangle -A adsl-in -m layer7 --l7proto ftp -j MARK --set-mark $MARKPRIO3 iptables -t mangle -A adsl-in -m layer7 --l7proto http -j MARK --set-mark $MARKPRIO2 iptables -t mangle -A adsl-in -m layer7 --l7proto imap -j MARK --set-mark $MARKPRIO3 iptables -t mangle -A adsl-in -m layer7 --l7proto nntp -j MARK --set-mark $MARKPRIO3 iptables -t mangle -A adsl-in -m layer7 --l7proto pop3 -j MARK --set-mark $MARKPRIO3 iptables -t mangle -A adsl-in -m layer7 --l7proto smtp -j MARK --set-mark $MARKPRIO3 iptables -t mangle -A adsl-in -m layer7 --l7proto ssh -j MARK --set-mark $MARKPRIO1 iptables -t mangle -A adsl-in -m layer7 --l7proto irc -j MARK --set-mark $MARKPRIO3 iptables -t mangle -A adsl-in -m layer7 --l7proto aim -j MARK --set-mark $MARKPRIO3 iptables -t mangle -A adsl-in -m layer7 --l7proto msnmessenger -j MARK --set-mark $MARKPRIO3 iptables -t mangle -A adsl-in -m layer7 --l7proto msn-filetransfer -j MARK --set-mark $MARKPRIO3 iptables -t mangle -A adsl-in -m layer7 --l7proto jabber -j MARK --set-mark $MARKPRIO3 iptables -t mangle -A adsl-in -m layer7 --l7proto bittorrent -j MARK --set-mark $MARKPRIO4 iptables -t mangle -A adsl-in -m layer7 --l7proto directconnect -j MARK --set-mark $MARKPRIO4 iptables -t mangle -A adsl-in -m layer7 --l7proto edonkey -j MARK --set-mark $MARKPRIO4 iptables -t mangle -A adsl-in -m layer7 --l7proto fasttrack -j MARK --set-mark $MARKPRIO4 iptables -t mangle -A adsl-in -m layer7 --l7proto gnutella -j MARK --set-mark $MARKPRIO4 iptables -t mangle -A adsl-in -m layer7 --l7proto tesla -j MARK --set-mark $MARKPRIO3 iptables -t mangle -A adsl-in -m layer7 --l7proto unknown -j MARK --set-mark $MARKPRIO3 iptables -t mangle -A adsl-in -m layer7 --l7proto ntp -j MARK --set-mark $MARKPRIO2 iptables -t mangle -A adsl-in -m mark --mark 0 -j MARK --set-mark $MARKPRIO3
### Klasifikacija po gornjim pravilima ### iptables -t mangle -A PREROUTING -i ppp0 -j adsl-in iptables -t mangle -A POSTROUTING -o ppp0 -j adsl-out iptables -t mangle -A INPUT -i ppp0 -j adsl-in iptables -t mangle -A OUTPUT -o ppp0 -j adsl-out
## Predamo pakete IMQ device-ima ### iptables -t mangle -A adsl-in -j IMQ --todev 1 iptables -t mangle -A adsl-out -j IMQ --todev 0
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
NAPOMENE: Ovaj firewall je potpuno otvoren, dakle, vrši samo traffic shaping, nema nikakve zaštite. Ako želite promijeniti prioritete pakete, dovoljno im je promijeniti $MARKPRIO vrijednost. Ako želite neki protokol u potpunosti zabraniti, umjesto -j MARK --set-mark jednostavno stavite -j DROP
ZAHVALE: Nikola Špicar (Harry) Franjo Posavec (Franz)
LINKOVI: http://luxik.cdi.cz/~devik/qos/htb/ http://www.abclinuxu.cz/clanky/show/145278?varianta=print&noDiz http://www.debianfordummies.org/wiki/index.php/Firewall_com_Layer7 http://gentoo-wiki.com/HOWTO_Packet_Shaping
|
|