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


Test de miniature

Ubiquity NanoStation2
Agrandir
Ubiquity NanoStation2