324 γραμμές
21 KiB
Markdown
324 γραμμές
21 KiB
Markdown
+++
|
||
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, λογικά θα υπάρξει και νεότερη με περισσότερες τεχνικές και διορθώσεις.
|
||
|
||
Και για να έχουμε φυλαγμένα τα νώτα μας
|
||
|
||
ΔΕΝ ΥΠΑΡΧΕΙ ΚΑΜΙΑ ΑΠΟΛΥΤΩΣ ΕΓΓΥΗΣΗ ΟΤΙ ΤΑ ΠΑΡΑΠΑΝΩ ΔΕΝ ΠΡΟΚΕΙΤΑΙ ΝΑ ΚΑΤΑΣΤΡΕΨΟΥΝ ΤΟ ΛΕΙΤΟΥΡΓΙΚΟ ΣΑΣ Η ΝΑ ΔΗΜΙΟΥΡΓΗΣΟΥΝ ΑΝΕΠΑΝΟΡΘΩΤΗ ΒΛΑΒΗ ΣΤΟΝ ΥΠΟΛΟΓΙΣΤΗ ΣΑΣ. Η
|
||
ΠΑΡΑΠΑΝΩ ΔΙΑΔΙΚΑΣΙΑ ΓΙΝΕΤΑΙ ΠΑΝΤΑ ΜΕ ΔΙΚΗ ΣΑΣ ΕΥΘΥΝΗ.
|
||
|