Come rendere accessibile da Internet tramite SSL un’applicazione web del proprio computer utilizzando un tunnel SSH

L’articolo che ho pubblicato ieri descrive il modo che ho sempre utilizzato per rendere accessibili da Internet le applicazioni del mio computer. Poi, questa mattina, mentre riflettevo sulle possibilità di cifrare tutto il traffico in maniera semplice mi sono ricordato che adesso esiste Let’s Encrypt che semplifica ancora di più le cose!

Ecco dunque una tecnica ancora più semplice per far accedere da Internet alle applicazioni web locali del nostro computer utilizzando un server e Let’s Encrypt.

Configurazione del DNS

Per prima cosa definiamo un nuovo indirizzo (A) o alias (CNAME) che punti all’indirizzo IP del server.

Supponiamo di definire test.artifex.it.

Se usiamo Cloudflare per ora andrà definito come “DNS only“.

Avvio dell’applicazione locale

Sul nostro computer avviamo l’applicazione che vogliamo rendere accessibile da Internet.

Supponiamo che sia collegata alla porta locale 127.0.0.1:8080.

Apertura tunnel SSH inverso

Dal computer colleghiamoci al server tramite il client SSH aprendo un tunnel inverso:

ssh -R 8080:localhost:8080 <nome_utente>@test.artifex.it

Questa operazione fa sì che tutte le richieste fatte al server sulla porta 8080 vengano inoltrate alla porta 8080 del nostro computer.

Nelle ultime versioni di openssh potrebbe essere necessario anche specificare l’indirizzo del server ma possiamo usare l’indirizzo jolly 0.0.0.0:

ssh -R 0.0.0.0:8080:localhost:8080 <nome_utente>@test.artifex.it

Configurazione del server

Ora colleghiamoci al server come root e configuriamo un reverse proxy per una porta locale, ad esempio la 127.0.0.1:8080.

Con Nginx, che per questo scopo è perfetto, sarebbe:

server {
        server_name     test.artifex.it;
        listen          80;
        location / {
                proxy_pass http://127.0.0.1:8080;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
        }
}

Scriviamo la configurazione in un file nella cartella dei siti virtuali disponibili, ad esempio:

/etc/nginx/sites-available/test

e poi rendiamolo attivo linkando il file nella cartella dei siti virtuali attivi:

$ cd /etc/nginx/sites-enabled
$ sudo ln -s ../sites-available/test .

Riavviamo Nginx per attivare il nuovo server virtuale.

Ora tutte le richieste fatte a http://test.artifex.it (quindi la porta 80) verranno reindirizzate alla porta locale 127.0.0.1:8080.

Alla porta 8080 è collegata l’applicazione sul computer locale tramite il tunnel inverso quindi ora l’applicazione è accessibile da Internet tramite normale protocollo HTTP.

Tutto funzionerà ma probabilmente riceverete dal browser un avviso di sito non sicuro.

Dobbiamo fare un ultimo passo: attivare la cifratura SSL e passare a protocollo HTTPS. Ed è proprio qui che ci viene in aiuto Let’s Encrypt.

Ci sono diverse modalità di installazione. Sul sito possiamo scegliere quella che ci è più comoda.

Io di solito uso il Certbot che poi si occupa anche di mantenere aggiornati i certificati.

Una volta installato il Certbot possiamo lanciarlo e lasciare a lui tutte le noiose operazioni di configurazione (durante l’esecuzione dovremo indicargli su quale configurazione di server virtuale operare):

$ sudo certbot --nginx

Terminate le operazioni il file di configurazione del server virtuale sarà diventato:

server {
        server_name     test.artifex.it;
        location / {
                proxy_pass http://127.0.0.1:8080;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
        }
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/test.artifex.it/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/test.artifex.it/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
    if ($host = test.artifex.it) {
        return 301 https://$host$request_uri;
    } # managed by Certbot
        server_name     test.artifex.it;
        listen          80;
    return 404; # managed by Certbot
}

Ora funzionerà tutto tramite protocollo HTTPS!

Potete collegarvi a https://test.artifex.it e vedere l’applicazione senza nessun avvertimento.

Se usate Cloudflare e avevate definito come “DNS only” l’indirizzo ora lo potete anche portare a “Proxied“.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *