Bandwith Limiting using Squid Proxy Server with Delay Pools and CBQ

Αντώνιος Χάψας
Φεβ 2006

Ένα από τα κοινά προβλήματα που αντιμετωπίζει κάποιος στο μοίρασμα μιας σύνδεσης είναι ο σωστός καταμερισμός του bandwith και ο τρόπος διαχείρισης των χρηστών κατά τέτοιο τρόπο ώστε να υπάρξει η μέγιστη χρήση του δικτύου και η ισόποση κατανομή πακέτων σε όλους. Το παρακάτω κείμενο είναι μια μικρή προσπάθεια επίλυσης ενός τέτοιου προβλήματος.

1. Σενάριο

2. Τι θα χρειαστούμε

3. Εγκατάσταση Squid Proxy with Delay Pools Enabled

4. Introducing CBQ (What is CBQ ?)

5. About

6. Τέλος

[1. Σενάριο]

Ας υποθέσουμε ότι έχουμε μια dsl γραμμή και 5 χρήστες που μοιράζονται αυτή την σύνδεση μέσω ενός proxy server που τρέχει linux. Θα θέλαμε για παράδειγμα όταν κατεβάζουν όλοι διάφορα αρχεία από internet να έχουν συγκεκριμένη ταχύτητα πχ. 15 kb/s, κάποιος που κατεβάζει παραπάνω από 2 ώρες να πέφτει η ταχύτητά του στα 5 kb/s (ποίος κατεβάζει συνέχεια ταινίες ?!) και κάποιος που κατεβάζει π.χ. ένα αρχείο .avi η ταχύτητά του να μην ξεπερνάει τα 2kb/s (ας πρόσεχε !). Η λύση σε αυτό γίνεται με την χρήση magic word πχ. .mp3,.exe,.zip.

[2. Τι θα χρειαστούμε]

Καταρχήν ένα pc που τρέχει linux, (στην δικιά μας περίπτωση έτρεχε Mandrake 9.1 αλλά έχει δοκιμαστεί και σε RedHat 6.2, οπότε λογικά πρέπει να παίζει και σε άλλες γνωστές εκδόσεις) μια κάρτα δικτύου σε αυτό και μπόλικη όρεξη. Αυτός ο οδηγός προϋποθέτει ότι υπάρχουν οι βασικές γνώσεις Linux και για αυτό δεν θα σταθούμε αναλυτικά σε εντολές bash. Κατεβάζουμε το squid source από http://www.squid-cache.org[1], στην συγκεκριμένη περίπτωση το squid είχε έκδοση squid-2.5.STABLE4 (έχει δοκιμαστεί και με παλιότερα sources). Για να υπάρχει καλύτερη απόδοση προτείνεται να υπάρχει ένας ξεχωριστός δίσκος που θα υπάρχει η cache του proxy.

1: http://www.squid-cache.org

[3. Εγκατάσταση Squid Proxy with Delay Pools Enabled]

Σε κονσόλα πάντα προσθέτουμε τον χρήστη squid (αν δεν υπάρχει, αν υπάρχει τον αφαιρούμε με userdel) αφού έχουμε φτιάξει ένα directory με όνομα cache:

# useradd -d /cache/ -r -s /dev/null squid >/dev/null 2>&1


Κανένας δεν μπορεί να κάνει login σαν χρήστης squid εννοείται και ο root. Αυτό είναι ένα βήμα βέλτιστης ασφάλειας που μπορεί βεβαίως να παραλειφθεί αν δεν υπάρχει άμεσος κίνδυνος. (πάντα υπάρχει !)

Αφού έχουμε κατεβάσει το squid source το αποσυμπιέζουμε πχ. στο /tmp:

# cd/tmp
# tar xzfv squid-2.5.STABLE4-src.tar.gz
# cd squid-2.5.STABLE4


Είμαστε έτοιμοι για το compile.

#./configure --prefix=/opt/squid --exec-prefix=/opt/squid --enable-delay-pools --enable-cache-digests \
        --enable-poll --disable-ident-lookups --enable-truncate --enable-removal-policies
# make all
# make install


