Documentation de Squid
Documentation de Squid
Documentation de Squid
Sommaire En cas d'urgence Installation de Debian Configuration rseau Installation de Squid Compilation de SquidCLIENT Configuration en mandataire transparent Commandes utiles pour SquidCLIENT Installation & configuration d'un cache DNS (pdnsd) Surveillance de Squid avec Calamaris Le serveur web lighttpd Prcisions propos du fichier /etc/squid.squid.conf A propos du paramtre refresh_pattern Annexes (scripts et fichiers de configuration) Page 8 Page 7 Page 6 Page 3 Page 4 Page 5 Page 2
En cas d'urgence
-se connecter avec Putty l'adresse 192.168.0.254. Le mot de passe est jslpdl ( "je suis le poinonneur des lilas") et l'utilisateur est root, puis : vrifier la mmoire vive : free -m), l'espace disque df -m le fonctionnement de squid pstree ensuite aller voir dans les logs tail (ou cat ) /var/log/squid/cache.log -si on veut changer l'adresse de la passerelle mais continuer la maintenance sur le proxy, il faut penser changer l'adresse de l'interface eth1, dans le fichier /etc/network/interfaces puis lancer la commande /etc/init.d/networking restart pour reconfigurer les interfaces. -Si Squid ne fonctionne plus, il faut changer l'adresse du routeur RV042 192.168.0.254 (ainsi les clients DHCP ne verront pas le changement).
Installation de l'OS
On installe une distribution Debian(64 bits) de base avec support SSH et 3 partitions en ReiserFS. Ce sytsme de fichier, bien que n'ayant plus de support, est trs rput pour sa rapidit traiter de petits fichiers. C'est adquat pour notre cache. La partition du cache est nomme /cache1 et les 2 partitions de secours /cache2 et /cache3. De plus, afin d'acclerer le cache, on prcise lors du partitionnement noatime (pas de mise jour des inodes chaque accs) et notail(tail concerne les petits fichiers, cela permet de gagner de la place mais fait perdre en performance). Pour utiliser ReiserFS, il faut passer en mode expert pour disposer de plus d'options. Il peut tre ncessaire la fin de rergler l'heure(problme avec les variables locales) : dpkg-reconfigure tzdata.
Configuration en passerelle
On configure (comme sur la capture) les interfaces eth0 pour le WAN et eth1 pour le LAN L'adressage se gre dans le fichier /etc/network/initerfaces. Si besoin le DNS dans le fichier /etc/resolv.conf . Pour relancer les services rseau, il faut lancer la commande : /etc/init.d/networking restart.
Pour router le trafic entre les 2 interfaces, il faut activer l'ip_forwarding en decommentant ip_forward dans le fichier /etc/sysctl.conf. Ce fichier permet de manipuler chaud le noyau. On force la relecture de ce fichier : sysctl -p
Installation du mandataire
Afin d'installer juste que ce que l'on a besoin, on va compiler Squid partir des sources : wget http://www.squid-cache.org/Version/v3/3.1 md5sum tar -zxvf *.tar.gz rm *.md5 *.gz cd sq* On rpond aux dpendances de squid en lanant aptitude build-dep squid3 On configure avec les options optimales (c'est l'avantage d'utiliser les sources) : ./configure --prefix=/usr Pour se conformer aux emplacements par dfaut --localstatedir=/var des fichiers selon Debian --libexecdir=/usr/lib/squid --srcdir=. --datadir=/usr/share/squid --sysconfdir=/etc/squid --with-default-user=proxy with-logdir=/var/log/squid with-pidfile=/var/run/squid.pid enable-async-io=128 Activation de l'criture asynchrone avec un nombre suffisant de thread with-large-files Pour travailler sur des gros fichiers --with-maxfd=32768 disable-carp --enable-removal-policies=heap,lru Un nombre suffisant de files descriptors Option inutile (sert au dialogue entre plusieurs proxy) Politiques de maintenance du cache (la lru est pour la mmoire vive (last recent used) et la heap permet une prfrence aux gros fichiers . Elle sera utils pour le cache sur le disque Inutile, le wccp est un redirection On utilise netfiler de Linux protocole Cisco de
--disable-wccp --disable-wccp2 --enable-err-languages=French enable-default-err-language=French --enable-linux-netfilter --disable-ipv6 --disable-translation --disable-auto-locale --enable-arp-acl --disable-ident-lookups
Activation des pages d'erreurs en franais Activation de l'outil netfilter pour faire du proxy transparent On dsactive tout ce qui est inutile Cette option est active au cas o on veuille bloquer des adresses MAC Squid peut faire des requtes DNS pour identifier les adresses IP, cela ralentit le processus . On dsactive
Puis on compile : make (cette tape est plutt longue) make install (si il n'y pas de messages d'erreurs, on peut continuer) . Si on veut recompiler Squid . Il faudra se dplacer dans le rpertoire o se trouve les sources : cd /home/skill/squid-source Relancer ./configure avec toutes les options dsires (les anciennes sont accessibles
grce la commande squid -v. Puis make clean make make install
Un reboot et si il n'y pas de messages d'erreurs. Les clients connects eth1 peuvent surfer. Pour vrifier les logs d'accs : tail -f /var/log/squid/access.log
Pour rinitialiser le cache (normalement c'est inutile..), il y a 2 partitions de secours, elles sont prtes accueillir un cache . La procdure est renseigne dans le fichier de configuration ( il faut commenter une ligne et en dcommenter une autre puis invoquer la commande : squid -k reconfigure . Ensuite on peut supprimer l'ancien cache (rm -R) . Les sources de Squid, les modules Perl (ncessaire par la suite), les scripts, l'image de la Debian sont sauvegards sur le serveur SKPROD dans le rpertoire commun . Il sera peut tre utile de tlcharger des sources plus rcentes pour Squid, sur le site http://www.squid-cache.org. Un russite de squid s'appelle un TCP_HIT, en moyenne servir 15% de TCP_HIT semble tre correct, 30% est un trs bon score . Cela reste relatif l'usage qui est fait d'internet. Voici comment est logger dans /var/log/squid/access.log :
Afin de lister les objets du cache, on peut utiliser le rapport store.log, la commande suivante donne les objets avec leur type, leur taille et leur URL et les trie par taille (les plus grands en dernier). cat /var/log/squid/store.log | awk '{print$10" "$11" "$13}'|sort -g Ensuite, on peut utiliser squiclient -m purge pour supprimer les objets dsirs (cf capture ci-dessous).
http://www.espacepc.com .
On cre des graphes dans le dossier du serveur Web . On peut consulter les rapports de Squid l'adresse : http://192.168.0.254 . Afin d'automatiser cela, il faut renseigner le fichier /etc/crontab :
Dans un souci de confidentialit, on peut changer les options de rapport . Il faut consulter le manuel : man calamaris. Puis changer la commande lanc dans le fichier /etc/cron.daily/calamaris Par exemple, pour garantir l'anonymat, on pourrait utiliser : cat /var/log/squid/access.log|calamaris -D 10 -P 60 --response-time-report html,graph --output-path /var/www/ --output-file index.html -F
Override-expire : cette option provoque la vrification de la valeur minimale avant de vrifier l'en-tte Expires. Ainsi, un minimum non-nul retourne un cache non-valid mme si la rponse est expire. Override-lastmod : Squid vrifie la valeur min avant le pourcentage LM-facteur .
Reload-into-ims : transforme une directive no-cache en validation IMS (If-Modified-Since) . En d'autres termes, Squid ajoute un entte IMS la demande avant de transmettre. Notez que cela ne fonctionne que pour les objets qui ont un horodatage de dernire modification. La requte sortante conserve la directive no-cache, de sorte qu'elle atteint le serveur d'origine. Ignore-reload : Squid ignore la directive no-cache. Il y a encore d'autres options : ignore-no-cache , ignore-no-store , ignore-must-revalidate , ignore-private , ignore-auth , max-stale=NN ; refresh-ims , store-stale Dans le cas des mises jours Windows et installation Ninit, la capture faite avec Wireshark montrer que seule la directive cache-control : no-cache tait utilise . Donc on se sert de l'option reload-into-ims afin de cacher les objets toute en effectuant une vrification . Plus de renseignement ici : http://www.squid-cache.org/Doc/config/refresh_pattern/
#les instructions suivantes ne servent qu'en cas #d'un miroir local #redirect_program /usr/local/squirm/bin/squirm #redirect_children 20 #acl foo dstdomain .winscp.net #acl foo dstdomain .documentfoundation.org #redirector_access allow foo #redirector_access deny all #redirector_bypass on #les rgles suivantes sont les rgles d'accs #elles dfinissent les ports et les plages d'adresses #autorises par Squid acl manager proto cache_object acl localhost src 127.0.0.1/32 ::1 acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 ::1 acl server src 192.168.0.254 acl localnet src 192.168.0.0/24 acl SSL_ports port 443 acl Safe_ports port 80 acl Safe_ports port 21 acl Safe_ports port 443 acl Safe_ports port 70 acl Safe_ports port 210 acl Safe_ports port 1025-65535 acl Safe_ports port 280 acl Safe_ports port 488 acl Safe_ports port 591 acl Safe_ports port 777 acl CONNECT method CONNECT acl PURGE method PURGE http_access allow PURGE server http_access deny PURGE all http_access allow manager localhost http_access allow manager server http_access deny manager http_access deny !Safe_ports http_access deny CONNECT !SSL_ports #http_access deny to_localhost http_access allow localnet http_access allow localhost http_access deny all #ic on prcise l'interface, le port #et le mode d'coute de Squid http_port 192.168.0.254:3128 intercept # Add any of your own refresh_pattern entries above these. refresh_pattern ^ftp: 1440 20% 10080 refresh_pattern ^gopher: 1440 0% 1440 refresh_pattern -i (/cgi-bin/|\?) 0 0% 0 #refresh_pattern . 0 20% 4320 #Tuning pour Windows Update range_offset_limit -1 quick_abort_min -1 #les paramtres "refresh" permettent #d'outrepasser la directive no-cache #contenue dans l'entete HTTP : #l'option -i pour insensible a la casse ##Pour Windows, la date de premption s'tend jusqu' un mois refresh_pattern -i microsoft.com/.*\.(cab|exe|ms[i|u|f]|asf|wm[v|a]|dat|zip) 4320 80% 43200 reload-into-ims refresh_pattern -i windowsupdate.com/.*\.(cab|exe|ms[i|u|f]|asf|wm[v|a]|dat|zip) 4320 80% 43200 reload-into-ims refresh_pattern -i my.windowsupdate.website.com/.*\.(cab|exe|ms[i|u|f]|asf|wm[v|a]|dat| zip) 4320 80% 43200 reload-into-ims ##pour chrome, on vrife toutes les semaines refresh_pattern -i ^.*/chrome_installer.exe 2880 80% 10080 reload-into-ims ##pour 7-Zip, toutes les 2 semaines refresh_pattern -i ^.*/7-Zip/.*\.(msi|exe) 2880 80% 20160 reload-into-ims
refresh_pattern refresh_pattern refresh_pattern refresh_pattern refresh_pattern refresh_pattern refresh_pattern refresh_pattern refresh_pattern refresh_pattern refresh_pattern refresh_pattern refresh_pattern
-i -i -i -i -i -i -i -i -i -i -i -i -i
^.*/SetupImgBurn.*\.exe 2880 80% 20160 reload-into-ims ^.*/picasa.*\setup.exe 2880 80% 20160 reload-into-ims ^.*/thunderbird.*\.exe 2880 80% 20160 reload-into-ims ^.*/pdfcreator.*\.exe 2880 80% 20160 reload-into-ims ^.*/audacity-win.*\.exe 2880 80% 20160 reload-into-ims ^.*/vlc.*\.exe 2880 80% 20160 reload-into-ims ^.*/adobe/reader.*\.exe 2880 80% 20160 reload-into-ims ^.*/openoffice/.*\.exe 2880 80% 20160 reload-into-ims ^.*/QuickTimeInstaller.exe 2880 80% 20160 reload-into-ims ^.*/cdbxp.*\.exe 2880 80% 20160 reload-into-ims ^.*/mbam-setup.*\.exe 2880 80% 20160 reload-into-ims ^.*/SUPERAntiSpyware.*\.exe 2880 80% 20160 reload-into-ims ^.*/spybots.*\.exe 2880 80% 20160 reload-into-ims
10
[ -n "$SQUID_MAXFD" ] || return [ -f /proc/sys/fs/file-max ] || return 0 global_file_max=`cat /proc/sys/fs/file-max` minimal_file_max=$(($SQUID_MAXFD + 4096)) if [ "$global_file_max" -lt $minimal_file_max ] then echo $minimal_file_max > /proc/sys/fs/file-max fi ulimit -n $SQUID_MAXFD } start () { cdr=`grepconf2 cache_dir /cache1` ctp=`grepconf cache_dir aufs` case "$cdr" in [0-9]*) log_failure_msg "squid: squid.conf contains 2.2.5 syntax - not starting!" log_end_msg 1 exit 1 ;; esac # # Create spool dirs if they don't exist. # if [ -d "$cdr" -a ! -d "$cdr/00" ] || [ "$ctp" = "aufs" -a ! -w "$cdr" ] then log_warning_msg "Creating squid cache structure" $DAEMON $SQUID_ARGS -z fi if [ "$CHUID" = "" ]; then CHUID=root fi maxfds umask 027 start-stop-daemon --quiet --start \ --pidfile $PIDFILE \ --chuid $CHUID \ --exec $DAEMON -- $SQUID_ARGS < /dev/null return $? } stop () { PID=`cat $PIDFILE 2>/dev/null` start-stop-daemon --stop --quiet --pidfile $PIDFILE --name squid # # Now we have to wait until squid has _really_ stopped. # sleep 2 if test -n "$PID" && kill -0 $PID 2>/dev/null then log_action_begin_msg " Waiting" cnt=0 while kill -0 $PID 2>/dev/null do cnt=`expr $cnt + 1` if [ $cnt -gt 24 ] then log_action_end_msg 1 return 1 fi sleep 5 log_action_cont_msg "" done log_action_end_msg 0 return 0 else return 0 fi } case "$1" in start) log_daemon_msg "Starting Squid HTTP proxy" "squid"
11
if start ; then log_end_msg $? else log_end_msg $? fi ;; stop) log_daemon_msg "Stopping Squid HTTP proxy" "squid" if stop ; then log_end_msg $? else log_end_msg $? fi ;; reload|force-reload) log_action_msg "Reloading Squid configuration files" $DAEMON -k reconfigure log_action_end_msg 0 ;; restart) log_daemon_msg "Restarting Squid HTTP proxy" "squid" stop if start ; then log_end_msg $? else log_end_msg $? fi ;; status) status_of_proc -p "$PIDFILE" "$DAEMON" squid && exit 0 || exit $? ;; *) echo "Usage: /etc/init.d/$NAME {start|stop|reload|force-reload|restart|status}" exit 3 ;; esac exit 0
12
SQUID=/usr/sbin/squid SQUIDCLIENT=/usr/bin/squidclient SYSLOG="daemon.warning" EMAIL="contact@skill-informatique" DELAY=20 TESTURL="" # REDIRECTION quand Squid est OK start_hook() { iptables -F iptables -X iptables -t nat -F iptables -t nat -X iptables -t nat -A PREROUTING -s 192.168.0.254 -p tcp --dport 80 -j ACCEPT iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.0.254:3128 iptables -t nat -A POSTROUTING -j MASQUERADE 2>&1 } # NAT quand Squid est eteint stop_hook() { iptables -F iptables -t nat -F iptables -X iptables -t nat -X iptables -t nat -A POSTROUTING --out-interface eth0 -j MASQUERADE iptables -A FORWARD --in-interface eth1 -j ACCEPT 2>&1 } ########################################################################### ### No need to customize below here (unless you know what you're doing) ### ########################################################################### NAME=squid-watcher PIDFILE="/var/run/$NAME.pid" LCKFILE="/var/run/$NAME.lck" # Signal names to send for various actions. Shouldn't need to change, # unless you really want to reassign the signal handlers SIGSTART="USR1" SIGSTOP="USR2" SIGINFO="HUP" # Set program status. We use this to figure out what state the script
13
# is in. Possible values: # STOPPED - Squid has been properly shut down and is supposed to be off # RUNNING - Squid is running and responding to requests properly # BROKEN - Squid was shut down improperly, or is not servicing requests # Initially, we don't know what state squid is in, so we assume it's # running and try to recover. STATUS="BROKEN" # Function: Log any messages log() { if [ -n "$*" ]; then if [ -n "$SYSLOG" ]; then logger -i -t $NAME -p "$SYSLOG" -- "$*" fi if [ -n "$EMAIL" ]; then echo -e "\n$*\n\n`date`" | mail -s "$NAME on `hostname`" "$EMAIL" fi echo -e $* fi } # Sanity check on binary paths if [ ! -x $SQUID ]; then log "Can't find executable squid at: $SQUID" exit 1 fi if [ ! -x $SQUIDCLIENT ]; then log "Can't find executable squidclient at: $SQUIDCLIENT" exit 1 fi # Function: test status of squid, and return one of the following: # OK - Squid is running an processing requests normally # NO - Squid process is not running / can't be found # EE - Squid is running, but not servicing requests squidstatus() { if $SQUID -k check 2>/dev/null; then if [ -n "$TESTURL" ]; then if $SQUIDCLIENT -s "$TESTURL" 2>/dev/null; then echo "OK" else echo "EE" fi else echo "OK" fi else echo "NO" fi } # Function: get a lock to protect critical sections lock() { # Loop until we get a lock: until (set -o noclobber; echo $$ >"$LCKFILE") 2>/dev/null; do set x `ls -l $LCKFILE` log "$1 waiting for lockfile (other working since $7 $8 $9)..." sleep 5 done } # Function: release a critical section lock unlock() { rm -f "$LCKFILE" } # Function: Set to running state and call any activation hooks activate() { lock "activate" if [ $STATUS != "RUNNING" ]; then # before activating, do one final test to make sure case `squidstatus` in OK) # Fire it up log "Squid is OK; calling start hook. " `start_hook` STATUS="RUNNING" ;; NO) log "Squid process is not running; not activating" STATUS="BROKEN" ;;
14
EE) log "Squid process not responding; not activating" STATUS="BROKEN" ;; *) log "Unknown squid status; not activating" STATUS="BROKEN" ;; esac fi unlock } # Function: Set to stopped state and call any deactivation hooks deactivate() { lock "deactivate" if [ $STATUS = "RUNNING" ]; then log "Deactivating at user's request; calling stop hook. " `stop_hook` fi if [ "$1" = "STOPPED" ]; then STATUS="STOPPED" else STATUS="BROKEN" fi unlock } # Function: Clean up and exit (signal handler for TERM, QUIT, INT, etc) cleanup() { log "$0 shutting down; deactivating" # return to "STOPPED" state deactivate # clean up lockfiles rm -f "$PIDFILE" "$LCKFILE" } # Function: Start a polling daemon to keep an eye on squid polling() { # Create PID file (make sure we're the only daemon running) if (set -o noclobber; echo $$ >"$PIDFILE") 2>/dev/null; then log "Starting polling daemon" else log "Unable to get lock $PIDFILE; is $NAME already running?" sleep 15 exit 1 fi # Initialize signal handlers trap 'log "Signal to start received"; activate' $SIGSTART trap 'log "Signal to stop received"; deactivate "STOPPED"' $SIGSTOP trap 'log "Ignoring $SIGINFO; current running status is: $STATUS"' $SIGINFO # sig 0 covers all exits, both normal and interrupted trap cleanup 0 # poll forever... while true; do # don't bother checking if squid isn't supposed to be running... if [ $STATUS != "STOPPED" ]; then case `squidstatus` in OK) if [ $STATUS = "BROKEN" ]; then log "Squid has recovered; activating..." activate fi ;; NO) if [ $STATUS = "RUNNING" ]; then log "Squid process is no longer running; deactivating..." deactivate "BROKEN" fi ;; EE) if [ $STATUS = "RUNNING" ]; then log "Squid process not responding; deactivating..." deactivate "BROKEN" fi ;; *) if [ $STATUS = "RUNNING" ]; then log "Unknown squid status; deactivating..."
15
deactivate "BROKEN" fi ;; esac fi # nap for a bit before next check sleep $DELAY & # "wait"ing on process allows signal traps to execute immediately, # rather that pausing until the sleep finishes execution wait done } # Function: send signal to running daemon signal() { echo -n "Sending signal to daemon... " if [ -r "$PIDFILE" ]; then kill -"$1" `cat "$PIDFILE"` echo "done" else echo "could not find PID of daemon in $PIDFILE; is it running?" exit 1; fi } # Function: send start signal to running daemon starting() { signal $SIGSTART } # Function: send stop signal to running daemon stopping() { signal $SIGSTOP } # Function: send info signal to running daemon info() { signal $SIGINFO } ############ ### MAIN ### ############ case "$1" in poll) polling ;; start) starting ;; stop) stopping ;; info) info ;; *) echo "Usage: $0 {poll|start|stop|info}" >&2 echo "" >&2 echo " poll starts a daemon that watches squid" >&2 echo "" >&2 echo " start and stop signal the daemon to stop/start immediately," >&2 echo " rather than waiting for the watcher to notice" >&2 echo "" >&2 echo " info sends info signal to daemon (check syslog)" >&2 echo "" >&2 exit 1 ;; esac
16