User Tools

Site Tools


doc:appunti:hardware:gl_ar150

GL-iNet GL-AR150 Smart Router

GL-AR150 GL-AR150 PCB

GL.iNet Firmware 2.22
Kernel 3.18.27
OpenWrt Chaos Calmer 15.05
LuCI 15.05-54-gfd60055
CPU Atheros AR9330 rev 1
RAM 60 Mb
Total Flash Storage 16 Mb
Free Flash Storage 7.7 Mb

Recensione

Hardware potente, software free e open source quasi al 100% (OpenWrt)

Dopo un mese di funzionamento 24 ore su 24 posso dire che il router non ha dato alcun problema di affidabilità e funzionamento. L'ho acquistato per sostituire una vecchia Fonera che aveva iniziato a bloccarsi ogni qualche giorno.

L'oggetto è molto piccolo, compresa l'antenna, ma non ha problemi a coprire il mio appartamento di circa 60 mq. Eventualmente l'antenna è sostituibile.

Il punto di forza di questo oggetto è il software OpenWrt installato. Si tratta della versione Chaos Calmer 15.05 comprensiva di interfaccia web di amministrazione LuCI. Le personalizzazioni effettuate da GL.iNet sono poche si possono disabilitare grazie all'accesso root (disponibile come nella distribuzione OpenWrt originale).

Ho usato altri apparati dove si poteva installare OpenWrt con vari trucchi, ad esempio il TP-LINK TL-WR741ND e il Linksys WRT-54G, ma questo router è decisamente superiore. Anzitutto perché OpenWrt è installato di fabbrica, poi perché ha 64 Mb di RAM e 16 Mb di flash (sono solo 16 Mb RAM e 4 Mb di flash sul TP-LINK e sul Linksys). La configurazione di default comprende l'interfaccia LuCI e il pacchetto OpenVPN e restano altri 7.7 Mb di flash libera per installare altri pacchetti.

Tra le varie funzioni custom di GL.iNet c'è una interfaccia web di amministrazione semplificata, una funzione di DNS dinamico che si appoggia a dyndns.org e myip.com.tw, la funzione di ripetitore, l'eventuale aggiornamento del firmware automatico.

Grazie all'accesso root è possibile disabilitare le funzioni non richieste modificando i file /etc/rc.local e /etc/hotplug.d/iface/23-glddns. Il router è configurato per installare pacchetti dal repository http://www.gl-inet.com/openwrt/ar71xx/2.25, i più paranoici potranno utilizzare invece uno dei mirror ufficiali OpenWrt.

Oltre alle due porte Ethernet (WAN e LAN) c'è anche uno switch hardware a due posizioni (probabilmente sarebbero tre posizioni, se si smonta il case o si allarga il foro permettendo così lo slittamento completo dello switch). Con la versione standard del software lo switch non ha alcuna funzione, ma gli smanettoni possono associare l'esecuzione di uno script all'azionamento dello stesso.

Sono disponibili anche alcune linee GPIO, utili sempre agli smanettoni per collegare altri dispositivi (ad esempio un RTC clock che imposti l'ora di sistema anche in assenza di internet).

L'unica nota negativa è l'assenza dell'alimentatore, che va acquistato a parte (connettore micro USB 5 V, come i caricabatteria dei telefonini moderni). Speriamo che l'apparecchio sia affidabile anche nel tempo.

Partizioni, memoria, ecc.

Filesystem                Size      Used Available Use% Mounted on
rootfs                    8.1M    368.0K      7.7M   4% /
/dev/root                 6.5M      6.5M         0 100% /rom
tmpfs                    29.8M    972.0K     28.9M   3% /tmp
/dev/mtdblock5            8.1M    368.0K      7.7M   4% /overlay
overlayfs:/overlay        8.1M    368.0K      7.7M   4% /
tmpfs                   512.0K         0    512.0K   0% /dev
             total       used       free     shared    buffers     cached
Mem:         61052      39044      22008        972       5552      15272
-/+ buffers/cache:      18220      42832
Swap:            0          0          0
cat /proc/mtd
dev:    size   erasesize  name
mtd0: 00040000 00010000 "u-boot"
mtd1: 00010000 00010000 "u-boot-env"
mtd2: 00fa0000 00010000 "firmware"
mtd3: 00130000 00010000 "kernel"
mtd4: 00e70000 00010000 "rootfs"
mtd5: 007e0000 00010000 "rootfs_data"
mtd6: 00010000 00010000 "art"

Prima Accensione

Collegato alla rete locale tramite la porta WAN, il router chiede un indirizzo al server DHCP. Sull'indirizzo ottenuto risponde al PING e risulta aperto solo sulla porta 83/TCP. Su tale porta c'è in ascolto un server HTTP con la procedura di inizializzazione che tuttavia non funziona. Infatti dopo averla completata non si ha accesso alla configurazione, ma viene presentata nuovamente la stessa procedura.

Collegato alla rete locale tramite porta LAN il router non usa DHCP ma ha assegnato l'indirizzo predefinito 192.168.8.1, le porte aperte risultano:

22/tcp ssh Impossibile accedere.
23/tcp telnet Accesso root senza password.
53/tcp domain dnsmasq
80/tcp http lighttpd
83/tcp mit-ml-dev lighttpd
139/tcp netbios-ssn smbd
445/tcp microsoft-ds smbd

La procedura web di inizializzazione ha funzionato solo richiamata dalla porta 80, lato LAN. Consiste di tre passaggi: scelta della lingua (cinese o inglese), fuso orario e password:

GL-AR150 Welcome Screen 1 GL-AR150 Welcome Screen 2 GL-AR150 Welcome Screen 3

Al termine della procedura first-time:

  • L'accesso telenet viene disabilitato e diventa possibile accedere via ssh con login root e la password scelta.
  • Sulla porta 80 si trova il normale login all'interfaccia di configurazione web.
  • Sulla porta 83 si trova un accesso all'interfaccia web, che richiede oltre alla password anche il numero seriale del router, secondo le impostazioni predefinite questa è l'unica porta aperta dal lato WAN. Con il firmware 2.22 l'accesso non funzionava, segnalava login errato nonostante si inserisse la password e il s/n corretti.

Oltre all'interfaccia di configurazione custom di GL.iNet è disponibile anche l'interfaccia LuCI standard di OpenWrt, è sufficiente puntare il browser sull'indirizzo http://192.168.8.1/cgi-bin/luci oppure cliccare sul link Advanced settings. L'interfaccia LuCI non è accessibile dalla porta 83.

Impostazioni predefinite

L'hardware include tre interfacce di rete: eth0, eth1 e wlan0 (hanno tutte lo stesso identico MAC address).

eth0 Porta WAN, configurata con DHCP client
eth1 Porta LAN, configurata in bridge con wlan0
wlan0 Configurata in bridge con eth1
br-lan Bridge di eth1 e wlan0, IP 192.168.8.1
Interfaccia Servizio Note
WAN http://<ipaddress>:83/ Amministrazione web con password e s/n
LAN http://192.168.8.1:83/ Amministrazione web con password e s/n
LAN http://192.168.8.1/ Amministrazione web con password
LAN ssh://192.168.8.1 Accesso SSH root con password
LAN http://192.168.8.1/cgi-bin/luci Interfaccia web LuCI, standard OpenWrt
LAN DHCP Server DHCP per clienti Ethernet e WiFi

Aggiornamento Firmware

Dall'interfaccia web è possibile procedere all'aggiornamento del firmware, nel nostro caso siamo passati dalla versione 2.22 alla 2.25. Si tratta di un aggiornamento GL.iNet, la versione OpenWrt su cui si basa rimane la stessa 15.05.

Viene scaricato il file http://www.gl-inet.com/firmware/ar150/v1/openwrt-ar150-2.25.bin, che viene installato dopo averlo salvato temporaneamente in /tmp/firmware.img.

Repository OpenWrt

Il repository OpenWrt a cui il router fa riferimento è http://www.gl-inet.com/openwrt/ar71xx/2.25/, dove 2.25 è la versione del firmware GL.iNet installata.

Per aggiornare la lista dei pacchetti presenti, per vedere quelli installati e quelli installabili:

opkg update
opkg list-installed
opkg list

Usare il repository OpenWrt originale

Per utilizzare il repository ufficiale OpenWrt invece di quello custom GL.iNet si modifca il file /etc/opkg/distfeeds.conf, mettendo:

src/gz chaos_calmer_base        http://downloads.openwrt.org/chaos_calmer/15.05.1/ar71xx/generic/packages/base
src/gz chaos_calmer_luci        http://downloads.openwrt.org/chaos_calmer/15.05.1/ar71xx/generic/packages/luci
src/gz chaos_calmer_management  http://downloads.openwrt.org/chaos_calmer/15.05.1/ar71xx/generic/packages/management
src/gz chaos_calmer_packages    http://downloads.openwrt.org/chaos_calmer/15.05.1/ar71xx/generic/packages/packages
src/gz chaos_calmer_routing     http://downloads.openwrt.org/chaos_calmer/15.05.1/ar71xx/generic/packages/routing
src/gz chaos_calmer_telephony   http://downloads.openwrt.org/chaos_calmer/15.05.1/ar71xx/generic/packages/telephony

Quindi si esegue il tradizionale

opkg update
opkg list

Se nel listing risultano pacchetti non aggiornati rispetto al repository potrebbe essere necessario editare manualmente il file /usr/lib/opkg/status.

DNS Dinamico

GL.iNet offre un servizio di DNS dinamico incluso nel router. Il funzionamento è più o meno il seguente:

  1. Quando si connette ad internet, il router “chiama casa” e comunica il proprio codice identificativo (del tipo nm31567), l'indirizzo IP della porta WAN (es. quello assegnato via DHCP dal router ADSL) e l'indirizzo IP pubblico utilizzato per navigare (es. quello del router ADSL). L'identificativo è riportato come link in basso nella schermata iniziale della configurazione web.
  2. Puntando il browser all'indirizzo http://nm31567.gl-inet.com/ si viene rediretti in due modi differenti:
    • Se la richiesta proviene dallo stesso indirizzo IP pubblico si presuppone che provenga dalla stessa rete locale, quindi la ridirezione avviene sull'IP WAN, porta 83.
    • Se la richiesta proviene da altro IP pubblico allora la ridirezione avviene verso l'IP pubblico, porta 83. Si presuppone che il router ADSL ridiriga quella porta sul GL-AR150.

Rivelazione di informazioni (privacy, etc.)

Il router durante il normale funzionamento rivela alcune informazioni private a siti esterni. Ecco quello che è stato possibile appurare con il firmware 2.25.

Indirizzo IP pubblico

Per fornire il servizio di DNS dinamico il router cerca di determinare il proprio indirizzo IP pubblico e comunica alcune informazioni a www.gl-inet.com:

  • Script eseguito: /usr/lib/ddns/glddnsupdater.sh.
  • Eseguito al momento dell'attivazione di una interfaccia di rete, tramite /etc/hotplug.d/iface/23-glddns.
  • URL a cui vengono inviate le informazioni: http://www.gl-inet.com/ddnsregister.php
  • Informazioni trasmesse:
    • ddns, identificativo DDNS, 7 caratteri estratti da /dev/mtd6, es. nm31567.
    • code, codice DDNS, 16 caratteri esadecimali estratti da /dev/mtd6.
    • current_ip, indirizzo IP pubblico ricavato da uno dei due servizi sopra indicati.
    • port, porta TCP dell'interfaccia web lato WAN.
    • wanip, indirizzo IP dell'interfaccia WAN.
    • model, modello del router da /proc/cpuinfo, es ar150.

:!: Per disabilitare questa funzione è sufficiente rimuovere o commentare lo script /etc/hotplug.d/iface/23-glddns. Lo script di aggiornamento DNS dinamico viene eseguito quando l'interfaccia wan si attiva, e resta in esecuzione in modo permanente.

Mwan3 e ICMP (ping) flood

Analizzando il traffico di rete si vede un flusso costante di ping (pacchetti ICMP echo request), circa 4 interrogazioni ogni 5 secondi verso i DNS di Google e di OpenDNS. Il flusso dati non è enorme (circa 0.7 kbps), ma sicuramente non necessario. Il processo che genera questo traffico è /usr/sbin/mwan3track installato dal pacchetto mwan3, probabilmente inutile se non si hanno connessioni internet multiple.

Vedere la pagina mwan3, circa le multiple WAN connections.

:!: Se non si usano connessioni WAN multiple è possibile disinstallare il pacchetto principale mwan3, il pacchetto luci-app-mwan3 (che nell'interfaccia LuCI di amministrazione web mette a disposizione la pagina NetworkLoad balancing) e il file di configurazione:

opkg remove luci-app-mwan3 mwan3
rm /etc/config/mwan3

Altro software GL.iNet non necessario

Avviati da /etc/rc.local:

  • /usr/bin/glautoupdater Esegue l'aggiornamento automatico del firmware (se abilitato). Il primo check viene fatto tre ore dopo l'accensione, poi una volta al giorno.
  • /usr/bin/gl_health Secondo questo post è il demone usato per connettersi ad altre stazioni con funzione di ripetitore, non dovrebbe avere implicazioni di privacy, ecc. Non è chiaro tuttavia il motivo per cui includa pezzi di altri software, ad esempio include pezzi di wpa_cli. Le funzioni di ripetitore dovrebbero essere quelle descritte in questo articolo.

:!: L'aggiornamento automatico glautoupdater si può disabilitare dall'interfaccia web, oppure si rimuove da /etc/rc.local.

:!: Il demone gl_health si disabilita commentanto la riga relativa in /etc/rc.local. Non usando la funzione di ripetitore sembra che non ci siano controindicazioni.

Repository OpenWrt

Un'altro aspetto sensibile per la sicurezza è l'utilizzo di un repository OpenWrt proprietario, nel file di configurazione /etc/opkg/distfeeds.conf troviamo infatti:

src/gz chaos_calmer_base http://www.gl-inet.com/openwrt/ar71xx/2.25/packages/base
src/gz chaos_calmer_luci http://www.gl-inet.com/openwrt/ar71xx/2.25/packages/luci
src/gz chaos_calmer_management http://www.gl-inet.com/openwrt/ar71xx/2.25/packages/management
src/gz chaos_calmer_packages http://www.gl-inet.com/openwrt/ar71xx/2.25/packages/packages
src/gz chaos_calmer_oldpackages http://www.gl-inet.com/openwrt/ar71xx/2.25/packages/oldpackages
src/gz chaos_calmer_routing http://www.gl-inet.com/openwrt/ar71xx/2.25/packages/routing
src/gz chaos_calmer_telephony http://www.gl-inet.com/openwrt/ar71xx/2.25/packages/telephony

Secondo le dichiarazioni di uno sviluppatore si dovrebbe trattare una OpenWrt standard con applicate alcune patch pubbliche.

Modifiche alla configurazione standard

Apertura porta SSH e HTTP su interfaccia WAN

Network ⇒ Firewall ⇒ Traffic Rules ⇒ Open ports on router
Le impostazioni si trovano in /etc/config/firewall

Accesso con chiave SSH

System ⇒ Administration
Le chiavi vengono messe in /etc/dropbear/authorized_keys

Password WiFi

Network ⇒ WiFi ⇒ Edit ⇒ Wireless Security
Le impostazioni vanno in /etc/config/wireless

Indirizzi IP riservati via DHCP

Network ⇒ DHCP and DNS ⇒ Static Leases
Le impostazioni vanno in /etc/config/dhcp

Indirizzo LAN, DHCP e WiFi

Network ⇒ Interfaces ⇒ LAN ⇒ Edit
Le impostazioni vanno in /etc/config/network, /etc/config/dhcp e /etc/config/wireless

Regole iptables aggiuntive

:!: Ad esempio si vuole mettere una regola per consentire il traffico dalla LAN cablata Ethernet (dal punto di vista del GL-AR150 si tratta della wan) verso gli host connessi in WiFi (per lo smart router si tratta della lan).

Network ⇒ Firewall ⇒ Traffic Rules ⇒ New forward rule
Le impostazioni vanno in /etc/config/firewall

config rule                  
        option target 'ACCEPT'
        option src 'wan'       
        option dest 'lan'
        option name 'Access-WiFi-Hosts'
        option enabled '0'
        option family 'ipv4'
        option src_ip '192.168.3.0/24'

Chiave RSA

Il client ssh è Dropbear, per generare la chiave RSA si usa dropbearkey (il formato non è lo stesso di ssh-keygen):

dropbearkey -f .ssh/id_dropbear -t rsa -s 2048

La parte pubblica della chiave viene mostrata a video, non salvata. Si consiglia di salvarla nel file $HOME/.ssh/id_dropbear.pub. È comunque possibile estrarla con:

dropbearkey -y -f .ssh/id_dropbear

Configurazione OpenVPN

Purtroppo GL.iNet ha aggiunto una gestione di OpenVPN con file di configurazione e script custom (cioè non quelli predefiniti di OpenWRT).

In particolare esiste un servizio custom GL.iNet chiamato /etc/init.d/startvpn che fa riferimento ad un file di configurazione custom /etc/config/glconfig. Se non si abilita OpenVPN all'interno di tale servizio, ad ogni reboot il demone openvpn viene disabilitato e non sarà in esecuzione.

È quindi necessario abilitare OpenVPN secondo GL.iNet:

uci set glconfig.openvpn.enable=1
uci commit glconfig

Verificare che l'opzione sia abilitata visualizzando il contenuto del file /etc/config/glconfig oppure con il comando:

uci get glconfig.openvpn.enable

Si può verificare che il servizio attivo è solo startvpn (di GL.iNet) e non openvpn (default di OpenWRT):

/etc/rc.d/S90startvpn -> ../init.d/startvpn

Probabilmente la soluzione più pulita sarebbe quella di disabilitare il servizio custom di GL.iNet e abilitare quello standard di OpenWRT/OpenVPN:

/etc/init.d/startvpn disable
/etc/init.d/openvpn enable
/etc/init.d/openvpn start

Switch

Dalla documentazione (immagine del PCB sopra) pare che lo switch abbia tre posizioni, ma viene probabilmente limitato a due dalla dimensione del foro nel case, infatti risulta possibile solo lo stato GPIO-8 hi e GPIO-8 low.

Con la configurazione predefinita del software pare che la posizione dello switch sia ignorata. È possibile interrogarne lo stato verificando il valore del GPIO BTN_8:

cat /sys/kernel/debug/gpio
GPIOs 0-29, ath79:
 gpio-0   (gl_ar150:wlan       ) out hi
 gpio-6   (gl_ar150:usbpow     ) out hi
 gpio-7   (BTN_7               ) in  lo
 gpio-8   (BTN_8               ) in  hi
 gpio-11  (reset               ) in  lo
 gpio-13  (gl_ar150:lan        ) out lo
 gpio-15  (gl_ar150:wan        ) out hi

Il sistema fornisce come aggancio lo script /etc/rc.button/BTN_8 che viene eseguito ad ogni cambio di stato dello switch.

Aggiornamento Software

Versione GL.iNet Sistema Operativo
2.271 Lede 17.01.4
3.012 OpenWrt 18.06.1

Nella versione 3.012 ci sono i seguenti file custom GL.iNet da considerare:

  • /etc/rc.local esegue /usr/bin/glautoupdater e /usr/bin/gl_health
  • /etc/hotplug.d/iface/30-gl-tertf
  • /etc/init.d/gl_monitor servizio che avvia /usr/bin/gl_monitor.
  • /etc/init.d/startvpn servizio avviato se uci get glconfig.openvpn.ovpn è diverso da zero (file di configurazione /etc/config/glconfig).

Web References

doc/appunti/hardware/gl_ar150.txt · Last modified: 2023/09/11 10:36 by niccolo