community italiana di domotica personale
 
Installare e configurare Caddy (reverse proxy) con Docker su Sonoff iHost

Installare e configurare Caddy (reverse proxy) con Docker su Sonoff iHost

SCOPI DELLA GUIDA:
  • Installare e configurare un servizio reverse proxy per la propria rete domestica basato su Caddy, usando Docker su Sonoff iHost
  • Livello di difficoltà: medio
CONCETTI AFFRONTATI:
  • installazione e configurazione software
COMPONENTI SOFTWARE UTILIZZATE:
PREREQUISITI:
  • Sonoff iHost precedentemente configurato e collegato alla rete domestica e, tramite essa, ad Internet
DISPOSITIVI FISICI UTILIZZATI:
GUIDA DEDICATA A utenti:
Sonoff iHost - Square
NOTE E DISCLAIMER
  • qualsiasi eventuale modifica agli impianti domestici dev'essere progettata e realizzata SOLO da personale qualificato;
  • qualsiasi modifica non prevista attuata in proprio è a propria responsabilità personale nonché a proprio rischio e pericolo (i contenuti della presenta pagina hanno infatti puro scopo didattico) e fa decadere garanzia, omologazioni e certificazioni di qualità; dei dispositivi interessati;
  • tutte le tecniche descritte si intendono applicate a software e firmware aggiornati alle ultime versioni disponibili;
  • gli articoli di inDomus sono totalmente indipendenti e non sponsorizzati. Se mai questo cambiasse, verrà segnalato chiaramente sulle pagine oggetto di sponsorizzazione;
  • questa pagina è materialmente scritta e manutenuta da più individui: non ci si aspetti né si pretenda un supporto personale. In caso di difficoltà, chiedere supporto alla community sul nostro forum o sulla nostra chat;
  • se hai bisogno di orientarti, c'è la mappa.
Revisione guida: 1.0

Caddy - Docker

Abstract

Con un Sonoff iHost installato col proprio sistema operativo eWeLink CUBE è relativamente facile dotarsi di un servizio reverse proxy per la propria rete domestica.

L’adozione di un software gratuito come Caddy, per esempio, consente di realizzare tale funzionalità di rete in pochi e semplici passi; tale strumento può poi essere configurato e utilizzato per le sue tipiche funzioni di reindirizzamento delle chiamate da Internet verso servizi presenti sulla propria rete interna nonché l’ottenimento automatico degli eventuali certificati crittografici utili alla navigazione sicura verso tali servizi.

N.b. Sebbene non si tratti di scienza missilistica, l’implementazione di questa guida prevede un minimo di cultura sul networking nonché sul funzionamento del reverse proxy. Inutile e deleterio tentare di configurare su Caddy senza conoscere l’abc su questi temi.

ATTENZIONE: Per funzionare, questa guida dev’essere letta e attuata con particolare attenzione e calma. Pena, il probabile fallimento della configurazione del servizio.

Si parte

Assunti

Si assume che Sonoff iHost sia già operativo, connesso alla rete LAN e, di riflesso, a Internet, e che disponga dell’ultima versione fimware disponibile.

Altresì, si assume che sia stata installata a bordo e formattata una microSD, la quale ospiterà non solo Caddy stesso, ma anche i contenuti delle applicazioni che si andranno, nel tempo, a configurare presso iHost. La presente guida è in italiano, quindi si assume di aver installato su iHost un pacchetto linguistico in lingua italiana, per esempio il nostro.

Si assume inoltre di aver implementato FileBrowser, il quale verrà riconifigurato al fine di modificare i file di configurazione di Mosquitto; infine, si assume infine che l’host che ospiterà Caddy possegga un indirizzo IP fisso assegnato automaticamente dal router domestico.

Creazione volume

Prima cosa da fare è creare un volume logico allo scopo di ospitare i file di Caddy (configurazione e altro).

