GOTOWIEC - HTB +SQUID

Jacek Rzęsista jasio w myslenice.pl.eu.org
Śro, 17 Wrz 2003, 22:26:35 CEST


Dnia śro 17. września 2003 19:35, Tomasz Witek napisał:
> W liście z śro, 17-09-2003, godz. 19:09, Jacek Rzęsista pisze:
> > > U mnie jak któryś z klientów zdejmie ograniczenia z osiołka, to sam
> > > ma straty 50%, ale nikomu innemu w żaden sposób nie szkodzi.
> >
> > Dokładnie - u mnie jak ktoś włączy kazę itp. to ogranicza pasmo sobie -
> > jemu stronki ciągną się koszmarnie wolno - reszta korzysta normalnie :)
>
> To ja nie wiem jak wy to robicie :(
Bardzo prosto. Lektura "Advanced routing & traffic control" z lartc.org + parę innych dostępnych na sieci np. z linio.terramail.pl + zgrzewka piwa + parę zarwanych nocek + późniejsze szlifowanie regułek "na bieżąco" na podstawie obserwacji = działające ograniczenie. No dobra, nie będę szuja. Podaję gotowca (może go nawet wrzucę do FAQ na stronie PLD ;) ) do wykorzystania.
1. Potrzebne oprogramowanie:
- RA + aktualne wszystkie updates (general i security) , kernel 2.2, ipchains, iproute2, squid-2.5 (ten z paczem na znakowanie pakietów HIT/MISS)
2. Zakładam, że wiecie jak zrobić transparent proxy - czyli wszystko co idzie w świat na porcie 80 z LAN wrzucamy na squida. Reszta - przez maskaradę.
3. "Skrypt" tu zaprezentowany jest mojego autorstwa - udostępniam go na licencji GPL :). 
4. Uprzedzam, że wszystkie wartośći są dostosowane do SDI (prędkość łącza 115200 bit/s).
5. Tak wygląda HTB dla łącza w świat (w tym przypadku interfejs ppp0):

[root w geralt root]# cat htb-ppp0
#!/bin/bash
##################################################################################
# Slowo od autora:
# skrypt udostepniam na licencji GNU GPL
# w razie watpliwosci prosze o kontakt: jasio w myslenice.pl.eu.org
# Jacek Rzesista
##################################################################################
#KONFIGURACJA
#sciezka do binarki tc
TC=/sbin/tc
TC_CL="/sbin/tc class add dev"
TC_QD="/sbin/tc qdisc add dev"
TC_FL="/sbin/tc filter add dev"

#interfejs do Internetu
ETH=ppp0
echo Interfejs do Internetu: $ETH

#predkosc do Internetu - 95% przepustowosci lacza
INT_SPEED=112
INT_SP=$[$INT_SPEED]kbit
echo Predkosc do Internetu: $INT_SP

#pasmo dla SSH, DNS
SSH_SPEED=20
SSH_SP=$[$SSH_SPEED]kbit
echo Pasmo dla SSH, DNS: $SSH_SP

#pasmo dla poczty
SMTP_SPEED=20
SMTP_SP=$[$SMTP_SPEED]kbit
echo Pasmo dla SMTP: $SMTP_SP

#pasmo dla WWW
WWW_SPEED=50
WWW_SP=$[$WWW_SPEED]kbit
echo Pasmo dla WWW: $WWW_SP

#pasmo dla FTP
FTP_SPEED=10
FTP_SP=$[$FTP_SPEED]kbit
echo Pasmo dla FTP: $FTP_SP

#reszta pasma (np. Kazaa, itp.)
OTHER_SPEED=${INT_SPEED}-${SSH_SPEED}-${SMTP_SPEED}-${WWW_SPEED}-${FTP_SPEED}
OTHER_SP=$[$OTHER_SPEED]kbit
#max. pasmo dla Kazaa, itp.
OTHER_FULL_SP=$[${INT_SPEED}/2]kbit
echo Pozostale pasmo i max. pozostałego pasma: $OTHER_SP $OTHER_FULL_SP
##################################################################################
#czyszczenie
$TC qdisc del root dev $ETH

#kolejka glowna HTB
$TC_QD $ETH root handle 1:0 htb default 6

#predkosc interfejsu do Internetu
$TC_CL $ETH parent 1:0 classid 1:1 htb rate $INT_SP ceil $INT_SP

#podzial calego pasma na:
# - ssh, DNS
$TC_CL $ETH parent 1:1 classid 1:2 htb rate $SSH_SP ceil $INT_SP prio 1
$TC_FL $ETH protocol ip parent 1:0 u32 match ip sport 22 0xffff flowid 1:2
$TC_FL $ETH protocol ip parent 1:0 u32 match ip dport 22 0xffff flowid 1:2
$TC_FL $ETH protocol ip parent 1:0 u32 match ip dport 53 0xffff flowid 1:2
$TC_FL $ETH protocol ip parent 1:0 u32 match ip sport 53 0xffff flowid 1:2
$TC_QD $ETH parent 1:2 handle 100:0 sfq perturb 10

# - smtp
$TC_CL $ETH parent 1:1 classid 1:3 htb rate $SMTP_SP ceil $INT_SP prio 2
$TC_FL $ETH protocol ip parent 1:0 u32 match ip sport 25 0xffff flowid 1:3
$TC_FL $ETH protocol ip parent 1:0 u32 match ip dport 25 0xffff flowid 1:3
$TC_QD $ETH parent 1:3 handle 101:0 sfq perturb 10

# - www
$TC_CL $ETH parent 1:1 classid 1:4 htb rate $WWW_SP ceil $INT_SP prio 4
$TC_FL $ETH protocol ip parent 1:0 u32 match ip sport 80 0xffff flowid 1:4
$TC_FL $ETH protocol ip parent 1:0 u32 match ip dport 80 0xffff flowid 1:4
$TC_QD $ETH parent 1:4 handle 102:0 sfq perturb 10

# - ftp
$TC_CL $ETH parent 1:1 classid 1:5 htb rate $FTP_SP ceil $INT_SP prio 6
$TC_FL $ETH protocol ip parent 1:0 u32 match ip sport 20 0xffff flowid 1:5
$TC_FL $ETH protocol ip parent 1:0 u32 match ip sport 21 0xffff flowid 1:5
$TC_QD $ETH parent 1:5 handle 103:0 sfq perturb 10

# - reszta (np. KAZAA)
$TC_CL $ETH parent 1:1 classid 1:6 htb rate $OTHER_SP ceil $OTHER_FULL_SP prio 9
$TC_FL $ETH protocol ip parent 1:0 u32 match ip sport 1214 0xffff flowid 1:6
$TC_FL $ETH protocol ip parent 1:0 u32 match ip dport 1214 0xffff flowid 1:6
$TC_QD $ETH parent 1:6 handle 104:0 sfq perturb 10

6. A tak dla LAN-u (w tym przypadku interfejs eth0, sieć 10MBit):

[root w geralt root]# cat htb-eth0
#!/bin/bash
##################################################################################
# Slowo od autora:
# skrypt udostepniam na licencji GNU GPL
# w razie watpliwosci prosze o kontakt: jasio w myslenice.pl.eu.org
# Jacek Rzesista
##################################################################################
#KONFIGURACJA
#sciezka do binarki tc
TC=/sbin/tc
TC_CL="/sbin/tc class add dev"
TC_QD="/sbin/tc qdisc add dev"
TC_FL="/sbin/tc filter add dev"

#interfejs LAN
ETH=eth0
echo Interfejs do sieci lokalnej to: $ETH

#predkosc interfejsu do LAN (zmierzona ttcp)
NET_SPEED=8000
NET_SP=$[$NET_SPEED]Kbit
echo Predkosc LAN: $NET_SP

#predkosc do Internetu - 95% przepustowosci lacza
INT_SPEED=105
INT_SP=$[$INT_SPEED]kbit
echo Predkosc do Internetu: $INT_SP

#predkosc LAN=NET-INT
LAN_SP=$[${NET_SPEED}-${INT_SPEED}]kbit
echo Predkosc do serwera: $LAN_SP

#ilosc uzytkownikow
USERS_NUM=7
echo Liczba uzytkownikow: $USERS_NUM

#pasmo na uzytkownika
USER_SPEED=$[${INT_SPEED}/${USERS_NUM}]kbit
echo Pasmo dla uzytkownika: $USER_SPEED
##################################################################################
#czyszczenie
$TC qdisc del root dev $ETH

#kolejka glowna HTB
$TC_QD $ETH root handle 2:0 htb

#predkosc interfejsu do LAN
$TC_CL $ETH parent 2:0 classid 2:1 htb rate $NET_SP ceil $NET_SP