Αφού ολοκληρώσουμε επιτυχώς o squid έχει εγκατασταθεί στο /opt/squid. Και για να είμαστε σίγουροι ότι τα πάντα κάτω από το /opt/squid και /cache ανήκει στον χρήστη squid γράφουμε:

# chown -R squid:squid /opt/squid
# chown -R squid:squid /cache

ή

# chown -R squid.squid /opt/squid
# chown -R squid.squid /cache.


Υποθέτουμε ότι το δίκτυο μας είναι το 192.168.0.0/24. Μετά πάμε στο /opt/squid/etc/squid.conf που είναι το σημαντικότερο βήμα. Ένα τυπικό squid.conf είναι το παρακάτω:

# SQUID CONFIGURATION FILE
# by Αντώνιος Χάψας © 2003.
visible_hostname Dias #Your name pc
http_port 8080
icp_port 3130
acl QUERY urlpath_regex cgi-bin ?
no_cache deny QUERY
cache_mem 64 MB

cache_dir ufs /cache 250 16 256
redirect_rewrites_host_header off
cache_replacement_policy GDSF
emulate_httpd_log on

acl localnet src 192.168.0.0/255.255.255.0
acl localhost src 127.0.0.1/255.255.255.255
acl Safe_ports port 80 443 210 119 70 21 1025-65535
acl CONNECT method CONNECT
acl all src 0.0.0.0/0.0.0.0
http_access allow localnet
http_access allow localhost
http_access deny !Safe_ports
http_access deny CONNECT
http_access deny all

maximum_object_size 3000 KB
store_avg_object_size 50 KB

#Αυτό το κομμάτι το γουστάρω πολύ, 
#για τους έξω χρήστες χρησιμοποιείται τον παρακάτω browser !
anonymize_headers deny User-Agent
fake_user_agent Shit/1.0 (FuckWindows; U; WindowsShit 1.0 i8088)

cache_mgr root
cache_effective_user squid
cache_effective_group squid
log_icp_queries off
buffered_logs on

# Εδώ είναι το κρίσιμο κομμάτι που μας ενδιαφέρει
#DELAY POOLS
#Δεν θέλουμε να περιορίσουμε το κατέβασμα στο τοπικό μας δίκτυο
acl magic_words1 url_regex -i 192.168
#Θέλουμε να περιορίσουμε το κατέβασμα των παρακάτω αρχείων
#Όλα σε μια σειρά
acl magic_words2 url_regex -i ftp .zip .exe .mp3 .rpm .zip .avi .mpeg
# Δεν βάζουμε .htm .html .jpg .gif γιατί συνήθως δεν καταναλώνουν μεγάλο bandwith.
#Εχουμε 2 διαφορετικά delay_pools
delay_pools 2
#1st Delay pool
delay_class 1 2 
#-1/-1 σημαίνει ότι δεν έχουμε όρια
delay parameters 1 -1/-1 -1/-1
delay_access 1 allow magic_words1

#2nd Delay pool
delay_class 2 2 
#Τα παρακάτω νούμερα είναι σε bytes 
# 6000/15000 είναι τα νούμερα για όλο το δίκτυο 
# 5000/15000 είναι για μια απλή ΙΡ 
#για κατέβασμα αρχείων μεγαλύτερο από 150000 bytes
#οι χρήστες συνεχίζουν το κατέβασμα με 5000 bytes/s
delay_parameteres 2 6000/150000 5000/150000
delay_access 2 alllow magic_words2
#Τέλος Αρχείου.


Αφού είμαστε σίγουροι ότι το παραπάνω αρχείο είναι σωστό γράφουμε για να δημιουργηθούν τα cache του directories:

# /opt/squid/sbin/squid -z


Λογικά πρέπει να είμαστε εντάξει, κάνουμε ένα έλεγχο με τους browser μας βάζοντας την ip του server στο 8080. Γράφουμε ένα ps -A | grep squid για να δούμε αν τρέχει. Για να τρέχει κάθε φορά που ξεκινάει ο server μας βάζουμε την παρακάτω γραμμή στο τέλος του /etc/rc.d/rc.local

/opt/squid/sbin/squid -D


Aλλες χρήσιμες εντολές θα μπορούσε να είναι η

