Après quelques mois de labeurs, j'ai réussi à faire de la configuration automatique de réseau sur un portable avec deux cartes réseaux (wifi + ethernet) et deux réseaux différents (disons wouam, chez moi et taff, au taff).
À défaut de faire un HOWTO complet, voilà quelques éléments qui vous permettront de faire pareil, ou mieux.
Couche matérielle :
---------------------
Pour la configuration matérielle j'utilise hotplug + discover. Le fait qu'une carte soit interne ou externe (USB, PC-CARD, etc.) ne change donc rien : les pilotes sont montés quand la carte est détectée.
-> Problème rencontré : le nommage des interfaces (ethX, wlanX, raX, etc.)
Certains pilotes nomment par défaut les interfaces réseau ethX, d'autres wlanX d'autres raX. Je voulais avoir des noms significatifs, càd :
ethX pour les ethernet
wlanX pour le wifi
Pour cela, 2 solutions :
1/ Utiliser ifrename : le fichier /etc/iftab contient une liste de cartes identifiées par leur adresse MAC et un nom associé, par exemple :
# /etc/iftab
# WiFi PC-Card
wlan* mac 00:0D:88:*
wlan* mac 00:0F:EA:*
# /etc/iftab
Comme vous le voyez, on peut utiliser des '*'. Ici, ces adresses MAC correspondent à des cartes DLINK 650+ et Gigabyte GN-WMKG, càd que n'importe quelle carte de ce modèle aura un nom wlan0, wlan1 etc.
Je ne me souviens plus très bien, mais je crois que ifrename est appelé par hotplug quand il détecte une interface réseau (voir /usr/share/doc/ifrename/HOTPLUG.txt.gz et /etc/hotplug/net.agent).
2/ L'autre solution, peut-être un peu plus fiable, est d'associer un nom d'interface à un pilote. Tous les pilotes de carte réseau (à vérifier) ont une option ifname. On peut donc faire un fichier dans /etc/modprobe.d qui ressemble à ça :
# /etc/modprobe.d/ifname
options rt2500 ifname=wlan%d
options acx_pci ifname=wlan%d
options e100 ifname=eth%d
# /etc/modprobe.d/ifname
Le '%d' sera remplacé par un numéro incrémenté automatiquement, à moins que l'on préfère mettre des numéros fixes...
Couche liaison :
-------------------
Pour l'ethernet, il faut acheter un câble ou s'en faire un ;)
Pour le wifi, avant de donner une adresse IP ou quoi que ce soit à l'interface, il faut qu'elle soit associée à un Access Point ou configurée en mode Ad-Hoc au choix. Tout cela peut être fait automatiquement par waproamd.
Avec Debian, quand on installe waproamd (ou configure dpkg-reconfigure), il faut indiquer de prendre en charge toutes les interfaces détectées par hotplug, càd :
# /etc/default/waproamd
INTERFACES=""
HOTPLUG_INTERFACES="all"
ARGS="-t 5"
# /etc/default/waproamd
Ensuite, waproamd scanne régulièrement (ici, le '-t 5' veut dire toutes les 5 sec) pour voir si il y a un AP qu'il connait dans le coin.
Q : Quels sont les AP qu'il connait ?
R : Dans le répertoire /etc/waproamd/keys, il faut faire un fichier par AP qui contient la clé WEP ou AES de l'AP correspondant. Le fichier doit être nommé de l'adresse MAC de l'AP suffixé par '.wep' ou '.aes', càd :
/etc/waproamd/keys/12:34:56:78:90:12.wep contient
12345678901234567890123456
Pour les détails, RTFM et également :
/etc/waproamd/scripts/default
Restrictions : pour que la configuration de la carte wifi se fasse automatiquement , il faut que l'AP diffuse l'ESSID du réseau. Sinon, on peut également rajouter soit-même un script dans /etc/waproamd/scripts nommé après l'adresse MAC de l'AP qui spécifie l'ESSID 'à la mano'.
Couche réseau :
--------------------
Pour configurer l'adresse réseau, la passerelle, etc. quand les interfaces sont détectées, il suffit de rajouter dans /etc/network/interfaces :
# /etc/network/interfaces
..
mapping hotplug
script echo
...
# /etc/network/interfaces
... mais il y a plus intelligent. En effet, sur la carte ethernet, le câble n'est pas forcément branché et pour le wifi, on n'est pas forcément à la portée de l'AP en permanence.
C'est ici qu'intervient ifplugd. ifplugd détecte :
- pour une carte ethernet : qu'un câble est (dé)branché
- pour une carte wifi : que la carte est associée ou pas avec un AP.
Comme pour waproamd, il faut dire à ifplugd d'attendre que hotplug le notifie pour surveiller l'interface détectée :
# /etc/default/ifplugd
INTERFACES=""
HOTPLUG_INTERFACES="all"
ARGS="-q -f -u0 -d5 -w -I"
SUSPEND_ACTION="stop"
# /etc/default/ifplugd
Tout ceci est configuré sur la debian à l'installation du paquet et peut être reconfiguré avec dpkg-reconfigure ifplugd.
Une instance de ifplugd est donc lancée pour l'interface détectée par hotplug. ifplugd lance alors un ifup (ifdown) sur l'interface quand le câble est branché (débranché) ou quand la carte wifi est associée (désassociée) d'un AP.
ATTENTION :
1/ Si on n'utilise ifplugd, il ne faut pas mettre les lignes magiques 'mapping hotplug etc.' /etc/network/interfaces, sinon, c'est hotplug qui fera le ifup/ifdown.
2/ Toujours dans /etc/network/interfaces, on ne doit pas avoir de ligne 'auto xxx' pour les interfaces configurées par ifplugd. Typiquement, la seule ligne 'auto' est 'auto lo'.
Configuration pour plusieurs réseaux :
-----------------------------------------------
ifplugd a fait un ifup comme on lui avait demandé mais j'aimerais détecter sur quel réseau je me trouve parce que, une fois je me configure en dhcp, et l'autre avec adresse statique. Comment faire ? Là encore, la solution existe...
# /etc/network/interfaces
...
mapping eth0
script /usr/sbin/guessnet-ifupdown
map default: default_eth0
map timeout: 3
map verbose: true
iface wouam inet dhcp
test-peer address 192.168.65.254 mac 12:34:56:78:90:12
dns-search wouam
dns-nameservers 192.168.65.254
iface taff inet static
test-peer address 192.168.1.254 mac 56:45:78:62:15:23
dns-search taff
dns-nameservers 192.168.1.254
address 192.168.1.15
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.1.255
gateway 192.168.1.254
iface default_eth0 inet dhcp
...
# /etc/network/interfaces
Le paquet à installer est guessnet.
Voilà la signification des lignes du fichier :
- mapping eth0 : la commande ifup eth0 va essayer de détecter quelle interface logique (ici wouam ou taff ou default_eth0) utiliser.
- script /usr/sbin/guessnet-ifupdown : on utilise le script indiqué
- map default: default_eth0 : si aucune interface logique est trouvée, c'est celle-là qui sera montée.
- map timeout: 3 : si le script ne répond pas au bout de 3 sec, l'interface par défaut est montée.
- test-peer address 192.168.65.254 mac 12:34:56:78:90:12 : l'interface logique est montée si une machine avec cette addresse MAC et cette addresse IP est trouvée sur le réseau.
... je continue à expliquer le reste ? (RTFM : man interfaces, man guessnet)
Couches applicatives :
----------------------------
1/ DNS : le DNS est configuré normalement dans le ficheir /etc/resolv.conf et une fois pour toutes, ce qui n'est pas représentatif de la réalité où chaque réseau a son DNS en général.
Dans /etc/network/interfaces, ce sont les lignes dns-search et dns-nameservers qu'il faut donc rajouter pour chaque interface et le logiciel à installer est resolvconf. Autrement, aucune configuration spéciale à signaler si ce n'est que certains logiciels qui ne sont pas 'resolvconf-aware' écrasent le fichier /etc/resolvconf. Tout ceci est bien documenté dans /usr/share/doc/resolvconf README.gz.
2/ HTTP, FTP : là ça devient un peu complexe. Pour moi, le problème est que je dois passer par un proxy au taff et pas chez moi. La solution que j'ai trouvée est d'installer un proxy très léger (tinyproxy) en local qui ne fait que de la redirection (vers le vrai proxy au taff et vers rien chez moi).
Pour changer de conf, j'ai trouvé la solution suivante :
- J'écris plusieurs fichiers de conf, un par réseau : /etc/tinyproxy/tinyproxy.conf.wouam,
/etc/tinyproxy/tinyproxy.conf.taff,
/etc/tinyproxy/tinyproxy.conf.default
Le suffixe est le nom du réseau spécifié dans /etc/network/interfaces par la ligne dns-search.
- ifupdown permet de lancer des scripts automatiquement lors de la configuration/déconfiguration d'une interface avec l'instruction 'up /nom/du/script' ou 'down /nom/du/script' ou bien, pour toutes les interfaces, si on le place dans les répertoires /etc/network/if-*.d. Attention, dans ce dernier cas, les scripts sont exécutés même pour l'interface loopback (lo).
- Quand ces scripts sont exécutés, ils disposent de variables d'environnement exportées par ifupdown. J'utilise donc la variable $IF_DNS_SEARCH et le script est le suivant :
# /etc/network/if-up.d/update-proxy
#!/bin/sh
DAEMON=tinyproxy
CONFFILE=/etc/tinyproxy/tinyproxy.conf
. /lib/lsb/init-functions
set_config () {
config=$1
if [ -r $CONFFILE.$config ] ; then
ln -fs $CONFFILE.$config $CONFFILE
else
ln -fs $CONFFILE.default $CONFFILE
fi
}
check_default () {
if [ ! -r $CONFFILE.default ] ; then
log_failure_msg "No default configuration found"
exit 1
fi
}
check_default
case "$MODE" in
start)
log_begin_msg "Reconfiguring " $DAEMON
set_config $IF_DNS_SEARCH
;;
stop)
log_begin_msg "Reverting to default for " $DAEMON
set_config default
;;
*)
log_begin_msg "Reverting to default for " $DAEMON
set_config default
;;
esac
/etc/init.d/$DAEMON restart
log_end_msg $?
# /etc/network/if-up.d/update-proxy
Toutes les applications utilisent donc comme proxy le proxy local qui est reconfiguré à la volée avec les interfaces réseau.
- MAIL : avec le même principe que pour le proxy, j'ai installé un postfix en local qui fait juste de la redirection. À priori, l'idée est de prendre un MTA le plus léger possible puisqu'il ne fera que de la redirection. Est-ce que postfix est le meilleur, je n'en sais rien...
- impression : le fichier /etc/cups/client.conf a subi la même punition que ses confrères.
Et ppp avec mon modem ? :
-----------------------------------
Pour se connecter à internet avec mon modem de manière 'user-friendly', 'clickdrome', voire 'playskool' (rayez la mention inutile), j'utilise kppp qui, même s'il n'est pas aux couleurs de mon bureau gnome, est compatible avec ifupdown, resolvconf et tout ce beau monde, contrairement à gnome-ppp...
# Post-Scriptum
Posté par Jean Parpaillon (site web personnel) . Évalué à 9.
- les logiciels utilisés s'occupent de tâches bien précises (small is beautiful)
- ils sont tous compatibles entre eux et surtout avec ifupdown qui est, je crois, un standard et qu'il est donc utile de erspecter. C'est-à-dire que waproamd ne s'occupe pas de configurer l'adresse IP, ifplugd s'occupe juste de configurer la couche réseau quand la couche liaison fonctionne, etc. etc.
"Liberté, Sécurité et Responsabilité sont les trois pointes d'un impossible triangle" Isabelle Autissier
# remplacer le proxy par une redirection IP ?
Posté par Krunch (site web personnel) . Évalué à 3.
pertinent adj. Approprié : qui se rapporte exactement à ce dont il est question.
[^] # Re: remplacer le proxy par une redirection IP ?
Posté par Jean Parpaillon (site web personnel) . Évalué à 1.
"Liberté, Sécurité et Responsabilité sont les trois pointes d'un impossible triangle" Isabelle Autissier
# Remarque sur les options des modules dans Deb
Posté par niol (site web personnel) . Évalué à 3.
Pour être cohérant avec Debian, les options des modules vont dans /etc/modutils/ et pas dans /etc/modprobe.d/ . Après il suffit de faire un update-modules. Enfin, d'après ce que j'ai compris...
A part çà, merci beaucoup!
[^] # Re: Remarque sur les options des modules dans Deb
Posté par Alexandre Belloni (site web personnel) . Évalué à 1.
après un update-modules, la ligne se retrouve bien dans modules.conf
mais quand je fais un modprobe, il laisse le nom a eth=%d
Si quelqu'un sait pourquoi ....
[^] # Re: Remarque sur les options des modules dans Deb
Posté par Jean Parpaillon (site web personnel) . Évalué à 1.
http://linux.derkeiler.com/Mailing-Lists/Debian/2004-02/3589.html(...)
En gros :
- pour un 2.4 : modutils
- pour un 2.6 : modprobe.d
C'est peut-être à cause de ça...
"Liberté, Sécurité et Responsabilité sont les trois pointes d'un impossible triangle" Isabelle Autissier
# mapping de plusieurs interfaces ?
Posté par symoon . Évalué à 2.
Comment distinguer les deux sections, puis dans chaque "sous-configuration", aucune référence à l'interface "maîtresse" n'est indiquée ?
un iface wlan0 inet static et tous les détails risque d'être pris comme un profil spécifique à eth0 :/
Alors une solution serait d'indiquer la conf de wlan0 avant celle de eth0, mais c'est contourner le problème :)
Autre petite question : sans avoir à passer par iptables, est-il possible à travers le fichier /etc/hosts d'avoir un comportement du type d'un champ CNAME dans un dns.
Cas d'application : rediriger une requete 'smtp' vers smtp.wanadoo.fr sans avoir à spécifier une IP précise (si un serveur est down, on l'a dans l'os), ou un autre smtp suivant le réseau détecté.
[^] # Re: mapping de plusieurs interfaces ?
Posté par Jean Parpaillon (site web personnel) . Évalué à 2.
#!/bin/sh
# Mon wrapper guessnet
REAL_IF=$un_argument_ou_une_variabler_d_environnement
echo $REAL_IF_`guessnet $@`
# Fin
Ça préfixe le nom de l'interface logique trouvée par guessnet par le nom de l'interface réelle... Ainsi, tu peux faire des interfaces logiques :
eth0_truc
eth0_chose
wlan0_truc
wlan0_chose
"Liberté, Sécurité et Responsabilité sont les trois pointes d'un impossible triangle" Isabelle Autissier
[^] # Re: mapping de plusieurs interfaces ?
Posté par Bastien Mourgues . Évalué à 2.
avec la ligne ajoutée (en gras), dans le cas de eth0, seuls les profils wouam taff et default_eth0 seront essayés.
# Merci !
Posté par Sébastien Munch . Évalué à 1.
C'est le genre de choses que je voulais faire depuis des lustres, et je n'ai jamais trouvé la solution "idéale". Je testerai tout ça :)
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.