+++
title = 'Bandwith Limiting using Squid Proxy Server with Delay Pools and CBQ'
date = ''
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, λογικά θα υπάρξει και νεότερη με περισσότερες τεχνικές και διορθώσεις.

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

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

