Table des matières
Redirection transparente vers les miroirs locaux
Dans un article précédent nous avons vu comment créer un miroir debian local.
Nous allons maintenant aller plus loin et effectuer une redirection transparente vers ce miroir. Note que dans la suite de cet article quand on utilisera le terme “miroir” il pourra s'agir soit d'un miroir “complet” soit bien d'un miroir partiel (apt-cacher-ng, apt-cacher…), les deux étant fonctionnellement (presque : voir note plus bas :p ) identiques pour ce qui nous intéresse.
L'avantage est donc de n'avoir aucun travail à effectuer sur les postes : ils utilisent toujours les dépots classiques, comme par exemple “ftp.fr.debian.org” mais sont redirigés silencieusement vers le dépôt local, d'où des gains énormes en bande passante et en simplicité.
- gains en bande passante internet : tout le traffic concernant l'installation/mise a jour ne passe plus par le lien internet mais reste local (seule la mise a jour du depot local de référence va utiliser cette bande passante)
- gain en mobilité : les ordinateurs portables n'ont pas besoin de changement de configuration lorsqu'ils sont sur le reseau ou lorsque les collaborateurs l'emportent chez eux
Présentation
Nous allons nous baser sur :
- un proxy web (squid) configuré en mode transparent (peut etre un jour un article la dessus)
- une réécriture d'URL au sein de ce proxy via jesred
- tout ce petit monde sera installé comme à l'accoutumée sur une Debian Stable (
lenny a l'heure actuellewheezy pour la mise a jour de cet article)
Installation
Cette etape est simple : il suffit d'installer jesred , le module qui nous servira a réécrire les URL au niveau du proxy squid.
apt-get install jesred
Configuration
configuration de squid
Pour activer la réécriture d'URL il faut ajouter des directives dans le fichier de conf de squid ( /etc/squid/squid.conf) :
cat << EOF >> /etc/squid3/squid.conf # redirection transparente pour apt-cacher debian et ubuntu redirect_program /usr/lib/squid/jesred EOF
configuration de jesred
- On active les logs de reecriture d'URL pour débugguer plus facilement :
sed -i -e "s,# rewrite_log =,rewrite_log =," /etc/jesred.conf
- Si vous êtes sous debian wheezy avec squid3 au lieu de squid, adapter les chemins de log :
sed -i -e "s,/var/log/squid/,/var/log/squid3/," /etc/jesred.conf
- On ajoute son sous réseau IP dans les ACL de réécriture (adapter a votre réseau : format X.Y.Z.T/masque classique) :
echo "192.168.0.0/24" >> /etc/jesred.acl
Regles de réécriture
On peut maintenant écrire les règles de réécritures désirées (sous forme de regexp), cela se passe dans le fichier /etc/jesred/jesred.rules.
- Par exemple si comme moi vous avez un miroir local debian partiel :
# redirection transparente sur le miroir local # pour ne PAS rediriger les sources en local (nos miroirs n'ont pas les sources) regex ^http://ftp\.[a-z][a-z].debian.org/debian/(dists|pool)/.*/source/(Release|Sources|Sources\.(bz2|gz|diff/.*))$ regex ^http://ftp\.[a-z][a-z].debian.org/debian/dists/.*/installer-.*/.*$ # le reste est en local regex ^http://ftp\.[a-z][a-z].debian.org/debian/((dists|pool)/.*(udeb|deb|bz2|Packages|Packages.gz|Release|Release.gpg))$ http://debian-mirror.mondomaine.com/debian/\1
Si vous avez de l'espace disque et que vous avez un miroir complet (incluant les sources), il suffit de retirer les deux premières regexp qui empêchent la réécriture des adresses des paquets source : tout sera alors redirigé vers le miroir local.
- Le meme principe peu bien sûr etre utilisé pour ldes dépots de securité, archive, backports, … comme le montrent les exemples suivants :
# on ne redirige pas les sources en local regex ^http://security.debian.org/(dists|pool)/.*/source/(Release|Sources|Sources\.(bz2|gz|diff/.*))$ # mais le reste si regex ^http://(security.debian.org/((dists|pool)/.*(deb|bz2|gz|Packages|Packages.gz|Release|Release.gpg|)))$ http://debian-mirror.mondomaine.com/debian-security/\1 # idem pour les backports regex ^http://www.backports.org/debian/(dists|pool)/.*/source/(Release|Sources|Sources\.(bz2|gz|diff/.*))$ regex ^http://www.backports.org/debian/((dists|pool)/.*(deb|bz2|Contents-.*gz|Packages|Packages.gz|Release|Release.gpg))$ http://debian-mirror.mondomaine.com/debian-backports/\1
- Le même principe fonctionnerait bien sûr sur un dépot ubuntu en adaptant les URLs, cependant je n'utilise pas un dépot ubuntu complet (moins de postes, et donc moins de besoinse en terme d'installations/MAJs, …) mais un dépot “partiel” utilisant apt-cacher , voici les lignes utilisées pour rediriger toute demande vers l'apt-cacher local (dont l'IP doit bien sur aussi être exclue des ACL de réécriture) pour les principaux dépots utilisés :
# depots Ubuntu - redirection vers l'apt-cacher ubuntu regex ^http://([a-z][a-z]\.archive.ubuntu.com/ubuntu/(dists|pool)/.*(deb|bz2|gz|Release|Release.gpg))$ http://ubuntu-mirror.mondomaine.com:3142/\1 regex ^http://(security.ubuntu.com/ubuntu/(dists|pool)/.*(deb|bz2|gz|Release|Release.gpg))$ http://ubuntu-mirror.mondomaine.com:3142/\1 regex ^http://((.*)packages.medibuntu.org/(dists|pool)/.*(deb|bz2|gz|Release|Release.gpg))$ http://ubuntu-mirror.mondomaine.com:3142/\1 regex ^http://(ppa.launchpad.net/.*/(dists|pool)/.*(deb|bz2|gz|Release|Release.gpg))$ http://ubuntu-mirror.mondomaine.com:3142/\1 regex ^http://(old-releases.ubuntu.com/ubuntu/(dists|pool)/.*(deb|bz2|gz|Release|Release.gpg))$ http://ubuntu-mirror.mondomaine.com:3142/\1 regex ^http://(archive.canonical.com/(dists|pool)/.*(deb|bz2|gz|Release|Release.gpg))$ http://ubuntu-mirror.mondomaine.com:3142/\1
c'est le logiciel apt-cacher qui se charge de distribuer le paquet directement s'il l'a en cache ou qui le récupère avant de le distribuer s'il ne l'a pas en cache. Un jour peut être, un article sur l'installation de ce logiciel apt-cacher .
- contrib : il semblerait que pour pouvoir continuer à utiliser l'upgrade-manager Ubuntu il faille les lignes suivantes dans le fichier jesred.rules :
# I have also added two aborts in order to use upgrade-manager: abort .gpg abort ReleaseAnnouncement abort Index
- http://debian-mirror.mondomaine.com/debian/ pour la copie du miroir classique
- http://debian-mirror.mondomaine.com/debian-backports/ pour la copie du miroir de backports
- http://debian-mirror.mondomaine.com/debian-security/ pour la copie du miroir debian-security
- …
en conséquence en ce qui concerne la redirection pour un fichier disons http://ftp.fr.debian.org/debian/dists/wheezy/Release il faut que la redirection s'effectue sur :
- dans le cas d'un miroir local : http://debian-mirror.mondomaine.com/debian/dists/wheezy/Release
- dans le cas d'un apt-cacher-ng : http://debian-mirror.mondomaine.com:3142/ftp.fr.debian.org/debian/dists/wheezy/Release
d'ou les différences de parenthésage dans les règles pour faire le match sur l'url complete/partielle et le port : les miroirs partiels ont besoin d'une url complète
Vérification du fonctionnement
Pour prendre en compte ces modifications il faut bien sur faire recharger a squid sa configuration :
/etc/init.d/squid3 reload
Le bon fonctionnement peut etre vérifié en regardant dans le fichier de log /var/log/squid3/jesred-rewrite.log lorsque vous tentez d'installer un paquet, comme par exemple :
1282816088.239 192.168.0.65/- http://ftp.fr.debian.org/debian/pool/main/j/jesred/jesred_1.2pl1-16_amd64.deb http://debian-mirror.mondomaine.com/debian/pool/main/j/jesred/jesred_1.2pl1-16_amd64.deb 9 1282816088.254 192.168.0.65/- http://security.debian.org/pool/updates/main/s/squid/squid-common_2.7.STABLE3-4.1lenny1_all.deb http://debian-mirror.mondomaine.com/debian-security/pool/updates/main/s/squid/squid-common_2.7.STABLE3-4.1lenny1_all.deb 11
Aller un peu plus loin : IPv6
En installant la version “1.2pl1-19” de jesred disponible sur la debian testing/unstable à l'heure ou j'écris ces lignes : https://packages.debian.org/search?keywords=jesred il est maintenant possible de réécrire les URLs pour des clients utilisant de l'IPv6 (pas en proxy transparent cependant ) : voici à quoi ressemble un fichier /etc/jesred.acl comportant des IPv4 et des IPv6 :
192.168.0.0/24 192.168.1.0/24 192.168.2.0/24 # merci le backport de la version wheezy 1.2pl1-19 pour le support d'ipv6 =) 2a01:e32:833f:e2a:2::/112 2a01:e32:833f:e2a:3::/112 2a01:e32:833f:e2a:4::/112