Da interfaccia web di sonoff iHost (solitamente raggiungibile via LAN all’indirizzo http://ihost.local), recarsi alla voce di menu “Docker” > “Volume” e poi cliccare su “Crea volume“.

Creare un distinto volume così chiamato:

  • caddy

e clicchiamo su “Conferma” per crearlo.

Attivare accesso FileBrowser

Prima di procedere oltre, è necessario far sì che FileBrowser (il quale, arrivati sin qui, dovrebbe già essere operativo) abbia accesso al volume “config” di Caddy, così da poter effettuare modifiche alla sua configurazione.

Per farlo, modificare la configurazione di FileBrowser e aggiungere il volume “caddy” alla sua configurazione.

Dominio

N.b. Se si possiede un dominio proprio o comunque una gestione DDNS diversa da DuckDNS, si può saltare direttamente alla sezione “Port forwarding“.

Affinché sia raggiungibile dall’esterno in modo semplificato, il punto di accesso alla rete domestica (ovvero interfaccia WAN del modem) deve esser rappresentato da un nome univoco (chiamato FQDN) il quale veda l’IP ad esso associato aggiornarsi automaticamente ad ogni variazione, dato che quello assegnato al vostro modem/router cambia ciclicamente. Per fare questo interviene il servizio Dynamic DNS (o DDNS), ovvero un servizio che tenga traccia dell’ultima variazione e risponda, ai sistemi che chiedano la risoluzione (traduzione) del nome DNS, l’ultimo IP conosciuto, ovvero quello in uso.

DuckDNS è il servizio che abbiamo scelto per questa funzione di fornitura di FQDN nonché di associazione dinamica dell’IP.

N.b. Caddy può serenamente gestire anche domini propri acquistati e gestiti sulla rete dai più diversi fornitori diversi da DuckDNS. Come vedremo a seguire, la “challenge” (ovvero la procedura di ottenimento automatica dei certificati) varia da fornitore a fornitore: impossibilitati a documentare qualsiasi casistica possibile, in questa guida analizzeremo le più comuni modalità di challenge tra i servizi più comunemente usati. Ciononostante, con i debiti accorgimenti la guida di massima è valida anche per gli altri casi.

Collegarsi quindi al servizio tramite l’indirizzo https://www.duckdns.org e, una volta registrati creare un proprio nome dominio che, univocamente, rappresenterà il vostro modem collegato ad Internet. Il suffisso è sempre lo stesso (“.duckdns.org“) mentre ciò che cambia e va scelto è il suffisso (per esempio “casamia“).

Per questa guida, daremo per assunto di aver creato il seguente FQDN:

casamia.duckdns.org

dove “duckdns.org” è la parte fissa mentre casamia è il nome di dominio da noi creato a mo’ di esempio.

All’interno della vostra sezione privata di DuckDNS troverete anche un campo importante chiamato “token“, il quale appare analogo a questo:

e3ff465f-c6d6-acb1-4416-44b2af152111

Appuntarselo da una parte, tornerà utile a breve.

Aggiornamento di DuckDNS

Prima di provvedere alla configurazione di Caddy è necessario assicurarsi che l’associazione del proprio FQDN con l’IP assegnato al modem dal nostro provider Internet sia garantita quasi in tempo reale. A fronte dell’eventuale cambiamento dell’IP Internet sull’interfaccia WAN del proprio modem/router, è necessario che tale variazione venga comunicata a DuckDNS, in modo da aggiornare la conseguente risoluzione dell’FQDN.

N.b. Questo paragrafo non va attuato se sulla propria rete c’è già qualche dispositivo che provveda a tale funzione di associazione dell’IP con il proprio FQDN, come per esempio un modem/router FRITZ!Box o altri modelli/marche in grado di effettuare da sé l’operazione. Se e quando un modem è in grado di provvedere a tale funzione, è sempre buona regola lasciare che sia lui ad aggiornare tale associazione, e non il Sonoff iHost o altri host della propria rete.
N.b. Gli utenti che utilizzino già l’HUB Home Assistant possono alternativamente utilizzare questa guida che non prevede l’adozione di un container ad hoc, cosa invece descritta nel presente paragrafo.

Arrivati a questo punto è possibile provvedere all’instanziamento di DuckDNS, il quale viene eseguito come container Docker tramite istanza specifica.

Recarsi dunque alla voce “Docker” > “Lista degli Add-on” e poi cliccare su “Aggiungi Add-on“.

Nella buca di ricerca inserire “duckdns“, poi cliccare sulla lente d’ingrandimento:

Sonoff iHost - DuckDNS - Aggiunta immagine

selezionare “Isioarmhf/duckdns“, poi cliccare su “Aggiungi …“.

Al termine si rientrerà sulla finestra principale degli Add-on inclusi su Sonoff iHost; a questo punto cliccare su “Installare” sul nuovo box dedicato a DuckDNS.

Attendere il tempo del download dell’immagine di FileBrowser dal repository ufficiale di Docker, poi procedere oltre.

Avviare il container

Al termine, sempre presso il box di FileBrowser, cliccare su “Avvia“.
Apparirà un box di configurazione, il quale va configurato come segue:

  • Rete: bridge (o bridge, è uguale)
  • Porta:
    • nessuna indicata
  • Volume:
    • nessuno indicato
  • Variabili d’ambiente:
    • Variabile: “TZ” con valore “Europe/Rome
    • Variabile: “SUBDOMAINS” con valore NOME_DOMINIO (come spiegato a seguire)
    • Variabile: “TOKEN” con valore MIO_TOKEN_DUCKDNS (come spiegato a seguire)

sostituendo nel comando le stringhe indicate come segue:

NOME_DOMINIO sostituire utilizzando il nome dominio definito sul servizio DuckDNS (inteso come terzo livello, quindi nel caso sopra solo “casamia“)
MIO_TOKEN_DUCKDNS sostituire utilizzando il toker fornito da DuckDNS

Riportiamo l’esempio:

Sonoff iHost - DuckDNS - Configurazione container Docker
configurazione d’esempio.

Al termine della configurazione, cliccare su “Avvia” per avviare il container Docker di DuckDNS, il quale da qui in poi provvederà all’aggiornamento automatico dell’associazione IP WAN/FQDN, come spiegato sopra.

Port forwarding

Per far sì che Caddy possa autonomamente provvedere all’ottenimento di eventuali certificati SSL per il proprio FQDN nonché accettare le connessioni esterna da girare – in quanto reverse proxy – è necessario configurare delle regole di port forwarding sul modem/router. Il cosiddetto “aprire le porte”.

Prima di proseguire oltre – se non si ha già dimestichezza col port forwarding – si consiglia la lettura di questo articolo.

IMPORTANTE.

Le regole di port forwarding variano in base alle porte che si vogliano esporre verso Internet rispetto a quelle aperte (e da raggiungere) internamente. Questo non è oggetto della presente guida, in quanto qualsiasi guida presente su inDomus che referenzi la presente e che utilizzi Caddy come reverse proxy spiegherà questo aspetto nello specifico del servizio.

Ciò che viene spiegato in questa occasione – ovvero alla prima installazione e configurazione di Caddy – è relativo alle porte (eventualmente) da aprire in caso si voglia far provvedere a Caddy all’ottenimento di eventuali certificati SSL per la securizzazione delle comunicazioni dentro-fuori.

I certificati crittografici, per essere considerati validi, devono essere rilasciati da una Certification Authority riconosciuta: nel caso della presente guida utilizzeremo il servizio gratuito Let’s Encrypt. Questo processo viene automatizzato sfruttando uno specifico protocollo (chiamato ACME Protocol) il quale prevede tre modalità diverse, dette anche challenge, per appurare la propria “identità” al gestore del servizio e ottenere quindi i certificati richiesti. Tali modalità sono:

  • HTTP Challenge
  • TLS-ALPN Challenge
  • DNS Challenge

Su Caddy le prime due challenge vengono utilizzate di default, la terza invece va eventualmente abilitata in configurazione (il che disabilita le prime due).

  • TLS-ALPN Challenge: Questa è la prima challenge che viene tentata di default da Caddy. Tecnicamente, viene effettuata una DNS lookup verso il proprio FQDN per il quale viene richiesto il certificato e viene eseguita una specifica request sulla porta TCP 443. Se alla CA viene restituito il risultato atteso, avviene il rilascio del certificato. Per questa challenge è necessaria l’apertura della porta TCP 443 verso l’host che ospita Caddy.
  • HTTP Challenge: Si tratta della seconda challenge che viene tentata di default da Caddy. Anche qui viene effettuata una DNS lookup verso il proprio FQDN per il quale viene richiesto il certificato e viene effettuata una specifica request sulla porta TCP 80. Se alla CA viene restituito il risultato atteso, avviene il rilascio del certificato. Com’è facile intuire, questa challenge necessità dell’apertura della porta TCP 80 verso l’host che ospita Caddy.
  • DNS challenge: Questa challenge non viene tentata in automatico ma, come detto prima, va eventualmente configurata (disabilitando di conseguenza le precedenti due). Diversamente dalle altre non necessita di apertura porte ma richiede una specifica configurazione: caddy deve poter accedere al provider DNS del proprio dominio per impostare i cosidetti TXT record in modo tale che, quando viene effettuata l’authoritative DNS lookup verso il provider DNS per la ricerca del TXT record, venga effettivamente restituito il valore atteso.

Dunque, quali porte vanno “aperte” tramite port forwarding e girate verso l’host che ospita Caddy? La TCP 80, la 443 o nessuna?

La scelta ovviamente è soggettiva e dipende da diversi fattori. Dipende in primis dal DNS provider, in base se esso consenta o meno la scrittura dei TXT record. Dipende anche dal proprio modem: non tutti permettono l’apertura delle porte 80 e 443. Dipende dalla volontà o meno di voler esporre il proprio server sulle porte 80 e 443. Per fare qualche esempio:

  • se abbiamo un comune modem che consente il port forwarding della porta TCP 443 o della TCP 80 e utilizziamo DucKDNS, ci basta HTTP-Challenge;
  • se abbiamo un vecchio modem Fastweb che non permette il port forwarding della porta TCP 80 e non abbiamo un provider DNS che permetta l’impostazione dei TXT record (magari perché non previsto dal servizio gratuito), possiamo pensare di sfruttare la TLS-ALPN inoltrando il traffico sulla 443 verso Caddy;
  • se invece abbiamo acquistato un dominio possiamo ad esempio farlo gestire a Cloudflare e sfruttare la DNS Challenge;
  • se abbiamo registrato un dominio su noip.com e facciamo l’upgrade a pagamento, possiamo impostare i TXT record e scegliere di usufruire della DNS Challenge evitando di esporre altre porte.

e altro.

In questa guida assumeremo di utilizzare la casistica più classica, ovvero il primo esempio qui sopra spiegato, ovvero quello che utilizza port forwarding della porta TCP 443 o TCP 80 nonché – come vedremo – la corretta challenge prevista per DuckDNS (la TLS-ALPN).

La configurazione per il port forwarding sul modem da noi consigliata (molta attenzione a questo passaggio) è:

  • IP destinazione: IP statico del Sonoff iHost (assegnato in precedenza);
  • Porta esterna: TCP 443
  • Porta interna: TCP 8443

oppure

  • IP destinazione: IP statico del Sonoff iHost (assegnato in precedenza);
  • Porta esterna: TCP 80
  • Porta interna: TCP 81
MOLTO IMPORTANTE.

Ci si domanderà: perché non limitarsi a mappare le porte esterne 443 e 80 con le medesime interne al container, anzichè queste “strane” 8443 e 81? Semplice: perché le porte 443 e 80, su iHost, sono riservate, pertanto non possono essere usate.
Sbagliare questo passaggio significa non far funzionare Caddy, quindi riflettere bene su quanto si sta facendo e, in caso, rileggere sopra.

Punto della situazione

Arrivati a questo punto della guida abbiamo:

  • un FQDN rappresentante il nostro punto di ingresso alla rete locale;
  • un sistema di aggiornamento automatico dell’FQDN;
  • un port forwarding delle porte esterne TCP 443 o 80 (o nessuno, se si usa la DNS Challenge) verso la 8443 e la 81 (o altre a scelta).

Ora non manca che installare Caddy e far sì che nella sua configurazione ci sia l’ottenimento automatico dei certificati da parte di Let’s Encrypt per il nostro FQDN.

Vetrina - Offerte del giorno

Istanziare Caddy su Docker

Una volta dotati di un proprio FQDN è dunque il momento di installare (o meglio, “istanziarvi sopra”) Caddy. Prima di procedere, però, è necessario creare una cartella la quale conterrà la sua configurazione.

Tramite la webapp FileBrowser precedentemente riconfigurata creare nella radice del volume “caddy” un file chiamato “Caddyfile” (senza estensione e chiamato proprio come scritto) dentro il quale copiare il seguente codice:

https://casamia.duckdns.org { 
  respond "Saluti dal Crew inDomus.it"
  file_server
}

