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.
This is the boot log (and more) from La Fonera.
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
.
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.
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.
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.
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.
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:
Qui di seguito alcuni estratti dallo script /tmp/.thinclient.sh
che ho potuto osservare.
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
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
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
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 utilizzato da Chillispot, la configurazione viene salvata in /etc/chilli.conf
:
# begin setwurl065 /etc/init.d/N50chillispot radconfig killall -HUP chilli # end setwurl065
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
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.
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)
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
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. |
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.
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'
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.
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: