Table of Contents

La Fonera

La Fonera è l'access point wireless su cui si basa l'iniziativa di FON, si tratta di una rete di punti di accesso WiFi con una organizzazione mista comunitaria/commerciale.

Leggete questo articolo di Marco Calamari (e quelli che lo hanno preceduto) per un'anlisi dell'aspetto giuridico, tecnico e sociale dell'iniziativa.

Citando l'articolo: L'hardware WRT è stato sostituito da un hardware dedicato, chiamato Fonera che è sostanzialmente equivalente a livello di sistema, ma non è più accessibile dal suo proprietario, che non può accedervi come amministratore, non può verificarne l'uso e non può controllare l'aggiornamento del software.

Per quanto mi riguarda condivido abbastanza le idee di Marco, tuttavia ritengo buona una iniziativa che promuove la condivisione del proprio accesso internet su base comunitaria. Inoltre - a patto di riuscire a liberare la propria Fonera e a prenderne il controllo, è possibile decidere a quale comunità fare riferimento. Se la sedicente FON Community ci dovesse sembrare non più adatta, nessuno ci vieta di puntare La Fonera verso un server radius alternativo e cambiare comunità.

Quindi il mio consiglio è di usare La Fonera, ma solo se si riesce ad hackerarla e a prenderne il controllo. Happy hacking.

Caratteristiche tecniche

This is the boot log (and more) from La Fonera.

Entrare via ssh

La configurazione di fabbrica non prevede che il server ssh sia in esecuzione, inoltre la porta ssh è chiusa con delle regole di firewall. Con un opportuno hack si apre la porta 22 TCP e si avvia il demone ssh dropbear. Avendo una release 0.7.1-1 del firmware ho usato queste istruzioni (qui una copia locale).

Anche in assenza di un DHCP server la Fonera imposta un indirizzp IP 169.254.255.1 su eth0:1. Dopo aver aperto il firewall sulla porta 22 ed aver attivato il server dropbear in modo permanente (qui le istruzioni) si può accedere via ssh. La password di default per l'utente root è admin:

# ssh root@169.254.255.1
root@169.254.255.1's password: admin

BusyBox v1.1.3 (2006.11.21-19:49+0000) Built-in shell (ash)
Enter 'help' for a list of built-in commands.

 _______  _______  _______
|   ____||       ||   _   |
|   ____||   -   ||  | |  |
|   |    |_______||__| |__|
|___|

 Fonera Firmware (Version 0.7.1 rev 1) -------------
  *
  * Based on OpenWrt - http://openwrt.org
  * Powered by FON - http://www.fon.com
 ---------------------------------------------------
root@OpenWrt:~# id
uid=0(root) gid=0(root)
root@OpenWrt:~#

Le eventuali authorized_keys vanno messe in /etc/dropbear/authorized_keys.

Entrare via seriale in RedBoot

RedBoot è il software utilizzato da La Fonera per il bootstrap. Questo dispone anche di un ambiente command line utilizzabile per aggiornare il contenuto della memoria flash, per configurare il processo stesso di boot, ecc. Purtroppo pare che il prompt di RedBoot non sia raggiungibile ne La Fonera standard via porta Ethernet; è necessario accedere alla porta seriale integrata ne La Fonera.

fonera_serial.jpg Per raggiungere la porta seriale bisogna aprire la Fonera togliendo le due viti nascoste dai piedini di gomma, lato led. La seriale è a 3.3 volt quindi c'è bisogno di un adattatore per collegarla al PC, di quelli basati sul chip MAX232. Nella foto c'è la piedinatura della seriale, qui trovate un articolo dettagliato sulla procedura. La Fonera imposta la seriale a 9600 8N1 senza controllo di flusso, sul PC collegato è possibile utilizzare il programma minicom.

Avviando la Fonera, sulla seriale appare la sequenza di boot che è interrompibile con Ctrl-C per arrivare al prompt RedBoot>.

In questo esempio viene riconfigurato il processo di boot, in particolare si aumenta la pausa di attesa da 1 a 5 secondi, si configura un indirizzo IP di default (indirizzo IP utilizzato da RedBoot, non dal sistema quando La Fonera è avviata!), ecc:

RedBoot> fconfig
Run script at boot: true
Boot script:
.. fis load -l vmlinux.bin.l7
.. exec
Enter script, terminate with empty line
>> fis load -l vmlinux.bin.l7
>> exec
>>
Boot script timeout (1000ms resolution): 10
Use BOOTP for network configuration: false
Gateway IP address:
Local IP address: 169.254.255.1
Local IP address mask: 255.255.0.0
Default server IP address: 169.254.255.46
Console baud rate: 9600
GDB connection port: 9000
Force console for special debug messages: false
Network debug at boot time: false
Update RedBoot non-volatile configuration - continue (y/n)? y
... Erase from 0xa87e0000-0xa87f0000: .
... Program from 0x80ff0000-0x81000000 at 0xa87e0000: .
RedBoot>

La configurazione di RedBoot può essere salvata come file binario entrando via ssh su una Fonera avviata normalmente. Anzitutto verificare le label delle immagini disponibili e i corrispondenti device MTD (memory technology device):

root@OpenWrt:~# cat /proc/mtd
dev:    size   erasesize  name
mtd0: 00030000 00010000 "RedBoot"
mtd1: 006f0000 00010000 "rootfs"
mtd2: 00570000 00010000 "rootfs1"
mtd3: 00010000 00010000 "config"
mtd4: 000b0000 00010000 "vmlinux.bin.l7"
mtd5: 0000f000 00010000 "FIS directory"
mtd6: 00001000 00010000 "RedBoot config"
mtd7: 00010000 00010000 "board_config"

Quindi copiare l'intero block device in un file temporaneo:

root@OpenWrt:~# dd if=/dev/mtdblock/6 of=/tmp/RedBoot_config

Il file ottenuto - che è una copia esatta dell'immagine flash - può essere trasferito via scp.

FIXME Come modificare l'immagine entrando via ssh invece che dal prompt RedBoot? Per ogni futura evenienza qui abbiamo i file compressi della configurazione RedBoot originale redboot_config.orig.gz) e di quella modificata - indirizzo IP e altro come riportato sopra redboot_config.gz. Scompattarli prima di usarli.

Qui alcuni appunti su come sostituire il firmware de La Fonera.

Gestione web

Le pagine di gestione web non rispondono via Ethernet all'indirizzo IP ottenuto via DHCP (eth0), rispondono invece all'indirizzo predefinito http://169.254.255.1/.

L'account/password predefiniti per l'accesso sono admin/admin.

Auto update (la Fonera calling home)

In questa pagina un'analisi parziale di cosa fa La Fonera appena accesa.

Allo scoccare di ogni ora - come previsto da /etc/crontabs/root - La Fonera esegue lo script /bin/thinclient cron. Tramite una connessione ssh invia al server download.fon.com alcune informazioni sulla Fonera stessa, preleva lo script /tmp/.thinclient.sh e lo esegue. Le informazioni inviate sono il MAC address della scheda Ethernet e di quella Wifi, la versione del firmware. Ecco in pratica il comando che esegue lo scambio dati:

echo "mode='cron' wlmac='$WLMAC' mac='$ETMAC' fonrev='$FONREV' firmware='$FIRMWARE'" \
    | ssh -T -p 1937 -i /etc/dropbear/key openwrt@download.fon.com \
    > /tmp/.thinclient.sh

Grazie all'hack visto in precedenza lo script /tmp/.thinclient.sh non verrà eseguito.

Le azioni che avrebbe eseguito di volta in volta sono l'aggiornamento del firmware, la modifica di alcuni parametri di configurazione, ecc.

Interessante è la modalità di aggiornamento della configurazione:

  1. L'utente fonero si collega a www.fon.com da una qualunque connessione internet.
  2. Effettua il login con le proprie credenziali.
  3. Imposta nuovi parametri di configurazione del proprio access point Fonera.
  4. Al successivo “calling home” de La Fonera, questa preleva lo script e lo esegue, rendendo attiva la nuova configurazione.

Qui di seguito alcuni estratti dallo script /tmp/.thinclient.sh che ho potuto osservare.

Download e installazione di un aggiornamento

Poiché esiste una versione aggiornata del software, automaticamente viene tentato l'aggiornamento:

cd /tmp
wget http://download.fon.com/firmware/update/0.7.1/1/upgrade.fon
/bin/fonverify /etc/public_fon_rsa_key.der /tmp/upgrade.fon
rm -f /tmp/.thinclient.sh
exit

Modifica del portale pubblico

Dal portale www.fon.con, sezione Personalize your FON Access Portal, ho impostato il sito web che voglio rendere accessibile da La Fonera anche agli utenti non autenticati. Dopo qualche minuto La Fonera ha ricevuto la nuova configurazione:

# begin # set /etc/chilli.conf
if [ -L /etc/chilli.conf ]
then
        rm -f /etc/chilli.conf
        cp /rom/etc/chilli.conf /etc/chilli.conf
        echo "uamallowed login.fon.com,88.57.16.26" >> /etc/chilli.conf
else
        grep "^uamallowed login.fon.com" /etc/chilli.conf
        CHECK=$?
        if [ "0" -eq "$CHECK" ]
        then
                sed -e 's/^uamallowed login.fon.com,.*$/uamallowed \
                    login.fon.com,88.57.16.26/' /etc/chilli.conf > /tmp/chilli.conf
                mv /tmp/chilli.conf /etc/chilli.conf
        elif [ "1" -eq "$CHECK" ]
        then
                echo "uamallowed login.fon.com,88.57.16.26" >> /etc/chilli.conf
        fi
fi
killall -HUP chilli
# end

In pratica viene aggiornato il contenuto del file /etc/chilli.conf.

Se si desidera aggiungere uno o più siti internet navigabili liberamente collegandosi alla Fonera senza fare login, bisogna aggiungere una riga al file /etc/chilli.conf tutte le volte che viene rigenerato dallo script /etc/init.d/N50chillispot. Ad esempio si aggiunge alla riga 93:

cat /etc/chilli.conf.local >> $TMP_C

e si fornisce un file /etc/chilli.conf.local che contiene:

uamallowed www.beppegrillo.it,it.wikipedia.org,en.wikipedia.org,www.openstreetmap.org

Aggiorna la banda condivisa

Sempre da www.fon.com, sezione Configure your FON Social Router, ho impostato la quantità di banda da condividere con altri foneri, dopo pochi minuti ecco arrivare la nuova configurazione:

# begin # set bandwidth
awk -v cfgfile="/etc/config/qos" \
    -v updatestr="hotspot.enabled=1;hotspot.upload=512;hotspot.download=128" \
    -f /usr/lib/webif/uci-update.awk -f - > /etc/config/qos.new <<EOF
BEGIN {
        cfg = read_file(cfgfile)
        print update_config(cfg, updatestr)
}
EOF
if [ $? -eq 0 ]; then
        mv /etc/config/qos.new /etc/config/qos
        qos-stop
        qos-start
else
        rm /etc/config/qos.new
fi
# end # set bandwidth

In pratica viene modificato il file /etc/config/qos nella sezione

config interface hotspot
        option classgroup       "Default"
        option enabled          1
        option upload           512
        option download         128
        option device           tun0

Change Public and Private SSID

The private and public ssid are store into /etc/config/fon:

# begin # setssidprivate
awk -v cfgfile="/etc/config/fon" -v "updatestr=private.essid=MyPlace" \
    -f /usr/lib/webif/uci-update.awk -f - > /etc/config/fon.new <<EOF
BEGIN {
        cfg = read_file(cfgfile)
        print update_config(cfg, updatestr)
}
EOF
if [ $? -eq 0 ]; then
        mv /etc/config/fon.new /etc/config/fon
        sleep 2
        ifup lan
else
        rm /etc/config/fon.new
fi
# end # set ssid fonera

# begin # set ssid fonera
awk -v cfgfile="/etc/config/fon" -v "updatestr=public.essid=PIPPO" \
    -f /usr/lib/webif/uci-update.awk -f - > /etc/config/fon.new <<EOF
BEGIN {
        cfg = read_file(cfgfile)
        print update_config(cfg, updatestr)
}
EOF
if [ $? -eq 0 ]; then
        mv /etc/config/fon.new /etc/config/fon
        iwconfig ath0 essid FON_'PIPPO'
else
        rm /etc/config/fon.new
fi
# end # set ssid fonera

