====== GL-iNet GL-AR150 Smart Router ====== {{gl-ar150.jpg?direct&300|GL-AR150}} {{ar150_marks_800.jpg?direct&300|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 [[http://www.gl-inet.com/docs/mini/repeater_manager/|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:gl-ar150_welcome1.png?direct&200|GL-AR150 Welcome Screen 1}} {{.:gl-ar150:gl-ar150_welcome2.png?direct&200|GL-AR150 Welcome Screen 2}} {{.:gl-ar150:gl-ar150_welcome3.png?direct&200|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://: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: - 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. - 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''**. * Servizi contattati: **http://checkip.dyndns.org** e **http://myip.com.tw/** * 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 [[https://wiki.openwrt.org/doc/howto/mwan3|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 //Network// => //Load 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 [[https://www.gl-inet.com/forums/topic/any-security-concerns/#post-32524|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 [[https://www.gl-inet.com/forums/topic/firmware-v2-1-road-warriors-wisp-repeater-auto-connect/|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 [[https://www.gl-inet.com/forums/topic/any-security-concerns/#post-32524|dichiarazioni di uno sviluppatore]] si dovrebbe trattare una OpenWrt standard con applicate alcune [[https://github.com/domino-team/openwrt-cc/tree/master/patches|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 ===== * [[http://www.gl-inet.com/docs/|GL.iNet Documentation]] * [[http://cocoontech.com/forums/blog/29/entry-431-tweaking-a-tp-link-tl-wr710n-glinet-6416a-nexx-wt1320-microrouter/|Tweaking a TP-Link TL-WR710N & GL.iNet 6416A]] * [[https://wiki.openwrt.org/toh/gl-inet/gl-ar150|OpenWrt on GL-AR150]] * [[http://www.gl-inet.com/firmware/ar150/v1/openwrt-ar150-2.13.bin|GL Original Firmware 2.13]] * [[https://downloads.openwrt.org/snapshots/trunk/ar71xx/generic/openwrt-ar71xx-generic-gl-ar150-squashfs-sysupgrade.bin|Firmware OpenWrt Trunk]] * [[https://www.gl-inet.com/forums/topic/any-security-concerns/|Any security concerns?]] (GL.iNet forum) * [[http://www.gl-inet.com/docs/mini/repeater_manager/|Repeater Manager]]