324 γραμμές
		
	
	
	
		
			21 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			324 γραμμές
		
	
	
	
		
			21 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
+++
 | 
						||
title = 'Bandwith Limiting using Squid Proxy Server with Delay Pools and CBQ'
 | 
						||
date = '2006-02-01T00:00:00Z'
 | 
						||
description = ''
 | 
						||
author = 'Αντώνιος Χάψας'
 | 
						||
issue = ['Magaz 35']
 | 
						||
issue_weight = 3
 | 
						||
+++
 | 
						||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
 | 
						||
 | 
						||
*Ένα από τα κοινά προβλήματα που αντιμετωπίζει κάποιος στο μοίρασμα μιας σύνδεσης είναι ο σωστός καταμερισμός του bandwith και ο τρόπος διαχείρισης των χρηστών
 | 
						||
κατά τέτοιο τρόπο ώστε να υπάρξει η μέγιστη χρήση του δικτύου και η ισόποση κατανομή πακέτων σε όλους. Το παρακάτω κείμενο είναι μια μικρή προσπάθεια επίλυσης
 | 
						||
ενός τέτοιου προβλήματος.*
 | 
						||
 | 
						||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
 | 
						||
 | 
						||
**1. Σενάριο**
 | 
						||
--------------------------------------
 | 
						||
 | 
						||
**2. Τι θα χρειαστούμε**
 | 
						||
------------------------------------------------
 | 
						||
 | 
						||
**3. Εγκατάσταση Squid Proxy with Delay Pools Enabled**
 | 
						||
-------------------------------------------------------------------------------
 | 
						||
 | 
						||
-   [3.1 Παράδειγμα 1](#ss3.1)
 | 
						||
-   [3.2 Παράδειγμα 2](#ss3.2)
 | 
						||
 | 
						||
**4. Introducing CBQ (What is CBQ ?)**
 | 
						||
--------------------------------------------------------------
 | 
						||
 | 
						||
**5. About**
 | 
						||
------------------------------------
 | 
						||
 | 
						||
**6. Τέλος**
 | 
						||
------------------------------------
 | 
						||
 | 
						||
 | 
						||
### [1. Σενάριο]{#s1}
 | 
						||
 | 
						||
Ας υποθέσουμε ότι έχουμε μια dsl γραμμή και 5 χρήστες που μοιράζονται αυτή την σύνδεση μέσω ενός proxy server που τρέχει linux. Θα θέλαμε για παράδειγμα όταν
 | 
						||
κατεβάζουν όλοι διάφορα αρχεία από internet να έχουν συγκεκριμένη ταχύτητα πχ. 15 kb/s, κάποιος που κατεβάζει παραπάνω από 2 ώρες να πέφτει η ταχύτητά του στα 5
 | 
						||
kb/s (ποίος κατεβάζει συνέχεια ταινίες ?!) και κάποιος που κατεβάζει π.χ. ένα αρχείο .avi η ταχύτητά του να μην ξεπερνάει τα 2kb/s (ας πρόσεχε !). Η λύση σε
 | 
						||
αυτό γίνεται με την χρήση magic word πχ. .mp3,.exe,.zip.
 | 
						||
 | 
						||
 | 
						||
### [2. Τι θα χρειαστούμε]{#s2}
 | 
						||
 | 
						||
Καταρχήν ένα pc που τρέχει linux, (στην δικιά μας περίπτωση έτρεχε Mandrake 9.1 αλλά έχει δοκιμαστεί και σε RedHat 6.2, οπότε λογικά πρέπει να παίζει και σε
 | 
						||
άλλες γνωστές εκδόσεις) μια κάρτα δικτύου σε αυτό και μπόλικη όρεξη. Αυτός ο οδηγός προϋποθέτει ότι υπάρχουν οι βασικές γνώσεις Linux και για αυτό δεν θα
 | 
						||
σταθούμε αναλυτικά σε εντολές bash. Κατεβάζουμε το squid source από http://www.squid-cache.org, στην συγκεκριμένη περίπτωση το squid είχε έκδοση
 | 
						||
squid-2.5.STABLE4 (έχει δοκιμαστεί και με παλιότερα sources). Για να υπάρχει καλύτερη απόδοση προτείνεται να υπάρχει ένας ξεχωριστός δίσκος που θα υπάρχει η
 | 
						||
cache του proxy.
 | 
						||
 | 
						||
 | 
						||
### [3. Εγκατάσταση Squid Proxy with Delay Pools Enabled]{#s3}
 | 
						||
 | 
						||
Σε κονσόλα πάντα προσθέτουμε τον χρήστη 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]{#ss3.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]{#ss3.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.
 | 
						||
 | 
						||
 | 
						||
### [4. Introducing CBQ (What is CBQ ?)]{#s4}
 | 
						||
 | 
						||
Η παραπάνω διαδικασία ισχύει αν όλο το traffic διακινείται μέσω του squid proxy server από έναν browser πχ. Internet Explorer. Τι γίνεται όμως αν πχ. έχουμε
 | 
						||
έναν υπολογιστή που βρίσκεται πίσω από Linux server με Ip Masquerade ? Η λύση λέγεται CBQ. Για να δούμε όμως τι γίνεται. Καταρχήν πρέπει να είναι εγκαταστημένο
 | 
						||
στο linux μας το iproute2 (συνήθως είναι). Κατεβάζουμε το cbq.init-v0.7.2 από το https://sourceforge.net/projects/cbqinit και το βάζουμε στο /etc/sysconfig/cbq
 | 
						||
(το directory αν δεν υπάρχει, το φτιάχνουμε). Φτιάχνουμε ένα αρχείο για να περιορίσουμε την κίνηση μέσω του ftp πρωτοκόλλου
 | 
						||
 | 
						||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
 | 
						||
 | 
						||
    # 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]{#s5}
 | 
						||
 | 
						||
Το παραπάνω κείμενο δημιουργήθηκε εξ ολοκλήρου σε Linux Mandrake 9.1 και γράφτηκε με την χρήση του προγράμματος OpenOffice 1.0.2. (Για να είμαι πάντως
 | 
						||
ειλικρινής είχα εγκαταστήσει την γραμματοσειρά verdana από τα windows στο OpenOffice!) Οι παραπάνω οδηγίες έγιναν επιτυχώς στο ίδιο λειτουργικό χωρίς κανένα
 | 
						||
απολύτως πρόβλημα.
 | 
						||
 | 
						||
 | 
						||
### [6. Τέλος]{#s6}
 | 
						||
 | 
						||
Η παραπάνω προσπάθεια έγινε εκ μέρους μου θέλοντας να βάλω και εγώ ένα λιθαράκι στην προσπάθεια μερικών administrators να ομαλοποιήσουν και να αυξήσουν τις
 | 
						||
δυνατότητες των δικτύων τους, με την χρήση πάντα Open Source λειτουργικών συστημάτων και προγραμμάτων που είναι free. Το παραπάνω κείμενο λογικά θα περιέχει
 | 
						||
κάποια λάθη γι αυτό θα εκτιμηθεί ιδιαίτερα οποιαδήποτε διόρθωση. Το email μου είναι το antonyhapsas\@hotmail.com και είναι δεκτή οποιαδήποτε
 | 
						||
διόρθωση/παρατήρηση. Αυτή είναι η πρώτη έκδοση αυτού του tutorial, λογικά θα υπάρξει και νεότερη με περισσότερες τεχνικές και διορθώσεις.
 | 
						||
 | 
						||
Και για να έχουμε φυλαγμένα τα νώτα μας
 | 
						||
 | 
						||
ΔΕΝ ΥΠΑΡΧΕΙ ΚΑΜΙΑ ΑΠΟΛΥΤΩΣ ΕΓΓΥΗΣΗ ΟΤΙ ΤΑ ΠΑΡΑΠΑΝΩ ΔΕΝ ΠΡΟΚΕΙΤΑΙ ΝΑ ΚΑΤΑΣΤΡΕΨΟΥΝ ΤΟ ΛΕΙΤΟΥΡΓΙΚΟ ΣΑΣ Η ΝΑ ΔΗΜΙΟΥΡΓΗΣΟΥΝ ΑΝΕΠΑΝΟΡΘΩΤΗ ΒΛΑΒΗ ΣΤΟΝ ΥΠΟΛΟΓΙΣΤΗ ΣΑΣ. Η
 | 
						||
ΠΑΡΑΠΑΝΩ ΔΙΑΔΙΚΑΣΙΑ ΓΙΝΕΤΑΙ ΠΑΝΤΑ ΜΕ ΔΙΚΗ ΣΑΣ ΕΥΘΥΝΗ.
 | 
						||
 |