Se utilizzate un Raspberry Pi, come server casalingo, e volete accedervi dall’esterno, uno dei primi passi da compiere è assegnare dal router di casa un IP locale fisso al Raspberry Pi, dunque mappare e creare le giuste regole di NAT all’interno del dispositivo di rete, e poi configurare sul Raspberry un sistema che possa comunicare ad un certo sistema DNS l’indirizzo IP pubblico con cui i dispositivi collegati al router casalingo escono sulla rete. Infatti sappiamo che la maggior parte degli abbonamenti stipulati con gli Internet Provider non prevedono l’utilizzo di indirizzi IP statici, bensì dinamici, cangianti ad ogni connessione.

Questo che presentiamo oggi è un sistema per la risoluzione dinamica dei DNS, saremo in grado di accedere al nostro Raspberry Pi da internet, pur avendo un indirizzo IP dinamico.

Il Download dei sorgenti è disponibile su GitHub.

Il progetto per funzionare ha bisogno di un sito web che funga da risolutore DNS. Su questo spazio web andrà caricato il sistema DNS, che si compone di un Proxy in PHP per effettuare una sorta di risoluzione DNS “casalinga”.
Il Raspberry Pi con un cronjob fa sapere ogni 20 minuti l’indirizzo IP pubblico al server che hosta il proxy in php e che funge da DNS. Lo script registra l’indirizzo IP di provenienza delle richieste.
E lo usa per mappare le richieste fatte al proxy in php direttamente all’indirizzo remoto del Raspberry Pi.

I cronjob impostati sul Raspberry Pi sono 2, il primo effettua una chiamata al server remoto (per far sapere il suo IP) ad ogni avvio o reboot del Raspberry Pi.
Il secondo cronjob effettua una richiesta ad intervalli di 30 minuti (volendo possiamo anche diminuire questo valore, nel caso avessimo una connessione molto volatile o un router che è sensibile a cali di tensione).

Tramite il file ip.txt possiamo vedere l’indirizzo IP attuale del raspberry pi e l’ultima data di aggiornamento dell’IP.
da log_richieste.txt invece la cronologia di tutte le richieste fatte al Raspberry Pi attraverso il proxy PHP. Questi file risiedono tutti sul server remoto, il Raspberry non necessita nulla se non un sistema Raspbian ben configurato.

Qui di seguito i cronjob:


@reboot curl http://roccomusolino.com/rpi/update_ip.php
*/30 * * * * curl http://roccomusolino.com/rpi/update_ip.php

A seconda dello scenario, se mappate nel router delle porte, come la 80, per poter effettuare le richieste, ci si aspetta chiaramente che nel Raspberry Pi giri un server Apache, sulla porta 80. Inoltre ripetiamo è necessario modificare le impostazioni di NAT nel router casalingo per far in modo che le richieste dall’esterno sulla porta 80 vengano mappate all’indirizzo ip locale assegnato al Raspberry Pi connesso.
E se volete accedere a particolari servizi, che non siano soltanto il web server, ma ad esempio l’ssh su porta 22. E’ necessario mappare ogni altra porta che utilizza il servizio corrispondente sul RPi.
A quel punto basta ottenere l’indirizzo ip dal file ip.txt e fare la connessione dal client ssh usando quell’IP. Il proxy web è soltanto per richieste basate su protocollo http infatti.

Con un servizio di DNS standard si può mappare direttamente tradurre qualsiasi richiesta all’IP dinamico del RPi. Però necessità l’installazione di un client dns sulla board, e non si ha un livello di controllo tale. E’ un progetto fatto in pochissimo tempo, quindi i miglioramenti possono essere infiniti.