Kamikaze

Un article de Toulouse Sans Fil, un réseau wifi libre sur Toulouse.

Kamikaze est la dernière version de la distribution OpenWRT. Elle permet notamment de faire tourner OpenWRT sur d'autres plateformes matérielles que le seul Linksys WRT54G.

Voici un exemple de configuration d'OpenWRT Kamikaze en vue d'une utilisation sur le réseau TSF. Cette configuration a été réalisée sous OpenWRT Kamikaze 7.09. On considère à ce stade qu'OpenWRT Kamikaze a été installé, cette opération étant fortement dépendante de la plateforme matérielle visée (se référer à la TableOfHardware (http://wiki.openwrt.org/TableOfHardware) sur le Wiki d'OpenWRT - en constante évolution).

Sommaire

Configuration de base

Les paragraphes suivants détaillent les modifications à faire pour rendre sa plateforme OpenWRT compatible avec le réseau TSF.

Nom du noeud

Fixer le nom du noeud dans le fichier /etc/config/system. Ce nom apparaîtra dans la console après le premier reboot.

config system
        option hostname CeD

Configuration des interfaces et du réseau sans fil

Attention, le contenu des fichiers /etc/config/network et /etc/config/wireless est fortement dépendant de la plateforme matérielle. Les exemples donnés ici sont valables sur les plateformes Linksys WRT54G (brcm-2.4) et Fonera/Meraki (atheros-2.6). Pour d'autre plateformes (Netgear WGT634U, Ubiquity LS2, etc.), des modifications spécifiques peuvent être nécessaires.

Fichier /etc/config/network pour une plateforme type meraki/fonera/LS2

config interface loopback
        option ifname   lo
        option proto    static
        option ipaddr   127.0.0.1
        option netmask  255.0.0.0

config interface lan
        option ifname   eth0
        option type     bridge
        option proto    static
        option ipaddr   192.168.1.1
        option netmask  255.255.255.0

config interface        wifi0
        option ifname   ath0
        option proto    static
        option ipaddr   10.31.0.66
        option netmask  255.0.0.0
        option dns      127.0.0.1

Fichier /etc/config/network pour une plateforme type WRT54G

#### VLAN configuration
config switch eth0
        option vlan0    "0 1 2 3 5*"
        option vlan1    "4 5"

#### Loopback configuration
config interface loopback
        option ifname   "lo"
        option proto    static
        option ipaddr   127.0.0.1
        option netmask  255.0.0.0

#### LAN configuration
config interface lan
        option type     bridge
        option ifname   "eth0.0"
        option proto    static
        option ipaddr   192.168.1.1
        option netmask  255.255.255.0

#### WAN configuration
config interface        wan
        option ifname   "eth0.1"
        option proto    dhcp

#### WLAN configuration
config interface        adhoc
        option ifname   "none"
        option proto    static
        option ipaddr   10.31.0.67
        option netmask  255.0.0.0
        option dns      127.0.0.1

Fichier /etc/config/wireless pour une plateforme type meraki/fonera/LS2

config wifi-device  wifi0
        option type       atheros
        option channel    5
        option diversity  0
        option txantenna  1
        option rxantenna  1
        option distance   10000
        option disabled   0

config wifi-iface
        option device     wifi0
        option mode       adhoc
        option ssid       toulouse-sans-fil.net
        option txpower    18
        option encryption wep
        option key        <tfoupasici>

Fichier /etc/config/wireless pour une plateforme type WRT54G

config wifi-device  wl0
        option type     broadcom
        option channel  5
        option disabled 0

config wifi-iface
        option device   wl0
        option network  adhoc
        option mode     adhoc
        option ssid     toulouse-sans-fil.net
        option encryption wep
        option key      <tfoupasici>

Installation/Mise à jour des paquets

Vérifier que l'on a accès à Internet, télécharger la liste des paquetages, lancer la mise à jour et installer les paquetages utiles à TSF.

ipkg update
ipkg upgrade
ipkg install olsrd dnsmasq ntpclient olsrd-mod-dot-draw olsrd-mod-httpinfo olsrd-mod-nameservice

Configuration du démon OLSR et plugins

Tout se passe dans le fichier /etc/olsrd.conf. Ne pas oublier de préciser l'interface sur laquelle travaillera olsrd (ath0 pour Meraki/Fonera et wl0 pour Linksys WRT54G) et de spécifier le nom du noeud, qui sera ensuite diffusé par nameservice.

DebugLevel      0
IpVersion       4
ClearScreen     yes

Hna4
{
}

Hna6
{
}

AllowNoInt      yes
IpcConnect
{
     MaxConnections  0
     Host            127.0.0.1
}

UseHysteresis   no
HystScaling     0.50
HystThrHigh     0.80
HystThrLow      0.30
LinkQualityLevel        2
Pollrate        0.05
NicChgsPollInt  3.0

Interface "ath0"
{
}

LoadPlugin "olsrd_httpinfo.so.0.1"
{
PlParam     "port"   "42080"
PlParam     "Net"    "0.0.0.0 0.0.0.0"
}
LoadPlugin "olsrd_nameservice.so.0.3"
{
PlParam "name" "meraki-tsf"
PlParam "suffix" ".tsf"
PlParam "hosts-file" "/etc/hosts"
}

Automatisation du lancement du démon Olsrd

ln -s /etc/init.d/olsrd /etc/rc.d/S70olsrd

Configuration de dnsmasq

dnsmasq permet la résolution des noms de domaines. Dans le cadre de TSF, il s'appuie sur les informations récupérées par nameservice d'olsrd pour mettre à jour sa table DNS pour le nom de domaine .tsf. Pour celà, on doit régulièrement lui envoyer le signal HUP ; ce signal sera envoyé toutes les minutes par cron.

Pour toutes les autres requêtes, il interroge un serveur sur Internet, comme indiqué dans le fichier /etc/resolv.dnsmasq (même syntaxe que resolv.conf).

Fichier /etc/dnsmasq.conf

localise-queries
local=/tsf/
domain=tsf
domain-needed
resolv-file=/etc/resolv.dnsmasq
addn-hosts=/etc/hosts

Noter le PID du démon dnsmasq à chaque lancement : il est nécessaire d'ajouter l'option --pid-file à l'execution du démon. Modifier le fichier /etc/init.d/dnsmasq de manière à :

- ajouter l'option --pid-file

- forcer la résoltion des noms sur le domaine tsf

dnsmasq $args --pid-file=/tmp/dnsmasq.pid && {
                rm -f /tmp/resolv.conf
                cat > /tmp/resolv.conf <<EOF
nameserver 127.0.0.1
search tsf
EOF
}

Ajouter une ligne dans la table de cron : le signal sera envoyé toutes les minutes. Ajouter une ligne dans le fichier /etc/crontabs/root

*/1 * * * * /bin/kill -HUP `cat /tmp/dnsmasq.pid`

Fichier /etc/resolv.dnsmasq

nameserver 195.68.0.1

Reboot régulier

Pour une bonne santé du réseau, les nodes doivent rebooter régulièrement (toutes les 24h par exemple). Ajouter une ligne au fichier /etc/init.d/done

# reboot every 2 hours
(sleep 7200; reboot)&

Pour plus de confort

Les configurations qui suivent sont optionnelles mais largement recommandées !

Mise à l'heure automatique

Les plateformes utilisées sur le réseau TSF ne sont généralement pas pourvues d'une horloge temps réel ; au boot, le système indique une date au 1/01/2000. Si le noeud est relié à Internet, il est possible de le mettre à l'heure régulièrement. Ajouter pour cela une ligne dans le fichier /etc/crontabs/root

*/5 * * * * /usr/sbin/ntpclient -s -h pool.ntp.org

En l'absence de précision, un système OpenWRT considère l'heure GMT. Pour la France, indiquer le TimeZone suivant dans le fichier /etc/TZ :

echo "CET-1CEST-2,M3.5.0/02:00:00,M10.5.0/03:00:00" > /etc/TZ

Une liste des autres TZ est disponible sur le site d'OpenWRT [1] (http://wiki.openwrt.org/OpenWrtDocs/Configuration#head-a7708420e79025405daa939605108397c2bd7343)

Commande de test de débit

OpenWRT Kamikaze inclue un microserveur web qu'il est possible d'utiliser pour faire des tests de débit. Créer un fichier test_debit dans le dossier /usr/bin contenant les deux lignes suivantes :

cd /tmp
rm test ; wget http://$1/test

Ne pas oublier de le rendre executable :

chmod 755 /usr/bin/test_debit

Créer un fichier de taille conséquante (par exemple 3 Mo) dans la RAM (/tmp) à chaque démarrage : ajouter la ligne suivante au fichier /etc/init.d/done

