Αντώνιος Χάψας Φεβ 2006
Ένα από τα κοινά προβλήματα που αντιμετωπίζει κάποιος στο μοίρασμα μιας σύνδεσης είναι ο σωστός καταμερισμός του bandwith και ο τρόπος διαχείρισης των χρηστών κατά τέτοιο τρόπο ώστε να υπάρξει η μέγιστη χρήση του δικτύου και η ισόποση κατανομή πακέτων σε όλους. Το παρακάτω κείμενο είναι μια μικρή προσπάθεια επίλυσης ενός τέτοιου προβλήματος.
1. Σενάριο
2. Τι θα χρειαστούμε
3. Εγκατάσταση Squid Proxy with Delay Pools Enabled
4. Introducing CBQ (What is CBQ ?)
5. About
6. Τέλος
Ας υποθέσουμε ότι έχουμε μια dsl γραμμή και 5 χρήστες που μοιράζονται αυτή την σύνδεση μέσω ενός proxy server που τρέχει linux. Θα θέλαμε για παράδειγμα όταν κατεβάζουν όλοι διάφορα αρχεία από internet να έχουν συγκεκριμένη ταχύτητα πχ. 15 kb/s, κάποιος που κατεβάζει παραπάνω από 2 ώρες να πέφτει η ταχύτητά του στα 5 kb/s (ποίος κατεβάζει συνέχεια ταινίες ?!) και κάποιος που κατεβάζει π.χ. ένα αρχείο .avi η ταχύτητά του να μην ξεπερνάει τα 2kb/s (ας πρόσεχε !). Η λύση σε αυτό γίνεται με την χρήση magic word πχ. .mp3,.exe,.zip.
Καταρχήν ένα 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.
Σε κονσόλα πάντα προσθέτουμε τον χρήστη 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.
Περιορισμός μιας γραμμής ολικού 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
Περιορισμός μια γραμμής στα 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
Η παραπάνω διαδικασία ισχύει αν όλο το 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 μας.
Το παραπάνω κείμενο δημιουργήθηκε εξ ολοκλήρου σε Linux Mandrake 9.1 και γράφτηκε με την χρήση του προγράμματος OpenOffice 1.0.2. (Για να είμαι πάντως ειλικρινής είχα εγκαταστήσει την γραμματοσειρά verdana από τα windows στο OpenOffice!) Οι παραπάνω οδηγίες έγιναν επιτυχώς στο ίδιο λειτουργικό χωρίς κανένα απολύτως πρόβλημα.
Η παραπάνω προσπάθεια έγινε εκ μέρους μου θέλοντας να βάλω και εγώ ένα λιθαράκι στην προσπάθεια μερικών administrators να ομαλοποιήσουν και να αυξήσουν τις δυνατότητες των δικτύων τους, με την χρήση πάντα Open Source λειτουργικών συστημάτων και προγραμμάτων που είναι free. Το παραπάνω κείμενο λογικά θα περιέχει κάποια λάθη γι αυτό θα εκτιμηθεί ιδιαίτερα οποιαδήποτε διόρθωση. Το email μου είναι το antonyhapsas@hotmail.com και είναι δεκτή οποιαδήποτε διόρθωση/παρατήρηση. Αυτή είναι η πρώτη έκδοση αυτού του tutorial, λογικά θα υπάρξει και νεότερη με περισσότερες τεχνικές και διορθώσεις.
Και για να έχουμε φυλαγμένα τα νώτα μας
ΔΕΝ ΥΠΑΡΧΕΙ ΚΑΜΙΑ ΑΠΟΛΥΤΩΣ ΕΓΓΥΗΣΗ ΟΤΙ ΤΑ ΠΑΡΑΠΑΝΩ ΔΕΝ ΠΡΟΚΕΙΤΑΙ ΝΑ ΚΑΤΑΣΤΡΕΨΟΥΝ ΤΟ ΛΕΙΤΟΥΡΓΙΚΟ ΣΑΣ Η ΝΑ ΔΗΜΙΟΥΡΓΗΣΟΥΝ ΑΝΕΠΑΝΟΡΘΩΤΗ ΒΛΑΒΗ ΣΤΟΝ ΥΠΟΛΟΓΙΣΤΗ ΣΑΣ. Η ΠΑΡΑΠΑΝΩ ΔΙΑΔΙΚΑΣΙΑ ΓΙΝΕΤΑΙ ΠΑΝΤΑ ΜΕ ΔΙΚΗ ΣΑΣ ΕΥΘΥΝΗ.