Fonera mit OLSR

Aus Freifunk Hannover

Diese Schritt-für-Schritt Anleitung beschreibt, wie man einen La Fonera Router als Freifunk Router verwenden kann.

(Es handelt sich inzwischen um eine revidierte Version der historischen Fassung.)

Inhaltsverzeichnis

Alternative Firmware

Um der Fonera beizubrigen, auf die eigenen Wünsche einzugehen, kann man die vorhandene Firmware überschreiben und etwas anderes aufspielen.

Freifunk Kamikaze

OpenWrt Kamikaze ab Version 8.09 bringt von Haus aus Möglichkeiten zum Meshen mit. Der Freifunk-Support kann entweder als Paket nachinstalliert werden oder man verwendet direkt einen Freifunk Kamikaze Snapshot: viele Einstellungen sind bereits für Freifunk optimiert und die benötigten Pakete direkt im Image integriert.

Die jeweils aktuelle Version der Snapshot kann unter http://firmware.leipzig.freifunk.net/kamikaze/ oder http://dev.luci.freifunk-halle.net/freifunk-snapshots/ heruntergeladen werden.

Weitere technische Details zur Fonera findet man übrigens im Wiki von OpenWrt.

Freifunk Fonera Pack

Das Freifunk Fonera Pack von Sven-Ola ist ein Experiment, bei dem die original Firmware von FON um zusätzliche Funktionen für die Teilnahme am Freifunk Netzwerk ergänzt wurde. Diese neuen Funktionen können bequem und einfach über ein Webfrontend konfiguriert werden, weshalb das Pack Ideal für Einsteiger geeignet ist. Leider gibt es einige Probleme mit dem Freifunk Pack; so wird der FON Router z.B. von FON als "Dein Router ist offline" erkannt und auch das WLAN Signal bricht bei einigen Anwendern häufig zusammen. Das Fonera Pack wird zur Zeit nicht weiter ntwickelt.

Eine detailierte Beschreibung der Funktionsweise des Freifunk Fonera Pack findet man im Blog.

Mit dem Gerät verbinden

Serielle Schnittstelle

Am besten verschafft man sich Zugang zum Gerät über die serielle Schnittstelle, z.B. mit Hilfe eines handelsüblichen USB-To-Serial Konverter. Eine Diskussion über geeignete Kabel und die Pin-Belegung findet man im Forum [1].

Offensichtlich bootet die Fonera nicht, wenn ein USB-To-Serial Kabel (konkret der TX-Pin) angeschlossen ist. Man muss also zunächst das Kabel (den TX-Pin) entfernen, dann die Fonera mit Strom verbinden und nach ca. 5-8 Sekunden Warten dann das serielle Kabel anschließen.

Ethernet

Die Fonera hört in der Werkseinstellung am LAN-Port auf der IP-Adresse 169.254.255.1, d.h. man gibt sich einfach lokal eine feste IP aus dem Netzwerk 169.254.255.0/24 und kann sich dann mit einem Ethernetkabel verbinden. Das Standard-Login und -passwort für das WebInterface der LaFonera lautet jeweils 'admin'.

Eine besonders einfache Methode, den SSH Zugang freizuschalten, bietet der "Kolofonium Hack" (getestet mit Firmware 0.7.1-2): Über das Webinterface der FON Firmware muss vorübergehend die Adresse 88.198.165.155 als DNS-Server eingetragen und die Fonera einmal neu gestartet werden. Auf diese Weise werden Funktionen zur automatischen Router-Konfiguration so umgeleitet, daß manipulierte Daten eingeschleust und letztlich der SSH Zugang für den Zugriff über WLAN aktiviert wird.

Weitere Methoden zum Freischalten des SSH Zugangs:

Bootloader Zugriff über Ethernet

Von Haus aus kann man auch bequem über Ethernet auf den RedBoot Bootloader zugreifen. Im Auslieferungszustand der Fonera ist diese Option allerdings deaktiviert und muss zunächst konfiguriert werden.

Der aktivierte Ethernet-Zugriff ist übrigens zwingend erforderlich, um das Easy Flash Utility nutzen zu können.

mit seriellem Kabel

Falls man sich mittels seriellem Kabel verbunden hat und bereits Zugriff auf den Bootloader hat, kann man dies einfach mit den folgenden Befehlen aktivieren:

RedBoot> fconfig bootp_my_ip 169.254.255.1
RedBoot> fconfig bootp_my_ip_mask 255.255.0.0
RedBoot> fconfig boot_script_timeout 10

Weitere Details dazu findet man außerdem im OpenWrt Wiki [2].

von der Konsole

Mit einigen Tricks kann man den Zugang zum Bootloader über Ethernet Kabel aber auch aus einem laufenden System herraus einrichten.

Zuerst muss man sich mit Hilfe eines gepatchten Kernels einen Schreibzugriff auf den Flash-Speicher der Fonera verschaffen:

root@OpenWRT:~# wget http://ipkg.k1k2.de/hack/openwrt-ar531x-2.4-vmlinux-CAMICIA.lzma
root@OpenWRT:~# mtd -r -e vmlinux.bin.l7 write openwrt-ar531x-2.4-vmlinux-CAMICIA.lzma vmlinux.bin.l7

Von der Shell aus patcht man die Konfiguration des Bootloaders, so daß dieser beim Booten für 10 Sekunden auf der IP-Adresse 192.168.1.254 Port 9000 per Telnet erreichbar ist. Dazu wird die Konfiguration des Bootloaders im Flash Speicher überschrieben:

root@OpenWRT:~# wget http://ipkg.k1k2.de/hack/out.hex
root@OpenWRT:~# mtd -r -e "RedBoot config" write out.hex "RedBoot config"

Dieses Verfahren wurde von Camicia und anderen im DD-WRT Forum entwickelt und kann problemlos nachgemacht werden. Die benötigten Dateien sind alternativ auch hier zu finden: [3] + [4] und wenn wieder erreichbar auch unter [5] + [6]

Auch hierzu findet man weitere Details im OpenWrt Wiki [7].

Überschreiben des Flash-Speichers

Um ein eigenes System auf der Fonera zu installieren, muss man ein neues Root-Dateisystem und einen passenden Kernel in den Flash-Speicher des Gerätes schreiben.

Der Vorgang dauert einige Minuten und darf nicht unterbrochen werden!

Freifunk Easyflash Utility

Das AP51 EasyFlash (alternativ für neuere Version) ist ein ganz hervorragendes Utitility, mit dessen Hilfe das Flashen einer beliebigen neuen Firmware spielend leicht möglich geworden ist. Das Tool ist für Linux und für Windows als Klicki-Bunti bzw. für die Kommandozeile erhätlich. Alle Details und wie man es anwendet, steht im Readme (englisch).

Um das EasyFlash Utility nutzen zu können, muss eigentlich zunächst der Bootloader Zugriff über Ethernet aktiviert werden. Doch im Spezial-Modus macht sich das Utility einen Fehler im Bootloader zu Nutzen, um die neue Firmware direkt aufzuspielen. Das manuelle Freischalten des Bootloader Zugriffs entfällt dann. (Tatsächlich ist das Utility sogar so nett, und erledigt das nebenbei auch noch...)


Benötigt werden folgende Dateien:
Rootfs: openwrt-atheros-root.jffs2-64k (Aktuelle Version)
Kernel: openwrt-atheros-vmlinux.lzma (Aktuelle Version)

Der Spezial-Modus kann wie folgt aktiviert werden:

  • Linux/Kommandozeile: als letzten Parameter "freifunc" angeben
  • Windows: bei gedrückter Shift-Taste fünf mal auf das Freifunk Logo klicken (die Pfeile zeigen bei aktiviertem Spezial-Modus in die andere Richtung)

Flashen von der Konsole

Wie bereits im Zusammenhang mit dem Überschreiben der Bootloader Konfiguration gezeigt wurde, kann man auch von der Konsole eines laufenden Systems aus mit dem Programm mtd den Flash Speicher überschreiben. Auf diese Weise kann man einfach ein neues OpenWrt Image installieren, nachdem man es mit wget auf die Fonera übertragen hat:

root@OpenWRT:~# wget http://downloads.openwrt.org/kamikaze/8.09/atheros/openwrt-atheros-vmlinux.lzma
root@OpenWRT:~# wget http://downloads.openwrt.org/kamikaze/8.09/atheros/openwrt-atheros-root.squashfs
root@OpenWRT:~# mtd -e vmlinux.bin.l7 write openwrt-atheros-vmlinux.lzma vmlinux.bin.l7
root@OpenWRT:~# mtd -r -e rootfs write openwrt-atheros-root.squashfs rootfs

Achtung: Dieses Verfahren wurde erfolgreich getestet mit Fon Firmware 0.7.1-r1 und einem Snapshot Image. Allerdings gibt es mehrere Stimmen, die auf diese Weise ihre Geräte "zerschossen" haben. Wer kein serielles Kabel zur Hand hat, sollte vielleicht zunächst den Zugang zum Bootloader über Ethernet freischalten, um im Zweifelsfall noch handlungsfähig zu bleiben.

Flashen mit RedBoot

In den Foneras ist der OpenSource Bootloader RedBoot [8] installiert, mit dem sich u.a. der Flash Speicher überschreiben lässt.

über serielle Konsole

Wenn man über die serielle Schnittstelle verbunden ist, kann man einfach den Flash-Vorgang starten und die zu flashenden Dateien bequem mittels XModem bzw. YModem übertragen.

Es empfiehlt sich, dafür zunächst die Baudrate zu ändern, wenn man nicht nur im Schneckentempo vorran kommen möchte:

RedBoot> baudrate -b 115200

Anschließend muss man natürlich auch das Terminal Programm entsprechen umstellen, damit man dann mit dem eigentlich Flash Vorgang wie folgt fortfahren kann:

RedBoot> fis init
RedBoot> load -r -v -b %{FREEMEMLO} rootfs -m ymodem

Im Terminal-Programm wird ein "C" angezeigt und man kann die Übertragung des neuen Root-Dateisystems (Datei openwrt-atheros-2.6-root.jffs2-64k) starten.

Nachdem die Datei übertragen wurde, erstellt man eine Partition im Flash und speichert dort die übertragene Datei

RedBoot> fis create -f 0xA8030000 -l 0x00700000 rootfs

Die oben genannte Variante ist für den kernel 2.6.19.1, die nachstehende für Kernel 2.6.21.5

RedBoot> fis create -l 0x006f0000 rootfs

Nun überträgt man noch den neuen Kernel (Datei openwrt-atheros-2.6-vmlinux.lzma) und erstellt wiederum eine Partition dafür:

RedBoot> load -r -v -b %{FREEMEMLO} vmlinux -m ymodem
RedBoot> fis create -r 0x80041000 -e 0x80041000 vmlinux.bin.l7

über Ethernet

Für eine Verbindung per Ethernet muss zunächst sichergestellt werden, daß die Netzwerkkarte des Computers zum Zeitpunkt des Bootens der Fonera aktiv ist. Die automatische Netlink Überprüfung moderner Geräte macht einem hier unter Umständen einen Strich durch die Rechnung - Abhilfe schaft aber ein zwischengeschalteter Switch oder Router.

Sobald die Fonera angeschaltet wurde, hat man ca. 10 Sekunden Zeit, um sich per Telnet zu verbinden und dann durch Drücken von CTRL-C den Bootvorgang abzubrechen. Falls man das nicht rechtzeitig hinbekommt oder es anderweitig nicht akzeptiert wird, kann man auch dieses Skript verwenden. Es wird wie folgt verwendet:

perl redboot.pl <fonera_ip>

Wenn man sich per Ethernet verbunden hat, muss man die Dateien mit TFTP oder HTTP auf das Gerät übertragen.

Nachdem man mit der Fonera verbunden ist, muss zunächst eine temporäre Netzwerkkonfiguration einrichtet werden. Die Syntax lautet:

RedBoot> ip_addr -h <server_ip> -l <fonera_ip>/24

Als server_ip muss man eine IP angeben, von der die Dateien übertragen werden sollen. Die fonera_ip muss sich im selben Netzwerk befinden.

RedBoot> ip_addr -h 192.168.1.23 -l 192.168.1.254/24

Als nächstes beginnt man den eigentlichen Flash-Vorgang, erstellt eine Partition im Flash und speichert dort die übertragene Datei:

RedBoot> fis init
RedBoot> lo -r -b %{FREEMEMLO} openwrt-atheros-2.6-vmlinux.lzma
RedBoot> fi cr -e 0x80041000 -r 0x80041000 vmlinux.bin.l7

fis free zeigt den verbleibenden freien Speicher:

RedBoot> fis free
   0xA80F0000 .. 0xA87E0000

Letzeres von ersterem abziehen, im Kopf oder mit bc:

server:~# bc
obase=16
ibase=16
A87E0000 - A80F0000
6F0000

Nun überträgt man noch das neue rootfs und erstellt wiederum eine Partition dafür (wobei 0xCHANGE bei mir 0x6F0000 ist):

RedBoot> lo -r -b %{FREEMEMLO} openwrt-atheros-2.6-root.squashfs
RedBoot> fi cr -l 0xCHANGE rootfs

Alternativ kann man die Dateien auch mit HTTP auf den Router übertragen, wie u.a. hier [9] beschrieben wird.

neues System booten

Zum Schluss kann man den neuen Kernel laden und booten:

RedBoot> fis load -l vmlinux.bin.l7
RedBoot> exec

Nun sollte der Bootvorgang durchlaufen und man kann sich danach durch Drücken der Enter-Taste in das frische System einloggen.

Please press Enter to activate this console. 

Konfiguration

Nachfolgend wird die Konfiguration der Fonera als Freifunk Node mit OLSR beschrieben.

Achtung: Dieser Teil des Artikels ist nicht mehr auf dem neusten Stand und bedarf einer Überarbeitung. Außerdem ist vorgesehen, diesen Teil in einen seperaten Artikel auszugliedern.

OpenWrt konfigurieren

Viele Konfigurationseinstellungen von OpenWrt Kamikaze werden über eine generalisierte Schnittestelle vorgenommen. Alle Einstellungen werden dabei in strukturierten Textdateien gespeichert und können wahlweise über den Befehl uci oder manuell vorgenommen werden.

Passwort setzen

Als erstes muss man ein Passwort vergeben:

root@OpenWRT:~# passwd

So lange kein Passwort gesetzt wurde, kann man sich über telnet ohne Authentifzierung im System einloggen. Nach dem Setzen des Passworts wird telnet deaktiviert und man kann nur noch per SSH zugreifen.

Netzwerk einrichten

Die Konfiguration der Ethernet Schnittstelle erfolgt über die Datei /etc/config/network.

Beispiel für die Konfiguration mit uci:

root@OpenWrt:~# uci show network.lan
network.lan=interface
network.lan.ifname=eth0.0
network.lan.proto=static
network.lan.ipaddr=192.168.1.1
network.lan.netmask=255.255.255.0

root@OpenWrt:~# uci set network.lan.ipaddr="192.168.1.20"

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

root@OpenWrt:~# uci commit

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

Beispiel 1 (manuelle Konfiguration): IP-Adresse automatisch beziehen

config interface wan
        option ifname   eth0
        option proto    dhcp

Beispiel 2 (manuelle Konfiguration): IP-Adresse manuell setzen

config interface lan
       option ifname   eth0
       option proto    static
       option ipaddr   169.254.255.1
       option netmask  255.255.255.0

Eine ausführliche Beschreibung findet man im OpenWRT Wiki [10].

Um die Fonera ins Freifunk Hannover Netzwerk zu verbinden, müssen die WLAN Einstellungen (Datei /etc/config/wireless) wie folgt angepasst werden.

Beispiel (manuelle Konfiguration):

config wifi-device  wifi0
        option type     atheros
        option channel  1
        option mode     11bg
#        option distance     2000
        option diversity  0
        option txantenna  1
        option rxantenna  1

config wifi-iface
        option device   wifi0
        option mode     adhoc
        option ssid     hannover.freifunk.net
        option bssid    CA:FF:EE:CA:FF:EE 
        option bgscan   0 
        option txpower  79

Außerdem müssen die Netzwerkeinstellungen in der Datei /etc/config/network ergänzt werden:

config interface wlan
        option ifname   ath0
        option proto    static
        option ipaddr   10.2.25.65
        option netmask  255.255.0.0

DNS und DHCP einrichten

Für die richtige DNS-Auflösung empfiehlt sich die Einstellung in der Datei /etc/dnsmasq.conf nach folgendem Muster:

local=/.hannover.freifunk.net/
domain=hannover.freifunk.net
expand-hosts

resolv-file=/tmp/resolv.conf.auto
addn-hosts=/tmp/hosts_olsr

server=195.50.140.250
server=212.222.128.68

Um IP-Adressen bequem per DHCP an WLAN Clients zu vergeben, muss folgende Zeile (entsprechend der eigenen IP-Konfiguration) ergänzt werden:

dhcp-range=wlan,10.2.25.81,10.2.25.95,255.255.0.0,23m

In diesem Beispiel wird der Adressbereich 10.2.25.81/28 (14 IPs) verwendet.

Hinweise: die Konfiguriation über uci und /etc/config/dhcp funktioniert im Freifunk Context leider nicht wie erforderlich. Inzwischen wurde ein Patch für diese Einschränkung gepostet, der aber noch nicht in den offiziellen OpenWrt trunk übernommen wurde.

Weitere Informationen zur Konfiguration von dnsmasq gibt es im OpenWrt Wiki [11].

Firewall konfigurieren

Wichtig: Damit der WLAN Verkehr ungehindert weitergeleitet wird und die WLAN DHCP Clients ins Internet gelangen können, muss man folgenden Regeln in der Datei /etc/firewall.user ergänzen.

### Act as Router
iptables -A forwarding_rule -j ACCEPT

# Masquerade WLAN DHCP Clients
iptables -t nat -A POSTROUTING -s 10.2.25.81/28 -j MASQUERADE

Benutzerdefinierte Firewall Regeln können über uci oder manuell in der Datei /etc/config/firewall eingetragen werden. Die Syntax ist benutzerfreundlich und lautet:

forward:<match>:<target>[:<port>]                                             
       - Weiterleitung aller Pakete an <target> (optional <port>),
         die <match> entsprechen.
                                                                               
accept:<match>                                                                
       - Erlauben aller Pakete, die <match> entsprechen
                                                                               
drop:<match>                                                                  
       - Verwerfen aller Pakete, die <match> entsprechen

Die Optionen für <match> lauten:

src=<ip>                                                                      
       - Quelladresse <ip>                                              
                                                                               
dest=<ip>                                                                     
      - Zieladresse <ip>                                         
                                                                              
proto=<proto>                                                                 
      - Protokoll Name oder Nummer, z.B. "tcp" oder "udp"
      Wird kein Protokoll angegeben, gilt automatisch beides.
                                                                              
sport=<port(s)>                                                               
      - Quellport(s), z.B. "22", "80,443" oder "6667-6669"
                                                                              
dport=<port(s)>                                                               
      - Zielport(s)

Um z.B. eine SSH Verbindung über die WAN-Schnittstelle (Ethernet-Kabel) aufbauen zu können, muss der nachstehen Eintrag vorgenommen werden:

accept:proto=tcp dport=22

OLSR installieren

Zunächst muss die Liste der verfügbaren Pakete aktualisiert werden. Dann kann die OLSR Software einfach nachinstalliert werden.

root@OpenWRT:~# ipkg update
root@OpenWRT:~# ipkg install olsrd olsrd-mod-nameservice olsrd-mod-dyn-gw olsrd-mod-httpinfo

Eine ausführliche Beschreibung zur Verwendung von ipkg findet man u.a. hier.

OLSR konfigurieren

Für den Betrieb im Freifunk Hannover Netzwerk muss noch die Datei /etc/olsrd.conf mit folgendem Inhalt angelegt werden:

DebugLevel              0
IpVersion               4
AllowNoInt              yes
Pollrate                0.1
TcRedundancy            2
MprCoverage             7
LinkQualityFishEye      1
LinkQualityWinSize      100
LinkQualityDijkstraLimit 0 6.0
LinkQualityLevel 2
UseHysteresis no
Interface "ath0"
       {
       HelloInterval           4.0
       HelloValidityTime       72.0
       TcInterval              3.0
       TcValidityTime          216.0
       MidInterval             12.0
       MidValidityTime         216.0
       HnaInterval             12.0
       HnaValidityTime         72.0
       }
LoadPlugin "olsrd_dyn_gw.so.0.4"
      {
           PlParam     "Interval"   "40"
           PlParam     "Ping"  "194.25.2.129"
           PlParam     "Ping"  "141.1.1.1"
      }
LoadPlugin "olsrd_nameservice.so.0.2"
       {
       PlParam "name"          "AP-FON1"
       PlParam "suffix"        ".hannover.freifunk.net"
       PlParam "hosts-file"    "/tmp/hosts_olsr"
       PlParam "resolv-file"   "/tmp/resolv.conf.olsr"
       }
LoadPlugin "olsrd_httpinfo.so.0.1"
       {
       PlParam     "port"   "8080"
       PlParam     "Net"    "192.168.1.0 255.255.0.0"
       PlParam     "Net"    "10.2.0.0 255.255.0.0"
       }

Das Freigeben der Internetverbindung geschieht automatisch durch das olsrd_dyn_gw_plain Plugin. Dieser Teil ist optional.

Die Angaben zum Namen im Abschnitt olsrd_nameservice müssen entsprechend dem eigenen Node-Namen angepasst werden.

Die IP Addressen im Abschnitt olsrd_httpinfo müssen entsprechend dem eigenen Adressebereich für LAN und ggf. WLAN angepasst werden. Dieses Beispiel macht die HTTP-Infoseite von OLSR für die Netzwerke 192.168.1.0/24 und 10.2.0.0/16 verfügbar.

Damit der OLSR Daemon nach einem Neustart des Routers automatisch gestartet wird, muss man noch folgendes ausführen:

root@OpenWRT:~# /etc/init.d/olsrd enable
root@OpenWRT:~# /etc/init.d/olsrd start
Persönliche Werkzeuge