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).
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.