The relevant section into /etc/config/fon:

config wifi public
        option essid            'PIPPO'

config wifi private
        option essid            'MyPlace'
        option encryption       'wpa'
        option wpa_crypto       'tkip'
        option password         'mySecret'
#       option  password        $(get_serial)

Riconfigura il client RADIUS

Riconfigura il client radius utilizzato da Chillispot, la configurazione viene salvata in /etc/chilli.conf:

# begin setwurl065
/etc/init.d/N50chillispot radconfig
killall -HUP chilli
# end setwurl065

Aggiunta di un account locale

Gli account locali per l'access point pubblico (sul portale Fon sono chiamati Amici e Famiglia) vengono messi nel file /etc/localusers, sia il nome che la password sono criptati. Dalla versione 0.7.2 in poi invece gli account vengono messi in /etc/config/localusers e sono memorizzati in chiaro:

version=$(cat /etc/fon_version)
        rm -f /etc/localusers
        if [ "$version" = "0.7.0" ] || [ "$version" = "0.7.1" ]
then
        echo "\$1\$\$O2DI1tGtZpa27q.GYFA791:\$1\$\$m/T7G8T7wTfKprlS15Dwk0" >> /etc/localusers
else
        echo "ospite:SuperSecret" >> /etc/config/localusers
fi
        killall -HUP chilli > /dev/null 2>&1

Structure of a FON archive

Questo è uno dei file upgrade.fon (19 kb) che La Fonera avrebbe scaricato e installato; la dimensione limitata del file, ma soprattutto i primi 4 byte del file che contengono la stringa FON4, identificano il file come un FON hotfix v2 archive.

Invece dal sito www.fon.com si può scaricare il firmware 0.7.1.2, l'ho copiato qui fonera_0.7.1.2.fon (1.8 Mb), ma non l'ho installato visto che non contiene miglioramenti significativi. I primi 4 byte del file contengono la stringa FON3, che lo identifica come FON reflash v2 archive.

Entrambi i file sono degli archivi .tar.gz, firmati con chiave rsa e alcune informazioni aggiuntive in testa al file:

A FON archive contains the following data:

Offset Bytes Contents Note
0 4 Fon archive type FON3 = FON reflash v2 archive, FON4 = FON hotfix v2 archive
4 3 Offset Offset of actual data (length of the signature)
7 $OFFSET Signature RSA signature
$OFFSET + 7 To end Data Archive in tar gzip format

The .tar.gz archive is checked against the FON public RSA key with the following command:

foncheckrsa /etc/public_fon_rsa_key.der $SIGNATURE_FILE $TAR_FILE

If the check is successfull, the archive is extracted and the upgrade script contained in it, is executed.

Here it is also the original signed fonera_0.7.1.1.fon firmware. If your firmware cannot be unlocked, you can try to downgrade to 7.1.1 in some way. This is left as an exercise for the reader :-)

Here you can find a simple shell script fon_unpack, which extracts the signature and the .tar.gz archive from a .fon file.

Interfacce di rete

In condizioni normali di funzionamento queste sono le interfacce di rete attive su La Fonera:

Ifname Default IP Note
ath0 Wireless pubblico (ESSID FON_AP). Viene attivato solo dopo che ha funzionato l'heartbeat con download.fon.com. L'hotspot in realtà funziona sull'interfaccia tun0.
ath1 192.168.10.1/24 Wireless privato (ESSID MyPlace) protetto da WPA. Sempre attivo.
eth0 10.0.1.225/16 Interfaccia Ethernet, configurata dal server DHCP nel nostro caso.
eth0:1 169.254.255.1/16 Indirizzo alternati vo su Ethernet, sempre attivo.
lo 127.0.0.1/8 Indirizzo loopback
tun0 192.168.182.1/24 Viene attivata quando La Fonera ha accesso a internet, è l'interfaccia uplink di Chillispot usata per consentire la navigazione tramite l'hotspot pubblico. Su questa interfaccia è attivo un DHCP server per i client dell'hotspot.
wifi0 Il contatore RX/TX si incrementa quando c'è traffico sul wireless.
    /------ ath1 (Private WiFi, 192.168.10.1/24, DHCP server)
    |
    |------ tun0 (Public WiFi, 192.168.182.1/24, DHCP server)
    |
    |
+--------+
|        |
| Fonera |------ eth0 (WAN Internet connection, DHCP client or static address)
|        |  |
+--------+  \--- eth0:1 (169.254.255.1/16)

Configurazione WPA

La configurazione WPA è contenuta nel file /tmp/hostapd.conf:

interface=ath1
driver=madwifi
debug=0
eapol_key_index_workaround=1
wpa=1
wpa_pairwise=TKIP
wpa_passphrase=**********
wpa_group_rekey=3600

Collegamento di un client

Abbiamo provato come client un Asus EeePC, configurando la connessione dal pannello Connessioni di rete. Tutto funziona bene impostando i parametri:

Modalità Infrastructure
Canale Any
Tipo di codifica WPA
Key *********
Metodo di config. DHCP

La gestione della chiave WPA viene affidata al programma wpa_supplicant e al file di configurazione /etc/wpa_supplicant.conf.ath0, il cui contenuto è qualcosa del genere:

ctrl_interface=/var/tmp/wpa_supplicant
network={
        ssid="MyPlace"
        key_mgmt=WPA-PSK
        psk=**********************
}

Il significato dei parametri utilizzati sono:

ctrl_interface Socket di controllo per comunicare col programma, usato ad esempio dal programma wpa_cli(1).
ssid SSID of the access point to associate to.
key_mgmt Key management method: WPA-PSK, WPA-EAP, IEEE8021X, NONE.
psk Pre shared key.

I comandi che vengono eseguiti dall'interfaccia grafica sono più o meno questi:

wpa_passphrase MyPlace ******** > /etc/wpa_supplicant.conf.ath0
# Add ctrl_interface and key_mgmt to /etc/wpa_supplicant.conf.ath0:
vi /etc/wpa_supplicant.conf.ath0
iwconfig ath0 mode Managed
wpa_supplicant -Bt -i ath0 -c /etc/wpa_supplicant.conf.ath0 -D madwifi -dd

From the wpa_supplicant(8) man page:

-Bt Be daemon and include timestamp into log.
-i ath0 Use interface ath0.
-D madwifi Use madwifi driver.
-dd Be more verbose.

Problema WPA: EAPOL versione 2

La funzione di access point de La Fonera è gestita dal software hostap. Un problema comunemente riscontrato è che la versione di EAPOL (Extensible Authentication Protocol) annunciata è la 2; molti dei software client (WPA supplicant) implementano solo la versione 1 e non gestiscono correttamente questa situazione, di fatto non riuscendo a stabilire una connessione.

Configuration files

/etc/config/fon

Network interface configuration, WiFi configuration, etc. In this excerpt the section relative to the Ethernet interface (called WAN because it connects with the internet) configured with a static IP address:

config network wan
        option mode     'static'
        option ipaddr   '192.168.2.16'
        option netmask  '255.255.255.0'
        option gateway  '192.168.2.2'
        option dns      '192.168.2.2'

Configuring the Fonera for a dynamic (DHCP) IP address we have this configuration file:

config network wan
        option mode     'dhcp'
        option ipaddr   '192.168.2.16'
        option netmask  '255.255.255.0'
        option gateway  '192.168.2.2'
        option dns      '192.168.2.2'

Accesso WiFi pubblico

La funzione di accesso WiFi pubblico su La Fonera viene gestito tramite il software ChilliSpot. L'access point con SSID pubblico (nome predefinito FON_AP) è aperto a tutti senza protezione, fornisce automaticamente - tramite servizio DHCP - un indirizzo IP, il default gateway e un server DNS a tutti i client WiFi che si associano. Tuttavia ogni servizio viene inibito fino a che il client non ha effettuato login su un server radius. Ogni tentativo di navigazione web viene intercettato e rediretto automaticamente su una apposita pagina web (captive portal) che richiede appunto le credenziali di login.

File Download

Every archive is compressed with gzip for easy storing in this Wiki. Expand it with gunzip(1).

Additional packages from the OpenWrt Kamikaze Mips distribution can be downloaded from:

here a local copy of some packages I installed:

Haking la Fonera

Prima puntata

Seconda puntata

Terza puntata

Altri hack