Dove ovviamente “casamia.duckdns.org” andrà personalizzato col proprio FQDN.
Una volta completata la modifica, usciamo dall’editor salvando il file.

Istanziamo ora Caddy su Docker al quale passeremo i seguenti argomenti:

  • nome del container: caddy;
  • il file di configurazione “Caddyfile” da utilizzare;
  • la directory “data” nella quale verranno salvati i certificati;
  • la porte da esporre fuori dal container (8443 o 81 o altre scelte personalnente).

Istanziare Caddy

Arrivati a questo punto è possibile provvedere all’instanziamento di Caddy, il quale viene eseguito come container Docker tramite istanza specifica.

Recarsi dunque alla voce “Docker” > “Lista degli Add-on” e poi cliccare su “Aggiungi Add-on“.

Nella buca di ricerca inserire “caddy“, poi cliccare sulla lente d’ingrandimento:

Sonoff iHost - Caddy - Aggiunta immagine

selezionare “caddy“, poi cliccare su “Aggiungi …“.

Al termine si rientrerà sulla finestra principale degli Add-on inclusi su Sonoff iHost; a questo punto cliccare su “Installare” sul nuovo box dedicato a Caddy.

Attendere il tempo del download dell’immagine di FileBrowser dal repository ufficiale di Docker, poi procedere oltre.

Avviare il container

Al termine, sempre presso il box di FileBrowser, cliccare su “Avvia“.
Apparirà un box di configurazione, il quale va configurato come segue:

  • Rete: bridge;
  • Porta:
  • Volume:
    • per “Volume dell’host”, selezionare quello precedemente creato, ovvero “caddy” e per “Volume dell’Add-on”, impostare “/config“;
    • per “Volume dell’host”, selezionare quello precedemente creato, ovvero “caddy” e per “Volume dell’Add-on”, impostare “/caddy/data“.

Riportiamo l’esempio:

Sonoff iHost -Caddy - Configurazione container Docker
configurazione d’esempio.

Al termine della configurazione, cliccare su “Avvia” per avviare il container Docker di Caddy.

Verifica

Se tutto sarà ok, lo si scoprirà collegandosi a questo indirizzo:

https://casamia.duckdns.org

avendo naturalmente cura di correggere casamia col proprio nome dominio.
Se si accederà a una schermata del seguente tipo:

Caddy - congratulazioni funziona

congratulazioni: Caddy è ora operativo.

Abbiamo finito?

In realtà, nì.

Caddy, di per sé ora è operativo ma, in buona sostanza, non sta facendo nulla se non ottenere automaticamente gli aggiornamenti dei certificati per il nostro FQDN. Va da sé che per utilizzarlo per ciò che è concepito, ovvero la funzione di reverse proxy, sarà necessario indicare in configurazione (nel “Caddyfile” di cui sopra) quali regole implementare e riavviare coerentemente il container, oltre a implementare le relative regole di port forwarding sul modem/router.

Un esempio: Home Assistant

Ipotizziamo di voler gestire il traffico esterno per un’istanza di Home Assistant presente sulla rete interna in modo da farlo raggiungere dall’esterno su porta 9000 (e in modo sicuro con certificati SSL) per controllare la propria domotica in remoto.

Le cose da fare sono:

  • modificare coerentemente il “Caddyfile“;
  • configurare il port forwarding;
  • riavviare il container Docker di Caddy.
MODIFICA AL CADDYFILE

Modificheremo il Caddyfile come segue:

(https_header) {
  header {
    Strict-Transport-Security "max-age=31536000; includeSubdomains"
    X-XSS-Protection "1; mode=block"
    X-Content-Type-Options "nosniff"
    X-Frame-Options "SAMEORIGIN"
    Referrer-Policy "same-origin"
  }
}

https://casamia.duckdns.org { 
  respond "Saluti dal Crew inDomus"
  file_server
}
https://casamia.duckdns.org:9000 { 
  import https_header
  reverse_proxy http://IP_DELLA_ISTANZA_HOME_ASSISTANT:8123
  @ws: {
    header Connection "Upgrade"
    header Upgrade websocket
  }
}

Come si nota, la regola indica che tutte le richieste https verso casamia.duckdns.org:9000 vengano reindirizzate verso l’indirizzo interno http://IP_DELLA_ISTANZA_HOME_ASSISTANT:8123.