# /opt/squid/sbin/squid -κ reconfigure (κάνει reconfigure αν κάναμε αλλαγές στο squid.conf)


όπως και η

# /opt/squid/sbin/squid -help.


[3.1 Παράδειγμα 1]

Περιορισμός μιας γραμμής ολικού bandwith ας πούμε στα 512 Kbs.

acl all src 0.0.0.0/0.0.0.0 #μπορεί να έχει επαναληφθεί πιο πάνω.
delay pools 1
delay_class 1 1
delay_access 1 allow alll
delay_parameteres 1 64000/64000 #512 kbits = 64 kbytes pes sec


[3.2 Παράδειγμα 2]

Περιορισμός μια γραμμής στα 128 Kbps.

acl 128Kusers src 192.168.0.1/255.255.255.0
acl all src 0.0.0.0/0.0.0.0
delay_pools 1
delay_class 1 3
delay_access 1 allow 128kusers
delay_access 1 deny all
delay_parameters 1 64000/64000 -1/-1 16000/64000


Το παραπάνω παράδειγμα δίνει μια λύση σε ένα δίκτυο από ένα σύνολο 512Kbits, και κάθε ΙΡ παίρνει μόνο 128Kbits από αυτό το pool.

Περισσότερα παραδείγματα στο http://www.squid-cache.org/Doc/FAQ/FAQ-19.html[2].

2: http://www.squid-cache.org/Doc/FAQ/FAQ-19.html

[4. Introducing CBQ (What is CBQ ?)]

Η παραπάνω διαδικασία ισχύει αν όλο το traffic διακινείται μέσω του squid proxy server από έναν browser πχ. Internet Explorer. Τι γίνεται όμως αν πχ. έχουμε έναν υπολογιστή που βρίσκεται πίσω από Linux server με Ip Masquerade ? Η λύση λέγεται CBQ. Για να δούμε όμως τι γίνεται. Καταρχήν πρέπει να είναι εγκαταστημένο στο linux μας το iproute2 (συνήθως είναι). Κατεβάζουμε το cbq.init-v0.7.2 από το https://sourceforge.net/projects/cbqinit[3] και το βάζουμε στο /etc/sysconfig/cbq (το directory αν δεν υπάρχει, το φτιάχνουμε). Φτιάχνουμε ένα αρχείο για να περιορίσουμε την κίνηση μέσω του ftp πρωτοκόλλου

3: https://sourceforge.net/projects/cbqinit

# touch /etc/sysconfig/cbq/cbq-10.ftp-network


Βάζουμε μέσα σε αυτό:

DEVICE=eth0,10Kbit,1Mbit
RATE=10Kbit
WEIGHT=1Kbit
PRIO=5
RULE=:20,192.168.0.0/24
RULE=:21,192.168.0.0/24


Για κάθε μια από τις παραπάνω εντολές υπάρχει επεξήγηση στο cbq.init-v0.7.2 αρχείο.

Μετά τρέχουμε ./cbq.init-v0.7.2 compile (είναι εκτελέσιμο, αν δεν είναι chmod +x cbq.init-v0.7.2) και κατόπιν ./cbq.init-v0.7.2 start και είμαστε έτοιμοι για δοκιμές. Σε μένα λειτούργησε χωρίς κανένα πρόβλημα απολύτως. Με το παραπάνω ο server μας δεν θα στέλνει ftp data στο eth0 γρηγορότερα από 10kbits/sec και δεν θα κατεβάζει γρηγορότερα από 10kbits/sec. Αν πχ μέσω squid υπάρχει καλύτερη απόδοση ο χρήστης θα αναγκαστεί να χρησιμοποιεί τον squid για τα downloads του. Ας φτιάξουμε ένα ακόμα παράδειγμα πχ. για το Windows Media Player και το Emule.

DEVICE=eth0,10Mbit,1Mbit
RATE=50Kbit
WEIGHT=5Kbit
PRIO=5
#Windows Media Player
RULE=:1755,192.168.0.0/24
#Emule
RULE=:4661,192.168.0.0/24
RULE=:4671,192.168.0.0/24 # Διορθώστε με μήπως κάνω λάθος τις πόρτες.