# create a 3MB file in /tmp for test_debit
dd if=/proc/kcore of=/tmp/test count=6000

et créer un lien dans le dossier de publication du serveur web.

ln -s /tmp/test /www/test

Firewall

Supprimer les règles de firewall par défaut

La distribution OpenWRT installe un firewall par défaut. Si vous souhaitez faire des tests, ellaborer un routage particulier, etc., vous pouvez juger opportun de le supprimer. Pour ce faire, remplacez le fichier /etc/init.d/firewall par ce qu'il suit. Notez que, de ce fait, votre routeur n'inclut plus aucun filtrage...

#!/bin/sh /etc/rc.common
# Copyright (C) 2006 OpenWrt.org

START=45

start() {
        iptables -P INPUT ACCEPT
        iptables -P OUTPUT ACCEPT
        iptables -P FORWARD ACCEPT
        iptables -F
        iptables -X
        iptables -t nat -P PREROUTING ACCEPT
        iptables -t nat -P POSTROUTING ACCEPT
        iptables -t nat -P OUTPUT ACCEPT
        iptables -t nat -F
        iptables -t nat -X
}

stop() {
        iptables -P INPUT ACCEPT
        iptables -P OUTPUT ACCEPT
        iptables -P FORWARD ACCEPT
        iptables -F
        iptables -X
        iptables -t nat -P PREROUTING ACCEPT
        iptables -t nat -P POSTROUTING ACCEPT
        iptables -t nat -P OUTPUT ACCEPT
        iptables -t nat -F
        iptables -t nat -X
}

Mettre en place un firewall minimaliste

Mieux que de supprimer le firewall par défaut, le script suivant permet de filter les paquets routés entre le réseau local et le réseau TSF.

Après application de ce script, la TSFBox :

  • n'applique pas de filtrage en entrée/sortie,
  • laisse passer les paquets venant du LAN et sortant sur l'une des interfaces TSF (wifi ou tunnel) en appliquant le masquerading,
  • ne laisse pas passer les paquets provenant de l'une des interfaces TSF et sortant sur la LAN.

Ce script permet donc de protéger le réseau local du wifiste tout en lui permettant d'accéder au réseau TSF depuis une machine de la LAN, mais sans protéger la box elle-même. Attention, vous devez adapter les noms de variables à votre configuration (ath0, wl0, br-lan, etc.).

Ce script peut-être appelé par /etc/init.d/done

#!/bin/sh

# Variables : les interfaces TSF sont
# - une liste d'interfaces TSF séparées par des espaces (wifi, tunnel, etc.)
# - une interface unique pour la LAN (typiquement eth0 ou br-lan)

ifaceTSF="ath0 tap0"
ifaceLAN="eth0"

iptables -t filter -F # Suppression des chaînes pré-définies de FILTER
iptables -t filter -X # Suppression des chaînes utilisateurs de FILTER
iptables -t nat -F    # Suppression des chaînes pré-définies de NAT
iptables -t nat -X    # Suppression des chaînes utilisateurs de NAT

# Polices par défaut : ouvert en entrée/sortie, mais pas de routage
iptables -P INPUT ACCEPT -v
iptables -P OUTPUT ACCEPT -v
iptables -P FORWARD DROP -v

# Traiter chaque interface TSF :
for iface in $ifaceTSF ; do

  # Autorisation du routage LAN vers TSF mais pas le contraire, avec masquerading
  iptables -t filter -A FORWARD -i $ifaceLAN -o $iface \
           -m state --state ! INVALID -j ACCEPT -v
  iptables -t filter -A FORWARD -i $iface -o $ifaceLAN \
           -m state --state ESTABLISHED,RELATED -j ACCEPT -v
  iptables -t nat -A POSTROUTING -o $iface -j MASQUERADE -v

  # Autorisation du routage entre cette interface TSF et chacune autre
  # interface TSF
  for iface2 in $ifaceTSF ; do
    if [ $iface2 != $iface ] ; then
      iptables -t filter -A FORWARD -i  $iface  -o $iface2 -j ACCEPT -v
    fi
  done
done

# Autorisation du routage noyau
echo "1" > /proc/sys/net/ipv4/ip_forward

Se relier au VPN

S'il n'y a pas d'autres wifistes TSF dans son voisinage, il est possible de se relier au réseau par VPN. Suivre ce tutoriel pour configurer le VPN.