Journal Wifi + ethernet + configuration réseau automatique sur Debian

Posté par  (site web personnel) .
Étiquettes :
-2
30
déc.
2004
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  (site web personnel) . Évalué à 9.

    Après avoir étudié plusieurs solutions à ce problème (netenv, switchconf, laptop-netenv, j'en passe et des meilleures), j'ai choisi celle présentée ci-dessus car :
    - 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  (site web personnel) . Évalué à 3.

    Tu peux peut-être remplacer les proxy HTTP/SMTP/... par des redirections au niveau IP avec iptables. Ca te fait des processes en moins et pas besoin de configurer toutes tes applications pour utiliser le proxy (bon ça fait pas énormément d'avantages en fait).

    pertinent adj. Approprié : qui se rapporte exactement à ce dont il est question.

    • [^] # Re: remplacer le proxy par une redirection IP ?

      Posté par  (site web personnel) . Évalué à 1.

      À priori, un proxy aussi léger que tinyproxy est équivalent à la redirection de port/adresse avec l'avantage d'une configuration simple qui met à l'abri de gros trous de sécurité qu'on peut avoir quand on ne maitrise pas iptables. Ceci dit, pour quelqu'un qui connait bien iptables, c'est peut-être plus élégant ? Si tu peux poster un exemple de règles iptables qu'il faudrait...

      "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  (site web personnel) . Évalué à 3.

    On peut donc faire un fichier dans /etc/modprobe.d

    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!
  • # mapping de plusieurs interfaces ?

    Posté par  . Évalué à 2.

    J'ai essayé récemment de faire du mapping avec guessnet sur eth0 mais pas sur wlan0.
    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  (site web personnel) . Évalué à 2.

      Exact, une idée comme ça serait de faire un wrapper autour de guessnet qui prenne en compte le nom de l'interface "maîtresse". Je pense qu'elle doit être dans un argument du script ou une variable d'environnement. Ça pourrait faire par exemple :

      #!/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  . Évalué à 2.

      J'arrive un peu après la bataille, mais pour répondre à une de tes questions, tu as la possibilité de préciser à guessnet quels profils il doit tester pour une interface donnée. ex:


      mapping eth0
      script /usr/sbin/guessnet-ifupdown
      map default: default_eth0
      map timeout: 3
      map verbose: true
      map wouam taff

      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
      [...]

      iface default_eth0 inet dhcp

      iface wlan0 [...
      ...]


      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  . Évalué à 1.

    Merci énormément pour ces infos !
    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.