Αν θέλουμε να είμαστε πιο έξυπνοι μπορούμε να βάλουμε πολλούς ρόλους στο cbq και να είμαστε αυστηροί στο μοίρασμα του bandwith (με το σταγονόμετρο !) έτσι ώστε να αναγκάσουμε όλο τον κόσμο να χρησιμοποιεί τον proxy server (θέλοντας και μη !). Αν τρέχουμε Ip-Masquerade για να έχουν οι χρήστες icq, email κ.α. ή για κάποιο άλλο λόγο, καλό θα ήταν για τους εξυπνάκηδες του δικτύου μας, να τρέχαμε iptables με περιορισμούς (ipchains επίσης για παλαιότερες εκδόσεις Linux) έτσι ώστε κανένας να μην συνδέετε απευθείας (Ip-Masquerade).

Τέλος αφού βλέπουμε ότι όλα είναι εντάξει βάζουμε στο /etc/rc.d/rc.local στο τέλος το cbq.init-v0.7.2 start για να ξεκινάει κάθε φορά που γίνεται εκκίνηση στον υπολογιστή μας.

Υπάρχει ένας ακόμα εύκολος αλλά μάλλον ξεπερασμένος τρόπος για να γίνει αυτό το traffic shaping. Στην διαδρομή /usr/src/linux-2.4.21-0.13mdk/Documentation/networking/ (σε έκδοση Mandrake 9.1) υπάρχει το αρχείο shaper.txt που αναφέρει πως, αλλά είναι μάλλον για μια εύκολη και περιστασιακή περίπτωση και δεν δίνει ευελιξία στον server μας.

[5. About]

Το παραπάνω κείμενο δημιουργήθηκε εξ ολοκλήρου σε Linux Mandrake 9.1 και γράφτηκε με την χρήση του προγράμματος OpenOffice 1.0.2. (Για να είμαι πάντως ειλικρινής είχα εγκαταστήσει την γραμματοσειρά verdana από τα windows στο OpenOffice!) Οι παραπάνω οδηγίες έγιναν επιτυχώς στο ίδιο λειτουργικό χωρίς κανένα απολύτως πρόβλημα.

[6. Τέλος]

Η παραπάνω προσπάθεια έγινε εκ μέρους μου θέλοντας να βάλω και εγώ ένα λιθαράκι στην προσπάθεια μερικών administrators να ομαλοποιήσουν και να αυξήσουν τις δυνατότητες των δικτύων τους, με την χρήση πάντα Open Source λειτουργικών συστημάτων και προγραμμάτων που είναι free. Το παραπάνω κείμενο λογικά θα περιέχει κάποια λάθη γι αυτό θα εκτιμηθεί ιδιαίτερα οποιαδήποτε διόρθωση. Το email μου είναι το antonyhapsas@hotmail.com και είναι δεκτή οποιαδήποτε διόρθωση/παρατήρηση. Αυτή είναι η πρώτη έκδοση αυτού του tutorial, λογικά θα υπάρξει και νεότερη με περισσότερες τεχνικές και διορθώσεις.

Και για να έχουμε φυλαγμένα τα νώτα μας

ΔΕΝ ΥΠΑΡΧΕΙ ΚΑΜΙΑ ΑΠΟΛΥΤΩΣ ΕΓΓΥΗΣΗ ΟΤΙ ΤΑ ΠΑΡΑΠΑΝΩ ΔΕΝ ΠΡΟΚΕΙΤΑΙ ΝΑ ΚΑΤΑΣΤΡΕΨΟΥΝ ΤΟ ΛΕΙΤΟΥΡΓΙΚΟ ΣΑΣ Η ΝΑ ΔΗΜΙΟΥΡΓΗΣΟΥΝ ΑΝΕΠΑΝΟΡΘΩΤΗ ΒΛΑΒΗ ΣΤΟΝ ΥΠΟΛΟΓΙΣΤΗ ΣΑΣ. Η ΠΑΡΑΠΑΝΩ ΔΙΑΔΙΚΑΣΙΑ ΓΙΝΕΤΑΙ ΠΑΝΤΑ ΜΕ ΔΙΚΗ ΣΑΣ ΕΥΘΥΝΗ.

Αρχική Σελίδα