[technique] Config' réseau d'un ordinateur itinérant

[ Thread Index | Date Index | More alpinux.org/technique Archives ]


Salut,

Un long mail technique, mais qui peut intéresser du monde (ça
intéressait déjà Stéphan, donc pourquoi pas d'autres). L'idée d'origine
provient des Linux Magazines 149 et 152, articles "P... de proxy",
étendue à ma sauce : les articles d'origine ne gèrent qu'un proxy et
j'ai besoin d'un peu plus.

Depuis la rentrée, je promène mon ordinateur portable entre plusieurs
réseaux ayant tous leurs subtiles différences :

* chez moi, je suis en wifi avec DHCP, et mon imprimante par défaut est
partagée par le CUPS de l'ordinateur fixe ;

* au boulot, je suis en Ethernet avec DHCP, et l'imprimante par défaut
est une imprimante configurée manuellement sur le serveur CUPS de ma
machine. Par ailleurs, l'accès au web se fait au travers d'un proxy
obligatoire (le port 80 est bloqué).

Et j'aimerais bien évidemment juste déplier l'écran, et que tout marche
seul à chaque fois, c'est-à-dire :
* que mon portable trouve son IP (facile et déjà fait),
* que le réglage du proxy soit mis à jour si nécessaire pour toutes les
applications qui tournent,
* et que l'imprimante par défaut du système soit modifiée selon l'endroit.


Commençons par le proxy. Sous Debian, la plupart des applications
utilisent la variable d'environnement "http_proxy" pour savoir s'il faut
passer par un proxy. Quand elle est vide, on part sur une connexion
directe. Et sinon, il faut lui donner une valeur du type
"http://bouh.le.proxy:3128/"; où "bouh.le.proxy" est son nom ou son IP,
et 3128 est son port.

Il y a sur le même principe la variable https_proxy.

Pour définir une variable d'environnement pour tout le monde, Debian
propose le fichier /etc/environment. Cependant, je ne peux pas y mettre
mon proxy du boulot car les variables d'environnement s'héritent entre
processus pères et fils, et je ne pourrais pas la changer à chaud, il
faudrait redémarrer.

À la place, j'installe donc un petit proxy sur ma propre machine :

# apt-get install tinyproxy

et je mets dans /etc/environment :

http_proxy=http://127.0.0.1:8888/


Les utilisateurs de lightdm doivent ajouter si nécessaire la ligne
suivante dans /etc/pam.d/lightdm :

session      required pam_env.so readenv=1

car sans cela, lightdm ne charge pas /etc/environment au login.



Je règle ensuite tinyproxy avec le fichier /etc/tinyproxy.conf : je lui
dis d'utiliser pour lui-même le port 8888 (conformément à ce qui est
ci-dessus), et je peux lui indiquer un proxy parent en ajoutant la ligne :

Upstream http://bouh.le.proxy:3128/

À chaque changement de lieu, il suffit donc de changer cette ligne
"Upstream" (quitte à la retirer pour la maison), et de faire :

service tinyproxy reload

Je vais prévoir le coup, et je vais créer en fait deux fichiers :
* /etc/tinyproxy.conf.boulot avec "bouh.le.proxy" ;
* /etc/tinyproxy.conf.maison sans proxy upstream.

/etc/tinyproxy.conf sera un lien symbolique vers l'un ou l'autre, et je
vous dirai comment je mets à jour ce lien plus tard. Pour l'instant, je
supprime /etc/tinyproxy.conf et je garde les deux autres avatars.


Parallèlement à cela, je veux aussi régler l'imprimante par défaut du
système. Cela se fait via le fichier /etc/cups/lpoptions, qui contient
une ligne

Default BRAVE_IMPRIMANTE

Sur le même principe que pour tinyproxy, je crée en fait deux fichiers :
* /etc/cups/lpoptions.boulot qui déclare l'imprimante du boulot par défaut,
* /etc/cups/lpoptions.maison qui déclare l'imprimante de la maison par
défaut.

Je supprime /etc/cups/lpoptions car je le remplacerai plus tard par un
lien symbolique.


