Squid Proxy Server :: A very simple tutorial
Contents
Squid Proxy Server
Home Page : http://www.squid-cache.org/
Squid: Optimising Web Delivery
Squid is a caching proxy for the Web supporting HTTP, HTTPS, FTP, and more.
Installation
Version 3
wget -c http://www.eu.squid-cache.org/Versions/v3/3.0/squid-3.0.STABLE14.tar.bz2 tar jxvf squid-3.0.STABLE14.tar.bz2 cd squid-3.0.STABLE14 ./configure \ --enable-linux-netfilter make make install
Default squid.conf
Το παρακάτω αρχείο ρυθμίσεων περιέχει τις προκαθορισμένες τιμές ρύθμισης του squid.
/usr/local/squid/etc/squid.conf
acl manager proto cache_object acl localhost src 127.0.0.1/32 acl to_localhost dst 127.0.0.0/8 acl localnet src 10.0.0.0/8 # RFC1918 possible internal network acl localnet src 172.16.0.0/12 # RFC1918 possible internal network acl localnet src 192.168.0.0/16 # RFC1918 possible internal network acl SSL_ports port 443 acl Safe_ports port 80 # http acl Safe_ports port 21 # ftp acl Safe_ports port 443 # https acl Safe_ports port 70 # gopher acl Safe_ports port 210 # wais acl Safe_ports port 1025-65535 # unregistered ports acl Safe_ports port 280 # http-mgmt acl Safe_ports port 488 # gss-http acl Safe_ports port 591 # filemaker acl Safe_ports port 777 # multiling http acl CONNECT method CONNECT http_access allow manager localhost http_access deny manager http_access deny! Safe_ports http_access deny CONNECT! SSL_ports http_access allow localnet http_access deny all icp_access allow localnet icp_access deny all htcp_access allow localnet htcp_access deny all http_port 3128 hierarchy_stoplist cgi-bin ? access_log /usr/local/squid/var/logs/access.log squid refresh_pattern ^ftp: 1440 20% 10080 refresh_pattern ^gopher: 1440 0% 1440 refresh_pattern (cgi-bin|\?) 0 0% 0 refresh_pattern . 0 20% 4320 icp_port 3130 coredump_dir /usr/local/squid/var/cache
Squid.conf
Για περισσότερες πληροφορίες σχετικά την παραμετροποίηση του αρχείου ρυθμίσεων πατήστε εδώ :
http://www.eu.squid-cache.org/Versions/v3/3.0/cfgman/
Το παρακάτω αρχείο περιέχει ελάχιστες αλλαγές σε σχέση με το παραπάνω.
Για κάθε αλλαγή έχω προσθέσει σχόλια ώστε να γίνεται ευνόητη η ρύθμιση που κάνω.
Τι έχουμε δηλώσει :
- Έχουμε δηλώσει το δικό μας δίκτυο – class c 192.168.0/24
- Έχουμε επιτρέψει την http κίνηση για το δίκτυό μας
- Έχουμε προσθέσει αρχεία logs για διαχειριστικούς λόγους κυρίως
- Έχουμε τροποποιήσει την θέση που γράφεται το PID
- Έχουμε ορίσει εμείς ποιος χρήστης θα είναι owner της υπηρεσίας (default : nobody)
/usr/local/squid/etc/squid.conf
acl all src 0.0.0.0/0.0.0.0 # Declaration of our Network in ACL acl myNet src 192.168.0.0/255.255.255.0 # end acl manager proto cache_object acl localhost src 127.0.0.1/255.255.255.255 acl to_localhost dst 127.0.0.0/8 acl SSL_ports port 443 acl Safe_ports port 80 # http acl Safe_ports port 21 # ftp acl Safe_ports port 443 # https acl Safe_ports port 70 # gopher acl Safe_ports port 210 # wais acl Safe_ports port 1025-65535 # unregistered ports acl Safe_ports port 280 # http-mgmt acl Safe_ports port 488 # gss-http acl Safe_ports port 591 # filemaker acl Safe_ports port 777 # multiling http acl CONNECT method CONNECT # Allow http access for our network in ACL http_access allow myNet # end http_access allow manager localhost http_access deny manager http_access deny! Safe_ports http_access deny CONNECT! SSL_ports http_access deny all icp_access allow all http_port 3128 hierarchy_stoplist cgi-bin ? access_log /usr/local/squid/var/logs/access.log squid # Declaration of cache logs and pid file cache_store_log /usr/local/squid/var/logs/store.log cache_log /usr/local/squid/var/logs/squid_debug.log pid_filename /usr/local/squid/var/logs/squid.pid # end acl QUERY urlpath_regex cgi-bin \? cache deny QUERY refresh_pattern ^ftp: 1440 20% 10080 refresh_pattern ^gopher: 1440 0% 1440 refresh_pattern . 0 20% 4320 acl apache rep_header Server ^Apache broken_vary_encoding allow apache coredump_dir /usr/local/squid/var/cache # Declaration of User/Group cache_effective_user squid cache_effective_group squid # end
Debug / Starting Squid Proxy Server
Πριν εκκινήσουμε το squid πρέπει να ακολουθήσουμε τα παρακάτω βήματα :
- Δημιουργήσουμε τον κατάλογο στον οποίο θα χρησιμοποιεί ως cache
- Αρχικοποίηση του καταλόγου ο οποίος θα χρησιμοποιηθεί ως cache
- Δημιουργήσουμε τον χρήστη με τον οποίο θα τρέχει το service
- Αλλάξουμε την δικαιωδοσία στον κατάλογο που έχουμε εγκαταστήσει το squid
- Να ελέγξουμε εάν χρειάζεται κάτι άλλο / λειτουργία του squid
Όλα τα παραπάνω βήματα γίνονται εύκολα με τις παρακάτω εντολές :
mkdir -pv /usr/local/squid/var/cache useradd -c 'Squid Proxy User' -s /usr/sbin/nologin -d /usr/local/squid squid chown -R squid /usr/local/squid/ /usr/local/squid/sbin/squid -z
Debug
Για να ελέγξουμε την λειτουργία του squid πληκτρολογούμε την εξής εντολή:
/usr/local/squid/sbin/squid -N -d 1 -D
Start
Αφού έχουμε βεβαιωθεί για την πλήρη και σωστή λειτουργία του Squid Proxy Server
είμαστε έτοιμοι για να ξεκινήσουμε το squid ως δαίμονα με την παρακάτω εντολή:
/usr/local/squid/sbin/squid -sY -f /usr/local/squid/etc/squid.conf
cache
Εάν για οποιοδήποτε λόγο διαγράψουμε την cache ή καλύτερα τα αρχεία που χρησιμοποιεί το squid
για cache memory δεν πρέπει να ξεχάσουμε να ξανατρέξουμε την παρακάτω εντολή :
/usr/local/squid/sbin/squid -z
για να δημιουργηθεί εκ νέου η δομή των αρχείων / καταλόγων ώστε να χρησιμοποιηθούν ως cache.
Print Version & Configuration Options
squid -v
Transparent Proxy
Περισσότερα εδώ : http://tldp.org/HOWTO/TransparentProxy.html
Παρακάτω αναφέρομαι μόνο όταν θέλω transparent proxy στο ίδιο μηχάνημα, αλλιώς αναζητήστε στο google πως γίνεται :)
Πως δημιουργούμε έναν transparent proxy (ακόμα και στον ίδιο υπολογιστή !!!).
Το παρών μου έφαγε λίγο χρόνο (2 απογευματάκια – και δεν ξέρω από iptables)
για το μάθω / φτιάξω / ελέγξω, οπότε ίσως να υπάρχει κάτι που μου έχει ξεφύγει.
Τι ακριβώς θέλουμε :
Όλες οι σελίδες να περνάνε από τον proxy μας χωρίς να χρειάζεται να
ρυθμίζουμε κάθε φορά σε κάθε (web) εφαρμογή ότι υπάρχει proxy.
Άρα πρέπει το destination port 80 να γίνεται με κάποιο τρόπο redirect στον proxy όπου ακούει στην πόρτα 3128.
Το πρόβλημα :
ο proxy θα κάνει rewrite το πακέτο ώστε το source να είναι αυτός αλλά θα προσπαθήσει να το στείλει και αυτός στην πόρτα 80.
Οπότε το destination port θα είναι πάλι το 80 και θα ξαναγίνει redirect στον proxy κ.ο.κ.
Η λύση :
Η λύση δίνεται κάνοντας χρήση του κανόνα OWNER match του iptables
http://iptables-tutorial.froze[..]rial.html#OWNERMATCH
Υλοποίηση :
Στο αρχείο ρυθμίσεων του squid /usr/local/squid/etc/squid.conf πραγματοποιούμε την εξής αλλαγή :
before : http_port 3128 after: http_port 3128 transparent
Για να είναι transparent και local τότε :
Ως διαχειριστές γράφουμε την εξής εντολή :
iptables -t nat -A OUTPUT -p tcp --dport 80 -m owner ! --uid-owner squid -j REDIRECT --to-ports 3128
Για να δούμε ότι υπάρχει ως κανόνας :
iptables -L -t nat
Υποσημείωση : Εάν τρέξουμε μόνο το παραπάνω iptable rule χωρίς να έχουμε σηκώσει το squid θα δούμε ότι πολύ απλά ΔΕΝ παίζει τπτ
Οπότε με αυτό τον τρόπο το ελέγχουμε ότι παίζει ως rule και όταν σηκώσουμε το squid (δες την ενότητα start παραπάνω)
θα δούμε ότι παίζει μόνο μέσα από τον Squid Proxy Server