#podzial calego pasma sieci lokalnej na:
# - Internet
$TC_CL $ETH parent 2:1 classid 2:2 htb rate $INT_SP ceil $INT_SP prio 1
# - LAN
$TC_CL $ETH parent 2:1 classid 2:3 htb rate $LAN_SP ceil $LAN_SP prio 9
#pakiety HIT ze squida przez transparent proxy
$TC_FL $ETH  protocol ip preference 1 parent 2:0 u32 match ip src 192.168.1.1 match ip sport 80 0xffff match ip tos 0x00 0xff flowid 2:3
#pakiety HIT ze squida wprost
$TC_FL $ETH  protocol ip preference 1 parent 2:0 u32 match ip src 192.168.1.1 match ip sport 3128 0xffff match ip tos 0x00 0xff flowid 2:3
#samba
$TC_FL $ETH  protocol ip preference 1 parent 2:0 u32 match ip src 192.168.1.1 match ip sport 137 0xffff flowid 2:3
$TC_FL $ETH  protocol ip preference 1 parent 2:0 u32 match ip src 192.168.1.1 match ip sport 138 0xffff flowid 2:3
$TC_FL $ETH  protocol ip preference 1 parent 2:0 u32 match ip src 192.168.1.1 match ip sport 139 0xffff flowid 2:3
#ssh
$TC_FL $ETH  protocol ip preference 1 parent 2:0 u32 match ip src 192.168.1.1 match ip sport 22 0xffff flowid 2:3
#nfs - ale nie wiem czemu dziala tylko w jedna strone :(
$TC_FL $ETH  protocol ip preference 1 parent 2:0 u32 match ip src 192.168.1.1 match ip sport 2049 0xffff flowid 2:3
#pop3
$TC_FL $ETH  protocol ip preference 1 parent 2:0 u32 match ip src 192.168.1.1 match ip sport 110 0xffff flowid 2:3
#pop3s
$TC_FL $ETH  protocol ip preference 1 parent 2:0 u32 match ip src 192.168.1.1 match ip sport 995 0xffff flowid 2:3
#smtp
$TC_FL $ETH  protocol ip preference 1 parent 2:0 u32 match ip src 192.168.1.1 match ip sport 25 0xffff flowid 2:3
$TC_QD $ETH parent 2:3 handle 3:0 sfq perturb 10

#podzial pasma do Internetu dla uzytkownikow
# 192.168.1.2
$TC_CL $ETH parent 2:2 classid 2:4 htb rate $USER_SPEED ceil $INT_SP prio 2 quantum 1500
$TC_FL $ETH protocol ip preference 3 parent 2:0 u32 match ip dst 192.168.1.2 flowid 2:4
$TC_QD $ETH parent 2:4 handle 4:0 sfq perturb 10

# 192.168.1.3
$TC_CL $ETH parent 2:2 classid 2:5 htb rate $USER_SPEED ceil $INT_SP prio 2 quantum 1500
$TC_FL $ETH protocol ip preference 3 parent 2:0 u32 match ip dst 192.168.1.3 flowid 2:5
$TC_QD $ETH parent 2:5 handle 5:0 sfq perturb 10

# 192.168.1.4
$TC_CL $ETH parent 2:2 classid 2:6 htb rate $USER_SPEED ceil $INT_SP prio 1 quantum 1500
$TC_FL $ETH protocol ip preference 3 parent 2:0 u32 match ip dst 192.168.1.4 flowid 2:6
$TC_QD $ETH parent 2:6 handle 6:0 sfq perturb 10

# 192.168.1.5
$TC_CL $ETH parent 2:2 classid 2:7 htb rate $USER_SPEED ceil $INT_SP prio 2 quantum 1500
$TC_FL $ETH protocol ip preference 3 parent 2:0 u32 match ip dst 192.168.1.5 flowid 2:7
$TC_QD $ETH parent 2:7 handle 7:0 sfq perturb 10

# 192.168.1.6
$TC_CL $ETH parent 2:2 classid 2:8 htb rate $USER_SPEED ceil $INT_SP prio 2 quantum 1500
$TC_FL $ETH protocol ip preference 3 parent 2:0 u32 match ip dst 192.168.1.6 flowid 2:8
$TC_QD $ETH parent 2:8 handle 8:0 sfq perturb 10

#192.168.1.7
$TC_CL $ETH parent 2:2 classid 2:9 htb rate $USER_SPEED ceil $INT_SP prio 2 quantum 1500
$TC_FL $ETH protocol ip preference 3 parent 2:0 u32 match ip dst 192.168.1.7 flowid 2:9
$TC_QD $ETH parent 2:9 handle 9:0 sfq perturb 10

#192.168.1.8
$TC_CL $ETH parent 2:2 classid 2:10 htb rate $USER_SPEED ceil $INT_SP prio 2 quantum 1500
$TC_FL $ETH protocol ip preference 3 parent 2:0 u32 match ip dst 192.168.1.8 flowid 2:10
$TC_QD $ETH parent 2:10 handle 10:0 sfq perturb 10
-- 
Jacek Rzęsista
ICQ:19324277
Gadu-Gadu:61213




Więcej informacji o liście dyskusyjnej pld-users-pl