CONFIGURARE IL PORT FORWARDING

Sul modem/router, definire una regola di port forwarding così modellata:

  • IP destinazione: IP statico del Sonoff iHost che ospita Caddy
  • Porta esterna: TCP 9000
  • Porta interna: TCP 9000
RICONFIGURARE CADDY

Naturalmente bisognerà cancellare il container Docker di Caddy e ricrearlo aggiungerndo alla configurazione di base anche l’associazione di porte 9000:9000 (oltre quelle già previste, tipo la 8443 e la 81), ovvero l’associazione della nuova porta d’ingresso ora gestita, la 9000. Terminata questa configurazione, Home Assistant sarà raggiungibile dall’esterno, via https, presso il proprio FQDN alla porta 9000.

Questo ovviamente è solo un esempio illustrativo: per tutte le possibili configurazioni (non documentate da inDomus) si consiglia di far riferimento direttamente alla documentazione Caddy.

N.b. Attenzione: naturalmente se si provvede a instanziare Caddy via Docker Compose, va da sé che anche tale file debba essere modificato aggiungendo le porte da esporre al container, per esempio la 9000 come per l’esempio sopra.
RICONFIGURARE HOME ASSISTANT

Dato che abbiamo portato l’esempio di Home Assistant, dopo la configurazione di Caddy ricordarsi anche di effettuare un’ultima modifica, ma stavolta lato Home Assistant.

Questa pagina è redatta, manutenuta e aggiornata dallo staff di inDomus, un gruppo di persone molto diverse tra loro che trovi, per domande e supporto, sul forum e sulla chat del sito. Alcuni link sono taggati in qualità di affiliati Amazon e riceviamo un compenso dagli acquisti idonei, utile al sostenimento del sito, ma le nostre recensioni sono tutte indipendenti e non sponsorizzate. Se ti sei perso, a tua disposizione c'è la mappa.