Discussion Utilisateur:Drien
Un article de Toulouse Sans Fil, un réseau wifi libre sur Toulouse.
| Sommaire |
Script de téléchargement et de flashage
A executer sur un Linux relié au WRT en Ethernet
#!/bin/bash wget http://downloads.openwrt.org/whiterussian/newest/bin/openwrt-wrt54g-squashfs.bin tftp 192.168.1.1 << EOF binary trace rexmt 1 timeout 120 put openwrt-wrt54g-squashfs.bin EOF
Le flashage par TFTP ci-dessus requiert le boot_wait à "on". Si ce n'est pas le cas, on peut aussi passer par l'interface HTTP de Linksys, bien que cela soit - en théorie - plus risqué.
Scrip t de configuration
Une fois le WRT flashé, exécuter ce script depuis la console telnet du WRT. OK, ce script est tout pas beau, mais il nous permet, à Ouinouin et moi, de faire en 10 secondes ce qui prendrait... plus. Si quelques connaisseurs venaient à passer sur cette page, qu'ils n'hésitent pas à faire quelque chose de plus propre ! (genre : mettre la declaration de toutes les variables modifiables par l'utilisateur en tete de script et ne rien laisser de modifiable dans le script en lui meme)
Objectif du script :
- faire les configs Wifi et IP selon les specs TSF (ne pas oublier de compléter la clé WEP) - télécharger les paquetages nécessaires (olsrd, olsrd-mod-httpinfo, olsrd-mod-nameservice, openntpd et wl) - configurer olsrd
Attention, le script ne marchera pas chez vous sans retouche.
#!/bin/sh
if [ $# != 3 ] ; then
echo "syntax : $0 <hostname> <wifi_ipaddr> <lan_ipaddr>"
exit
fi
# Le script prend 3 paramètres
hostname=$1
wifi_ipaddr=$2
lan_ipaddr=$3
############################################################################################
# Parametrage de la NVRAM
# /!\ Ne pas oublier de rajouter la clé WEP
############################################################################################
nvram set wl0_channel 5
nvram set wl0_infra=0
nvram set wl0_ssid=toulouse-sans-fil.net
nvram set wl0_wep_bit=128
nvram set wl0_wep=enabled
nvram set wl0_key=1
nvram set wl0_akm=open
nvram set wl0_key1='''rajouter la clé WEP'''
nvram set wifi_netmask=255.0.0.0
nvram set wifi_proto=static
lan_ifname=`nvram show 2> /dev/null | grep lan_ifnames | sed s/eth[0-9]*//g | cut -d= -f2`
echo lan_ifname=$lan_ifname
nvram set lan_ifname=$lan_ifname
wifi_ifname=`iwconfig 2> /dev/null | grep IEEE | cut -d' ' -f1`
echo wifi_ifname=$wifi_ifname
nvram set wifi_ifname=$wifi_ifname
nvram set wifi_hostname=$hostname
nvram set wan_hostname=$hostname
nvram set wifi_ipaddr=$wifi_ipaddr
nvram set lan_ipaddr=$lan_ipaddr
nvram set lan_netmask=255.255.255.0
# /!\ Clé WEP
# nvram set wl0_key1=
nvram commit
############################################################################################
# Accès à Internet pour télécharger les paquetages
# /!\ Modifier le script pour coller à votre config réseau
############################################################################################
#rm -f /etc/resolv.conf
# Passerelle par défaut : à modifier
#route add default gw 192.168.1.254
# Serveur de noms : à modifier
#echo "nameserver 192.168.1.254" > /etc/resolv.conf
ipkg update
ipkg install olsrd olsrd-mod-httpinfo olsrd-mod-nameservice openntpd wl
############################################################################################
# Config diverses
############################################################################################
# Config d'OpenNTP
echo "servers pool.ntp.org" > /etc/ntpd.conf
# Suppression du firewall de base
rm -f /etc/init.d/S45firewall
# Configuration d'olsrd
echo "#
# olsr.org OLSR daemon config file
#
# Lines starting with a # are discarded
#
# This file was shipped with olsrd 0.X.X
#
# Debug level(0-9)
# If set to 0 the daemon runs in the background
DebugLevel 2
# IP version to use (4 or 6)
IpVersion 4
# Clear the screen each time the internal state changes
ClearScreen yes
# HNA IPv4 routes
# syntax: netaddr netmask
# Example Internet gateway:
# 0.0.0.0 0.0.0.0
#169.254.0.0 255.255.0.0
Hna4
{
# Internet gateway:
# 0.0.0.0 0.0.0.0
# more entries can be added:
# 192.168.1.0 255.255.255.0
}
# HNA IPv6 routes
# syntax: netaddr prefix
# Example Internet gateway:
Hna6
{
# Internet gateway:
# :: 0
# more entries can be added:
# fec0:2200:106:: 48
}
# Should olsrd keep on running even if there are
# no interfaces available? This is a good idea
# for a PCMCIA/USB hotswap environment.
# \"yes\" OR \"no\"
AllowNoInt yes
# TOS(type of service) value for
# the IP header of control traffic.
# If not set it will default to 16
#TosValue 16
# The fixed willingness to use(0-7)
# If not set willingness will be calculated
# dynamically based on battery/power status
# if such information is available
#Willingness 4
# Allow processes like the GUI front-end
# to connect to the daemon.
IpcConnect
{
# Determines how many simultaneously
# IPC connections that will be allowed
# Setting this to 0 disables IPC
MaxConnections 0
# By default only 127.0.0.1 is allowed
# to connect. Here allowed hosts can
# be added
Host 127.0.0.1
#Host 10.0.0.5
# You can also specify entire net-ranges
# that are allowed to connect. Multiple
# entries are allowed
Net 192.168.1.0 255.255.255.0
}
# Whether to use hysteresis or not
# Hysteresis adds more robustness to the
# link sensing but delays neighbor registration.
# Used by default. 'yes' or 'no'
UseHysteresis no
# Hysteresis parameters
# Do not alter these unless you know
# what you are doing!
# Set to auto by default. Allowed
# values are floating point values
# in the interval 0,1
# THR_LOW must always be lower than
# THR_HIGH.
HystScaling 0.50
HystThrHigh 0.80
HystThrLow 0.30
# Link quality level
# 0 = do not use link quality
# 1 = use link quality for MPR selection
# 2 = use link quality for MPR selection and routing
# Defaults to 0
LinkQualityLevel 2
# Link quality window size
# Defaults to 10
#LinkQualityWinSize 10
# Polling rate in seconds(float).
# Default value 0.05 sec
Pollrate 0.05
# TC redundancy
# Specifies how much neighbor info should
# be sent in TC messages
# Possible values are:
# 0 - only send MPR selectors
# 1 - send MPR selectors and MPRs
# 2 - send all neighbors
#
# defaults to 0
TcRedundancy 2
#
# MPR coverage
# Specifies how many MPRs a node should
# try select to reach every 2 hop neighbor
#
# Can be set to any integer >0
#
# defaults to 1
#MprCoverage 1
# Olsrd plugins to load
# This must be the absolute path to the file
# or the loader will use the following scheme:
# - Try the paths in the LD_LIBRARY_PATH
# environment variable.
# - The list of libraries cached in /etc/ld.so.cache
# - /lib, followed by /usr/lib
# Example plugin entry with parameters:
#LoadPlugin \"olsrd_dyn_gw.so.0.3\"
#{
# Here parameters are set to be sent to the
# plugin. Theese are on the form \"key\" \"value\".
# Parameters ofcause, differs from plugin to plugin.
# Consult the documentation of your plugin for details.
# Example: dyn_gw params
# how often to check for Internet connectivity
# defaults to 5 secs
# PlParam \"Interval\" \"40\"
# if one or more IPv4 addresses are given, do a ping on these in
# descending order to validate that there is not only an entry in
# routing table, but also a real internet connection. If any of
# these addresses could be pinged successfully, the test was
# succesful, i.e. if the ping on the 1st address was successful,the
# 2nd won't be pinged
# PlParam \"Ping\" \"141.1.1.1\"
# PlParam \"Ping\" \"194.25.2.129\"
#}
LoadPlugin \"olsrd_httpinfo.so.0.1\"
{
PlParam \"port\" \"42080\"
PlParam \"Net\" \"10.31.0.0 255.255.0.0\"
PlParam \"Net\" \"192.168.1.0 255.255.255.0\"
PlParam \"Net\" \"10.254.0.0 255.255.0.0\"
}
# Interfaces and their rules
# Omitted options will be set to the
# default values. Multiple interfaces
# can be specified in the same block
# and multiple blocks can be set.
# !!CHANGE THE INTERFACE LABEL(s) TO MATCH YOUR INTERFACE(s)!!
# (eg. wlan0 or eth1):
Interface \"$wifi_ifname\"
{
# IPv4 broadcast address to use. The
# one usefull example would be 255.255.255.255
# If not defined the broadcastaddress
# every card is configured with is used
# Ip4Broadcast 255.255.255.255
# IPv6 address scope to use.
# Must be 'site-local' or 'global'
# Ip6AddrType site-local
# IPv6 multicast address to use when
# using site-local addresses.
# If not defined, ff05::15 is used
# Ip6MulticastSite ff05::11
# IPv6 multicast address to use when
# using global addresses
# If not defined, ff0e::1 is used
# Ip6MulticastGlobal ff0e::1
# Emission intervals.
# If not defined, RFC proposed values will
# be used in most cases.
# Hello interval in seconds(float)
# HelloInterval 2.0
# HELLO validity time
# HelloValidityTime 6.0
# TC interval in seconds(float)
# TcInterval 5.0
# TC validity time
# TcValidityTime 15.0
# MID interval in seconds(float)
# MidInterval 5.0
# MID validity time
# MidValidityTime 15.0
# HNA interval in seconds(float)
# HnaInterval 5.0
# HNA validity time
# HnaValidityTime 15.0
# When multiple links exist between hosts
# the weight of interface is used to determine
# the link to use. Normally the weight is
# automatically calculated by olsrd based
# on the characteristics of the interface,
# but here you can specify a fixed value.
# Olsrd will choose links with the lowest value.
# Weight 0
}
LoadPlugin \"olsrd_nameservice.so.0.2\"
{
PlParam \"name\" \"$hostname\" # node name
PlParam \"suffix\" \".tsf\" # suffix for OLSR nodes
PlParam \"hosts-file\" \"/etc/hosts\" # read by dnsmasq
#PlParam \"resolv-file\" \"/etc/resolv.olsr\" # writen by daemon
}
" > /etc/olsrd.conf
rm -f /etc/hosts
exit
Firewall minimaliste
Le script suivant permet de filter les paquets routés entre le réseau local du Wifiste 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.
#!/bin/sh
# Variables : les interfaces TSF sont
# - l'interface wifi du WRT (récupéré automatiquement dans la NVRAM)
# - éventuellement le tunnel (tap0)
# l'interface LAN est celle du hub du WRT (également récupéré automatiquement
# dans la NVRAM)
ifaceWifi=$(nvram get wl0_ifname) #wifi_ifname ?
ifaceTSF="$ifaceWifi tap0" # On pourrait mettre la liste des interfaces TSF
# dans une variable NVRAM
ifaceLAN=$(nvram get lan_ifname)
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
Résolution de noms avec le tandem dnsmasq/nameservice
J'ai déplacé cette partie sur Résolution de noms -- Aurelien 20 sep 2006 à 21:18 (CEST)
Développement d'un firmware TSF
Compte rendu de la réunion de travail sur la réalisation d'un firmware du 5/10/2006
Contenu : que doit contenir le firmware ?
Pour la première version du firmware, les programmes qui doivent être inclus sont :
- ssh, avec répartition des clés,
- commandes wl,
- olsrd, avec la configuration du routage, httpinfo et nameservice,
- openntp, en client sur le service ntp interne de TSF, et à défaut sur pool.ntp.org (le WRT doit être à l'heure pour monter le tunnel OpenVPN),
- cron, pour les reboots réguliers,
- openvpn, le client (gérer le certificat qui risque d'être écrasé au flashage),
- firewall minimaliste.
Tous les fichiers de configuration doivent être passés au peigne fin pour ne pas oublier les paramètres à fixer.
Problématique de la maintenance des N noeuds du réseau
Proposition : une base de donnée, avec une table qui contient une entrée par noeud du réseau. Cette table contient :
- l'adresse IP du noeud,
- l'adresse MAC du noeud (seul paramètre connu et inchangeable, dès l'achat et après flashage. Note : l'adresse MAC considérée est celle présente sur l'étiquette de l'appareil),
- le nom DNS du noeud,
- le type hardware du noeud et sa version,
- le certificat OpenVPN de ce noeud, qui aura été généré par le serveur VPN.
L'upgrade d'une TSFBox doit se faire en deux temps :
- une première étape de flashage (installation du firmware). Cette étape est commune à tous les noeuds du réseau. A l'issue de ce premier temps, seule l'adresse MAC différencie les noeuds entre eux. Attention : les noeuds doivent être flashés en tenant compte du hardware.
- une seconde étape de post configuration qui configurera le noeud et lui rendra son unicité.
La base de donnée permettra de passer le bon script de post installation au client à flasher.
A chaque upgrade de la TSFBox (on passe de la version x à la version x+1, il faut reflasher tous les noeuds), les administrateurs du réseau lancent une procédure qui :
- se connecte sur le WRT à flasher,
- lance un téléchargement du nouveau firmware + un script de post installation,
- modifie une variable nvram "tsf-upgrade-passwd" (par exemple) à une valeur aléatoire générée par le serveur,
- flashe le WRT avec la commande mtd,
- reboote le WRT,
- lance le script de post install.
Le script de post install termine la configuration :
- reconfiguration de la NVRAM,
- si le certificat OpenVPN a été écrasé par le flashage, il faut le retélécharger sur le serveur de manière sécurisée. L'accès peut se faire en HTTPS avec login/password. L'identifiant peut être l'adresse MAC et le mot de passe le contenu de la variable NVRAM tsf-upgrade-passwd (principe de "one time password"). Une fois la conf téléchargée, elle est suprimée du serveur.
- récupère les différents paramètres de la NVRAM et modifie les fichiers de configuration : olsrd.conf, ntpd.conf, openvpn.conf & co, resolv.conf, etc.
Note : un upgrade de la TSFBox peut court-circuiter l'étape de firmware (le passage à la version x+1 peut être basé sur le même firmware...)
Attention : la mise à jour de la NVRAM est difficile... il faut la flasher de manière exhaustive... cf. le problème de Vincent. Nos scripts habituels n'ont pas fonctionné car avant l'install d'OpenWRT, le WPA était activé. D'où le pb de la mise à jour exhaustive de la NVRAM...
Soyons un peu Kamikaze
Un petit exemple de config d'une TSFbox sous OpenWRT Kamikaze (réalisée le 11/11/2007, sous OpenWRT Kamikaze 7.09). Attention, les configurations indiquées 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 peuvent être nécessaires.
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
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
Mise à l'heure automatique
Si le noeud est relié à Internet, il est possible de le mettre à l'heure régulièrement. Ajouter une ligne dans le fichier /etc/crontabs/root
*/5 * * * * /usr/sbin/ntpclient -s -h pool.ntp.org
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
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)&