Maintenant vient la gestion des liens symboliques, et Debian possède un
outil magique pour cela : update-alternatives.

Ce programme permet de déclarer qu'un fichier (par exemple
/etc/tinyproxy.conf) possède plusieurs versions alternatives, et il
permet de passer facilement de l'une à l'autre. La magie vient du fait
qu'il connait une notion d'alternative principale avec esclaves. Pour
comprendre, l'exemple est le plus parlant.


Je crée un répertoire /etc/promenade. Dedans, je crée deux fichiers :
* /etc/promenade/boulot dans lequel j'écris "Boulot" tout seul,
* /etc/promenade/maison dans lequel j'écris "Chez moi".

Je vais faire gérer un lien /etc/promenade/ici qui m'indiquera où je
suis. Je déclare ce lien à update-alternatives en lui disant que "ici"
peut être soit "boulot" soit "maison".

# update-alternatives --install /etc/promenade/ici promenade
/etc/promenade/boulot 10
# update-alternatives --install /etc/promenade/ici promenade
/etc/promenade/maison 10

Désormais, update-alternatives gère le lien /etc/promenade/ici. Quand
j'arrive chez moi, je fais :
# update-alternatives --set promenade /etc/promenade/maison

Quand j'arrive au boulot, je fais :
# update-alternatives --set promenade /etc/promenade/boulot

Et c'est là que les alternatives esclaves entrent en jeu. Je peux dire à
update-alternatives de mettre tout seul à jour d'autres liens quand je
change /etc/promenade/ici.

Ainsi, je vais déclarer que quand je suis au boulot, il faut également
mettre à jour tinyproxy et lpoptions (accrochez-vous, la ligne est longue) :

# update-alternatives \
  --install /etc/promenade/ici promenade /etc/promenade/boulot 10 \
  --slave /etc/tinyproxy.conf tinyproxy.conf /etc/tinyproxy.conf.boulot \
  --slave /etc/cups/lpoptions lpoptions /etc/cups/lpoptions.boulot

Je déclare la même pour la maison :

# update-alternatives \
  --install /etc/promenade/ici promenade /etc/promenade/maison 10 \
  --slave /etc/tinyproxy.conf tinyproxy.conf /etc/tinyproxy.conf.maison \
  --slave /etc/cups/lpoptions lpoptions /etc/cups/lpoptions.maison

Ces deux commandes ne sont à taper qu'une seule fois, elles servent
juste à déclarer les relations entre les différents liens.

Et désormais, quand je tape :

# update-alternatives --set promenade /etc/promenade/maison

cela me met à jour simultanément /etc/tinyproxy.conf et /etc/cups/lpoptions

J'emballe cela dans un script /usr/local/bin/promenade :

#!/bin/bash
update-alternatives --set promenade /etc/promenade/$1
service tinyproxy reload

(Il ne faut pas oublier de dire à tinyproxy de recharger son fichier de
configuration, d'où la dernière ligne.)

ainsi quand j'arrive chez moi je lance :
# sudo promenade maison
et au boulot :
# sudo promenade boulot

Et voilà !

Iceweasel (Firefox) connaissant la variable http_proxy, le changement de
configuration réseau avec/sans proxy devient transparent pour lui. Il en
va de même pour apt-get sans effort supplémentaire.

On peut déclarer autant d'alternatives esclaves que l'on veut, donc
cette astuce marche pour régler d'autres fichiers de configuration. (Je
m'en sers également pour ajuster le détecteur d'imprimantes partagées
cups-browsed, car au boulot c'est le boxon et les imprimantes des autres
ne m'intéressent pas donc je désactive.)


Bon, en fait je suis même en train de câbler ce script dans la gestion
du réseau pour qu'il soit appelé tout seul. Mais cela fait déjà beaucoup
de choses pour un seul mail, alors la suite pour une prochaine fois.

Les points à améliorer :
* régler un serveur SMTP local sur ma machine qui détecte tout seul quel
relai utiliser, et qui met en file d'attente en cas d'absence de connexion ;
* appeler le script précédent automatiquement quand on obtient une
nouvelle IP.
-- 
Florian Hatat



Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/