Looking for Computer Science  & Information Technology online courses ?
Check my new web site: https://www.yesik.it !

Ça y est: vous avez installé OpenWrt sur une machine! Avant d'aller plus loin et de vous atteler à la configuration spécifique que vous voulez pour celle-ci, il y a tout d'abord quelques pas à faire systématiquement. Rien de long ou de compliqué. Mais je préfère les résumer ici afin de ne rien oublier et de partir du bon pied. J'en profiterai au passage pour introduire uci et opkg qui sont les commandes de base pour l'administration et la personnalisation d'un système OpenWrt.

Point de départ

Pour cet article, je reprends les choses juste après l'installation (le flashage) d'OpenWrt. Quelque soit la manière employée, vous vous retrouvez donc avec une cible qui va booter pour la première fois sous OpenWrt.

Par défaut, sous Backfire, un certain nombre de services sont disponibles dès ce premier boot. Et il est possible d'utiliser plusieurs moyens pour ouvrir une session sur votre cible et interagir avec. Ainsi, si vous avez accès à la console série de votre cible, vous pouvez utiliser un émulateur de terminal comme screen. J'ai déjà expliqué cette technique ailleurs. Souvenez vous juste que par défaut sous OpenWrt, pour ouvrir un shell root à partir de la console il suffit de presser entrée – sans login ni mot de passe.

Mais laissons la console série de côté: en effet, je vais plutôt considérer le cas d'une cible dotée d'un port Ethernet. Normalement OpenWrt a dû le détecter et l'activer. Reliez donc votre ordinateur à votre cible par une liaison Ethernet. L'adresse IPv4 par défaut de la cible est 192.168.1.1. Si votre cible est dotée de plusieurs ports Ethernet (cas d'un routeur, par exemple) c'est le port LAN qui possède cette adresse. Le port WAN étant configuré pour obtenir une adresse par DHCP. Un ping(8) vous permettra de vous assurer que vous êtes connecté au bon port:

# Vérifier la connectivité entre l'ordinateur et la cible
sh$  ping -c 3 192.168.1.1
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_req=1 ttl=64 time=0.320 ms
64 bytes from 192.168.1.1: icmp_req=2 ttl=64 time=0.305 ms
64 bytes from 192.168.1.1: icmp_req=3 ttl=64 time=0.322 ms

--- 192.168.1.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1998ms
rtt min/avg/max/mdev = 0.305/0.315/0.322/0.021 ms

Liste des services initiaux

Dès que la cible répond, nous pouvons pousser un peu plus nos investigations en utilisant nmap pour découvrir les ports ouverts:

sh$ nmap 192.168.1.1
Interesting ports on 192.168.1.1:
Not shown: 996 closed ports
PORT   STATE SERVICE
22/tcp open  ssh
23/tcp open  telnet
53/tcp open  domain
80/tcp open  http

Voilà qui est intéressant: en standard, sur une installation neuve d'OpenWrt, l'administration est possible par ssh, telnet et http (interface Web LuCI). On peut aussi voir qu'un serveur DNS est à l'écoute sur cette interface (port 53).

Accès par telnet

Attention:

À ce stade, l'accès administrateur à votre cible OpenWrt est ouvert à tous! N'importe qui pouvant y accéder par le réseau peut vous prendre de vitesse pour s'y connecter. Par ailleurs, puisque nous allons utiliser telnet pour changer le mot de passe, et que le trafic telnet passe en clair, il y a aussi un risque d'interception du mot de passe administrateur...

Pour ces deux raisons, je vous conseille de relier directement la cible à votre ordinateur – sans passer par le réseau local. Ce n'est qu'une fois l'accès SSH opérationnel et l'adresse réseau définitive assignée à votre cible que vous pourrez la mettre sur le réseau.

À ce stade, on ne peut pas accéder à OpenWrt par ssh car le serveur est configuré pour refuser les connexions sans mot de passe. Or, pour l'instant root n'a toujours pas de mot de passe sur la cible. Par conséquent, la connexion initiale ne peut donc se faire que par telnet (ou la console série):

sh$ telnet 192.168.1.1
Trying 192.168.1.1...
Connected to 192.168.1.1.
Escape character is '^]'.
=== IMPORTANT ============================
Use 'passwd' to set your login password
this will disable telnet and enable SSH
------------------------------------------


BusyBox v1.15.3 (2011-07-07 02:30:22 CEST) built-in shell (ash)
Enter 'help' for a list of built-in commands.

  _______                     ________        __
 |       |.-----.-----.-----.|  |  |  |.----.|  |_
 |   -   ||  _  |  -__|     ||  |  |  ||   _||   _|
 |_______||   __|_____|__|__||________||__|  |____|
          |__| W I R E L E S S   F R E E D O M
 Backfire (10.03.1-RC5, r27608) --------------------------
  * 1/3 shot Kahlua    In a shot glass, layer Kahlua 
  * 1/3 shot Bailey's  on the bottom, then Bailey's, 
  * 1/3 shot Vodka     then Vodka.
 ---------------------------------------------------
root@OpenWrt:/# 

Un message d'avertissement vous le rappelle: il est important de donner un mot de passe pour l'administrateur de votre machine sous OpenWrt. Si vous avez ne serait-ce qu'un peu utilisé un autre système Unix-like vous connaissez la commande passwd qui permet de changer de mot de passe. C'est tout ce que nous ferons avec cette session telnet:

root@OpenWrt:/# passwd
Changing password for root
New password: *********
Retype password: *********
Password for root changed by root
root@OpenWrt:/# exit
Connection closed by foreign host.

Remarque:

Comme indiqué également dans le message à l'ouverture de la session telnet, une fois le mot de passe root défini, il ne sera plus possible de se connecter à la cible par telnet.

En réalité, le serveur telnet tournera toujours sur la cible sous OpenWrt jusqu'au prochain reboot, mais il fermera instantanément les connexions.

Accès par ssh

Dès que le mot de passe root est défini, il devient possible d'utiliser SSH (Secure Shell) pour se connecter à la cible OpenWrt. La console série reste opérationnelle, mais plus l'accès par telnet. Désormais, ce sera uniquement par ssh que j'accèderai à ma cible. Comme toujours, lors de la première connexion, le client ssh vous demandera de valider l'identité de la machine à laquelle vous vous connectez. Pour éviter tout risque d'attaque man-in-the-middle, cette première connexion par ssh se fera donc de préférence avec une liaison directe entre la cible et votre ordinateur:

sh$ ssh root@192.168.1.1
The authenticity of host '192.168.1.1 (192.168.1.1)' can't be established.
RSA key fingerprint is 6a:cb:5c:56:77:60:1d:41:ba:0a:25:ce:2f:11:e7:c2.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.1.1' (RSA) to the list of known hosts.
root@192.168.1.1's password: *********

BusyBox v1.15.3 (2011-07-07 02:30:22 CEST) built-in shell (ash)
Enter 'help' for a list of built-in commands.

  _______                     ________        __
 |       |.-----.-----.-----.|  |  |  |.----.|  |_
 |   -   ||  _  |  -__|     ||  |  |  ||   _||   _|
 |_______||   __|_____|__|__||________||__|  |____|
          |__| W I R E L E S S   F R E E D O M
 Backfire (10.03.1-RC5, r27608) --------------------------
  * 1/3 shot Kahlua    In a shot glass, layer Kahlua 
  * 1/3 shot Bailey's  on the bottom, then Bailey's, 
  * 1/3 shot Vodka     then Vodka.
 ---------------------------------------------------
root@OpenWrt:~#

À partir de maintenant, vous pouvez vous connecter à la cible de manière sécurisée et cryptée. Et par ailleurs, vous êtes en mesure de vérifier l'identité de celle-ci à la connexion. Par contre, il va encore falloir attendre de lui donner une adresse satisfaisante avant de la placer à son emplacement définitif sur le réseau...

Configurer l'adresse IP de la cible

Par défaut, l'adresse IPv4 d'usine du port LAN d'une cible OpenWrt est 192.168.1.1. C'est l'adresse que nous avons utilisée jusqu'ici. Mais pas nécessairement une adresse adaptée à votre réseau. Une tâche de base de la configuration de toute cible est donc de fixer son adresse. Et accessoirement de lui fournir d'autres informations sur votre réseau telles que l'adresse de la passerelle, le masque de réseau, l'adresse du serveur DNS, etc.

Pour la configuration d'OpenWrt, je vais utiliser ici UCI (Unified Configuration Interface – Sous OpenWrt, l'outil d'administration en ligne de commande introduit par backtrace) . À partir de Backfire, UCI est l'outil de configuration standard pour OpenWrt. C'est une surcouche qui permet de modifier les fichiers de configuration situés sous /etc/config. UCI fonctionne en ligne de commande. C'est donc un outil adapté si vous vous connectez à votre cible par ssh ou par la console série. Il se révèle également pratique pour lire ou modifier la configuration à partir de scripts. Comme vous le verrez ci-dessous, la commande uci set permet de modifier une option de configuration. Les différentes options modifiées ici s'expliquent d'elles-même:

root@OpenWrt:~# uci set network.lan.proto=static
root@OpenWrt:~# uci set network.lan.ipaddr=10.129.38.123
root@OpenWrt:~# uci set network.lan.netmask=255.255.255.0
root@OpenWrt:~# uci set network.lan.gateway=10.129.38.99
root@OpenWrt:~# uci set network.lan.dns=10.129.36.245

Dans uci, une option est identifiée par un triplet contenant le nom du fichier de configuration, la section correspondante dans le fichier, et finalement par le nom de l'option. Toutes les options ci-dessus correspondent dont à des options de la section lan du fichier /etc/config/network. On peut retrouver ces options en examinant directement le fichier de configuration – et accessoirement les modifier directement dans ce fichier:

root@OpenWrt:~# cat /etc/config/network
[...]
config 'interface' 'lan'
        option 'ifname'   'eth0.1'
        option 'type'     'bridge'
        option 'proto'    'static'
        option 'ipaddr'   '192.168.1.1'
        option 'netmask'  '255.255.255.0'
[...]

Cette petite digression au sujet des fichiers de configuration me permet de vous montrer que les modifications faites avec uci set ne sont pas immédiatement appliquées. En effet, le fichier de configuration contient encore les anciennes valeurs. Pas celles que j'ai modifiées à avec uci set. Pour que les modifications soient propagées, il faut utiliser uci commit. Mais avant d'appliquer les changements, vous pouvez vérifier les paramètres modifiés afin de vous assurer qu'il n'y a pas d'erreur:

root@OpenWrt:~# uci changes
network.lan.ipaddr=10.129.38.123
network.lan.gateway=10.129.38.99
network.lan.dns=10.129.36.245

Ici, je constate que network.lan.proto et network.lan.netmask n'apparaissent pas dans la liste des modifications. C'est simplement qu'ils avaient déjà les mêmes valeurs. En cas de doute, il est possible aussi d'interroger uci pour obtenir la valeur de ces options:

root@OpenWrt:~# uci get network.lan.proto
static
root@OpenWrt:~# uci get network.lan.netmask
255.255.255.0

Piège:

uci get renvoie la valeur actuellement configurée d'une option. Pas sa valeur en cours. Ainsi, pour l’instant, ma cible a toujours pour adresse LAN 192.168.1.1, mais uci get renvoie la valeur configurée:

root@OpenWrt:~# uci get network.lan.ipaddr 
10.129.38.123

Par ailleurs, comme nous l'avons vu plus haut, c'est toujours l'ancienne valeur qui est stockée dans le fichier de configuration. Cela crée une petite fenêtre d'incohérence pendant laquelle un même paramètre est susceptible d'avoir une valeur différente selon qu'un programme utilise la valeur courante, celle contenue dans un des fichiers du répertoire /etc/config ou uci get.

Quand vous êtes convaincu que les nouvelles valeurs sont correctes, il reste à appliquer les changements:

root@OpenWrt:~# uci commit

Vous serez peut-être surpris de constater que la liaison ssh est toujours opérationnelle. Ce qui ne devrait pas être le cas si l'adresse a réellement changé. Pour être tout à fait précis, uci commit se contente de propager les modifications aux fichiers de configuration standard des services concernés. Ces modifications ne sont pas nécessairement prises en compte automatiquement. Ainsi, dans le cas des services réseau, il est nécessaire de demander explicitement de relire la configuration:

root@OpenWrt:~# /etc/init.d/network reload

Note:

On peut aussi redémarrer un service:

root@OpenWrt:~# /etc/init.d/network restart

Ici, la connexion ssh devrait apparaitre bloquée: c'est normal, votre cible a changé d'adresse. Comme le client ssh ne se rend pas immédiatement compte que la connexion est rompue, vous devrez y mettre fin manuellement en pressant ↵;~. (return tilde point) Au pire, vous pouvez aussi simplement fermer la fenêtre...

Toujours est-il que pour continuer à configurer votre cible, vous devrez ouvrir une nouvelle session ssh en la contactant à sa nouvelle adresse. Ce qui fera croire à ssh que c'est une nouvelle machine – et donc va requérir que vous validiez son identité:

sh$ ssh root@10.129.38.123
The authenticity of host '10.129.38.123 (10.129.38.123)' can't be established.
RSA key fingerprint is 6a:cb:5c:56:77:60:1d:41:ba:0a:25:ce:2f:11:e7:c2.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.129.38.123' (RSA) to the list of known hosts.
root@10.129.38.123's password: *********

BusyBox v1.15.3 (2011-07-07 02:30:22 CEST) built-in shell (ash)
Enter 'help' for a list of built-in commands.

  _______                     ________        __
 |       |.-----.-----.-----.|  |  |  |.----.|  |_
 |   -   ||  _  |  -__|     ||  |  |  ||   _||   _|
 |_______||   __|_____|__|__||________||__|  |____|
          |__| W I R E L E S S   F R E E D O M
 Backfire (10.03.1-RC5, r27608) --------------------------
  * 1/3 shot Kahlua    In a shot glass, layer Kahlua 
  * 1/3 shot Bailey's  on the bottom, then Bailey's, 
  * 1/3 shot Vodka     then Vodka.
 ---------------------------------------------------
root@OpenWrt:~# 

Enfin, si vous le souhaitez, vous pouvez placer votre cible à son emplacement définitif sur le réseau: en effet, celle-ci est maintenant accessible en toute sécurité par ssh via son adresse définitive.

Accès internet

Par Ethernet

Si vous avez configuré l'accès au réseau local comme décrit précédemment et qu'Internet est accessible via la passerelle indiquée sur ce réseau local, votre routeur devrait déjà avoir l'accès Internet:

root@OpenWrt:~# ping -c 3 www.openwrt.org
PING www.openwrt.org (78.24.191.177): 56 data bytes
64 bytes from 78.24.191.177: seq=0 ttl=45 time=79.416 ms
64 bytes from 78.24.191.177: seq=1 ttl=45 time=79.388 ms
64 bytes from 78.24.191.177: seq=2 ttl=45 time=81.007 ms

--- www.openwrt.org ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 79.388/79.937/81.007 ms

Le succès de ce ping démontre que la passerelle et le serveur de nom (DNS) sont tous deux accessibles par votre cible. En cas d'échec, vérifiez l'adresse de la passerelle (network.lan.gateway) et celle du serveur DNS (network.lan.dns). La commande uci show qui affiche l'arborescence des options d'une section peut aider ici:

root@OpenWrt:~# uci show network.lan
network.lan=interface
network.lan.ifname=eth0.1
network.lan.type=bridge
network.lan.proto=static
network.lan.netmask=255.255.255.0
network.lan.ipaddr=10.129.38.123
network.lan.dns=10.129.36.245
network.lan.gateway=10.129.38.99

Piège:

Un piège dans lequel je suis tombé, c'est que uci set n'est pas en mesure de vérifier la validité d'une option. Cela veut dire que vous êtes à la merci d'une faute de frappe. Par exemple, lors de la rédaction de cet article, je me suis creusé la tête un moment pour savoir pourquoi OpenWrt ne voulait pas utiliser la passerelle comme route par défaut. Voici ce que montrait uci show:

root@OpenWrt:~# uci show network.lan
network.lan=interface
network.lan.ifname=eth0.1
network.lan.type=bridge
network.lan.proto=static
network.lan.netmask=255.255.255.0
network.lan.ipaddr=10.129.38.123
network.lan.dns=10.129.36.245
network.lan.getaway=10.129.38.99

Tout semblait en ordre, jusqu'à ce que je remarque enfin que j'avais orthographié getaway au lieu de gateway. Une fois cela constaté, la correction était rapide:

root@OpenWrt:~# uci del network.lan.getaway
root@OpenWrt:~# uci set network.lan.gateway=10.129.38.99
root@OpenWrt:~# uci commit
root@OpenWrt:~# /etc/init.d/network reload

Si votre cible dispose d'un port WAN – comme dans le cas par exemple d'un routeur – vous préfèrerez peut-être utiliser celui-ci pour l'accès externe. Dans ce cas, il vous faudra reprendre les commandes de la section précédente, mais en remplaçant lan par wan:

root@OpenWrt:~# uci set network.wan.proto=static
root@OpenWrt:~# uci set network.wan.ipaddr=10.129.39.123
root@OpenWrt:~# uci set network.wan.netmask=255.255.255.0
root@OpenWrt:~# uci set network.wan.gateway=10.129.39.99
root@OpenWrt:~# uci set network.wan.dns=10.129.36.245

Si vous configurez à la fois le port LAN et le port WAN, vous souhaiterez sans doute les placer sur des réseaux différents. Ainsi, dans mon exemple, le LAN est sur le réseau 10.129.38.0/24 et le WAN sur 10.129.39.0/24.

Par modem interne

N'ayant pas le matériel nécessaire, je n'ai pas pu tester ces manipulations. Je me contenterai donc de vous renvoyer aux documentations correspondantes du site OpenWrt.org:

Pour un accès xDSL
voir PPP, PPPoE ou PPPoA. Cette dernière possibilité est sans doute à considérer si votre cible intègre un modem ADSL.
Pour un accès câble (DOCSIS)
je ne pense pas qu'il y ait de support spécifique pour cette technologie. La solution est de se connecter au modem de votre fournisseur d'accès par une liaison Ethernet.
Pour un accès mobile (HSDPA/UMTS/EDGE/GPRS/GSM)
voir 3G.

Dans tous les cas, vous souhaiterez peut-être configurer la cible pour partager l'accès Internet au travers d'un NAT.

Changer le nom d'hôte de la cible

Vous pouvez changer le nom d'hôte de votre cible en jouant sur l'option hostname de la configuration system:

root@OpenWrt:~# uci set system.@system[0].hostname='MyTarget'
root@OpenWrt:~# uci commit

La modification ne sera effective qu'au redémarrage de la cible.

root@OpenWrt:~# reboot

Ceci dit, vous pouvez différer de quelques minutes ce redémarrage, le temps de configurer l'heure et le fuseau horaire, comme nous allons le faire maintenant.

Réglez la date et l'heure

Par défaut, OpenWrt utilise NTP sur le port WAN pour régler l'heure du système. Si votre accès Internet est plutôt sur le port LAN, vous devrez modifier l'option system.@rdate[0].interface:

root@MyTarget:~# uci set system.@rdate[0].interface=lan
root@MyTarget:~# uci commit
root@MyTarget:~# /etc/init.d/network restart

Dans tous les cas, vous souhaiterez sans doute configurer le fuseau horaire (timezone). Vous trouverez un tableau des codes de fuseau horaire sur le site d'OpenWrt. Pour ne citer que quelques exemples, Paris, Bruxelles, Zurich et Monaco sont sur le fuseau CET-1CEST, Montréal est sur EST5EDT, Casablanca est sur WET0 et Dakar est sur GMT0.

Pour ma part étant en France métropolitaine, donc sur le même fuseau horaire que Paris, j'ai modifié ma configuration ainsi:

root@MyTarget:~# uci set system.@system[0].timezone=CET-1CEST

Comme pour le nom d'hôte, le changement de fuseau horaire ne semble pris en compte qu'au redémarrage de la cible:

root@MyTarget:~# reboot

Supprimer l'interface web

Pour terminer, je vais profiter de cet article pour introduire opkg, l'outil de gestion de paquets d'OpenWrt. Comme ses homologues apt-get, yum, etc. d'autres distributions Linux, opkg permet d'installer et désinstaller des packets tout en vérifiant les dépendances entre paquets afin d'assurer la cohérence du système.

Pour rapidement illustrer l'utilisation de ce programme, voici comment désinstaller LuCI sur votre cible OpenWrt, si, comme moi, vous préférez utiliser ssh pour administrer votre machine plutôt que l'interface web. Quelques tâtonnements m'ont permis de déterminer que luci-lib-core est le paquet de base desquels tous les autres paquets de LuCI dépendent. Et, comme vous le constaterez, j'utilise l'option --force-removal-of-dependent-packages pour demander à opkg de supprimer également les paquets qui dépendent de luci-lib-core:

root@MyTarget:~# opkg remove luci-lib-core --force-removal-of-dependent-packages
Removing package luci-app-firewall from root...
Removing package luci-mod-admin-full from root...
Removing package luci-mod-admin-core from root...
Removing package luci-theme-openwrt from root...
Removing package luci-theme-base from root...
Removing package luci-lib-web from root...
Not deleting modified conffile /etc/config/luci.
Removing package luci-lib-nixio from root...
Removing package luci-lib-core from root...

Et puisque LuCI est désinstallé, plus besoin non plus du serveur web uhttp:

root@MyTarget:~# opkg remove uhttpd
Removing package uhttpd from root...

Remarque:

En plus de l'ajout et de la suppression de paquets, opkg supporte aussi la sous-commande opkg upgrade pour faire des mises à jour de paquets déjà installés. Mais, contrairement à ce que vous faites avec vos distributions Linux habituelles, ce n'est pas conseillé sous OpenWrt.

L'explication réside dans l'organisation de la mémoire sous OpenWrt: en effet, dans la majeure partie des installations, le système installé avec le firmware l'est dans une partition SquashFS. Ce type de partition a pour avantage un grand taux de compression. Mais il est en lecture seule. Pour donner l'illusion que le système peut être modifié, OpenWrt utilise un système d'overlay qui s'apparente à un système de copy-on-write: l'overlay contient essentiellement toutes les différences entre le système de fichier courant et celui qui a été flashé lors de l'installation d'OpenWrt – la partition SquashFS restant toujours identique à ce qu'elle était à l'installation [1]. Si vous êtes curieux, sur votre cible, le système SquashFS est accessible à partir du point de montage /rom. Alors que le contenu de l'overlay l'est à partir du point de montage /overlay. En comparant les deux, vous constaterez que l'overlay contient bien tous les fichiers modifiés ainsi que des informations supplémentaires concernant les fichiers supprimés.

Ainsi, supprimer ou modifier un fichier du système de base ne libère pas de place sur celui-ci, mais en occupe sur l'overlay. La mise à jour des paquets d'une installation OpenWrt est donc susceptible de consommer une place non négligeable sur le système d'overlay.

Par conséquent, si vous envisagez de supprimer de nombreux paquets ou de basculer sur des versions plus récentes, il sera préférable de compiler un nouveau firmware OpenWrt personnalisé puis de l'installer sur la cible.

Ressources