Contenuti

La perfetta Dashboard HTTPS per il tuo server casalingo

La possibilità di lavorare alla configurazione e all’installazione di servizi all’interno della rete di casa per la domotica o come cloud privato si limita ai ritagli di tempo dopo il lavoro, durante la sera o nei giorni di festa. è inevitabile quindi per me dimenticare sistematicamente gli url, gli ip, gli host in cui sono pubblicati i vari servizi.

Esiste un modo semplice, veloce e sicuro per organizzare tutti questi servizi che ho in casa?

1 L’obiettivo

In pochi minuti riusciremo a installare una dashboard completa per tutte le tue applicazioni/servizi di casa, con una architettura basata su un reverse proxy stabile e sicuro, accedibile in connessione HTTPS anche da dentro la LAN. A proposito, è tutto gratis!

2 Prerequisiti

  • Un server locale, come un vecchio pc o uno di quelli a risparmio energetico che sia sempre acceso. Va bene di tutto, dai server da rack agli Intel NUC (personalmente mi trovo bene con il Gigabyte Brix).
    Note
    Nella guida sono descritti i passaggi in caso di utilizzo di architettura intel x64 su sistema operativo basato su Linux. In caso di architettura ARM (ad esempio un Raspberry) o altri sistemi operativi non preoccuparti, con pochi adattamenti riuscirai a raggiungere lo stesso obiettivo.
  • Porta 80 e 443 non devono essere già utilizzate dal server locale.
  • il server locale deve avere un indirizzo statico in LAN (e.g. 192.168.1.X).
  • La rete di casa dovrà essere connessa a internet. In caso non abbia un indirizzo ip statico (in Italia per quello che so vengono concessi prettamente a contratti business) non c’è problema, è richiesta solo la registrazione di dns dinamico.
  • Tramite il router di casa la porta 80 e 443 dell’interfaccia WAN dovranno essere instradate verso il server locale (port forwarding).
  • docker e docker-compose devono essere installati sul server di casa. In caso non li avessi già installati, il sito ufficiale di docker fornisce delle guide semplici e efficaci a riguardo.
  • Un “dynamic DNS name” (come quelli offerti da NoIP e dyn.com) o un nome statico dns nel caso in cui abbia un indirizzo ip statico. In sostanza, per far lavorare i certificati per l’https è necessario in questo caso procurarsi un url simbolico che punti all’indirizzo pubblico di casa, il solo ip non basta. A proposito, nella configurazione del dynamic dns è importante ricordarsi di indirizzare tutti i sottodomini con la wildcard asterisco-punto prima del nome. Nella guida indicherò con “YourPersonalHomeLabSite.dyndns.org” il tuo dynamic dns.
  • Opzionale - Sul tuo server di casa puoi lavorare come preferisci, usando tastiera e mouse, tramite ssh, o kvm. Il mio consiglio è di utilizzare Visual Studio CODE con l’estensione Remote Development, è davvero comodo.

3 Cos’è un proxy inverso e perché ne abbiamo bisogno?

Il prodotto Nginx Proxy Manager è composto dal proxy Nginx (configurato come proxy inverso) e una interfaccia di gestione e configurazione. Il proxy inverso lo possiamo immaginare come un server web che risponde ad ogni pagina richiesta inviando dei contenuti da un altro server. In pratica, quando chiedo qualcosa ad un reverse proxy lui non possiede il contenuto e deve richiederlo al vero server in maniera sincrona alla mia richiesta.

Perché oggi è così impiegato?
Giusto un esempio: poniamo che ho una istanza di Home Assistant pubblicata sul mio server locale sul 192.168.1.4:5000 e una di Owncloud su un altro server con 192.168.1.10:8000. Esporre questi due servizi in https e all’esterno sulla wan potrebbe essere oneroso e richiedere specifiche configurazioni su ognuno dei servizi, oltre all’obbligarmi a ricordare per ogni servizio, l’url e la porta corretti. Se imposto questi due endpoint locali come rotte associati a sottodomini del mio proxy inverso potrei raggiungere homeassistant chiedendo al proxy inverso le pagine riferita a homeassistant.mydomain.org e owncloud chiedendo owncloud.mydomain.org. Il proxy inverso agisce come un collettore di richieste per tutte le risorse interne, mantenendo il vero server che espone il singolo servizio non direttamente coinvolto con l’interazione con i client. Questo porta a dei vantaggi sul fronte della sicurezza, della semplicità di configurazione e gestione, per non parlare della facilità di scalare le risorse in caso si abbiano necessità di maggiori risorse.

4 Avviamo i container

Sul server locale è utile scegliere una cartella per raccogliere i file di configurazione per tutti i servizi pubblicati, come ad esempio /opt o /opt/homelab. La configurazione di proxy e dashboard la potremo quindi collocare, per esempio, nella cartella /opt/homelab/proxy_dashboard.

Creare /opt/homelab/proxy_dashboard/docker-compose.yaml dentro al path con questo contenuto:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
version: '3.2'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    deploy:
      mode: global
    restart: always
    network_mode: host # with network_mode: host all ports are potentially exposed. if you want to select only few of them comment this line and uncomments "ports" chapter.
    #ports: 
    #  - target: 80
    #    published: 80 # Public HTTP Port
    #    protocol: tcp
    #    mode: host
    #  - target: 443
    #    published: 443 # Public HTTPS Port
    #    protocol: tcp
    #    mode: host
    #  - '81:81' # Admin Web Port - This port will be exposed only in the LAN
    volumes:
      - /opt/homelab/proxy_dashboard/nginxproxymanager/config.json:/app/config/production.json
      - /opt/homelab/proxy_dashboard/nginxproxymanager/data:/data
      - /opt/homelab/proxy_dashboard/nginxproxymanager/letsencrypt:/etc/letsencrypt
    dns:
      - 8.8.8.8
    

  dashmachine:
    image: rmountjoy/dashmachine:latest
    restart: always
    ports:
      - "5000:5000" # Port for internal dashboard service. This port will be exposed only in LAN
    volumes:
      - /opt/homelab/proxy_dashboard/dashmachine:/dashmachine/dashmachine/user_data

  dns:
    restart: always
    image: strm/dnsmasq
    volumes:
      - /opt/homelab/proxy_dashboard/dns/dnsmasq.conf:/etc/dnsmasq.conf
    ports:
      - "53:53/udp"
    cap_add:
      - NET_ADMIN

Creare le cartelle per i vari servizi contenuti, avendo cura che corrispondano ai path indicati nel tag “volumes” nel docker-compose file appena creato.

  • /opt/homelab/proxy_dashboard/nginxproxymanager
  • /opt/homelab/proxy_dashboard/dashmachine
  • /opt/homelab/proxy_dashboard/dns

Bene, è tempo di avviare i container. Per farlo lancia sul terminale del server il comando:

1
2
cd /opt/homelab/proxy_dashboard
sudo docker-compose up -d

5 Setup di Nginx Reverse Proxy

Da un pc in rete LAN (che sia il server o un altro) naviga alla pagina dell’interfaccia di gestione di Nginx Proxy Manager: http://IP_OF_THE_HOMELAB_SERVER:81

Note

Il servizio chiederà di cambiare la password dopo il primo accesso. Le credenziali di default sono:

Adesso navigare nel tab Hosts-> Proxy Hosts e cliccare su Add Proxy Host. Dobbiamo configurare la rotta principale: la dashboard.

/it/homelab-dashboard-https/dashmachine_su_proxy.png
Utilizzare l'url corrispondente al proprio dns dinamico (o nome statico) e l'ip del server locale

/it/homelab-dashboard-https/dashmachine_certificato_su_proxy.png
Questo prodotto consente di gestire e richiedere in maniera autonoma i certificati SSL. Per farlo basta selezionare Request a new SSL Certificate.

Salva, aspetta e BOOM, adesso puoi navigare verso https://YourPersonalHomeLabSite.dyndns.org e accedere alla tua dashboard di casa!

6 Setup della dashboard

Note
La dashboard è una pagina web che raccoglie i link relativi ai servizi pubblicati internamente, come se fosse una bella pagina dei preferiti. Ogni item della lista è solo un link che apparirà in questa dashboard una volta aperta. Gli url non sono necessariamente vincolati ad utilizzare il proxy inverso, potrebbero anche essere diretti (ad esempio 192.168.10.2:8000).

Naviga verso https://YourPersonalHomeLabSite.dyndns.org, vai su settings (le credenziali di default sono admin:admin), e aggiorna il file di configurazione. Questo è un esempio di configurazione con qualche servizio:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
[Settings]
theme = dark
accent = blue
background = https://picsum.photos/1920/1080?blur=5
roles = admin,user,public_user
home_access_groups = public
settings_access_groups = users
custom_app_title = HomeLabDashboard
sidebar_default = open
tags_expanded = True

[admin]
role = admin
password = YouMustChooseAGoodPassword
confirm_password = YouMustChooseAGoodPassword

[user_1]
role = admin
password = YouMustChooseAGoodPassword
confirm_password = YouMustChooseAGoodPassword

[public]
roles = admin, user, public_user

[users]
roles = admin, user

[admin_only]
roles = admin

[Nginx Proxy Manager]
prefix = https://
url = nginxproxymanager.YourPersonalHomeLabSite.dyndns.org
icon = static/images/apps/nginxproxymanager.png
sidebar_icon = static/images/apps/nginxproxymanager.png
description = Docker container for managing Nginx proxy hosts with a simple, powerful interface
open_in = this_tab
groups = admin_only

[Portainer]
prefix = https://
url = portainer.YourPersonalHomeLabSite.dyndns.org
icon = static/images/apps/portainer.png
sidebar_icon = static/images/apps/portainer.png
description = Making Docker management easy
open_in = this_tab
groups = admin_only

[Unifi]
prefix = https://
url = unifi.ui.com
icon = static/images/icons/unifi.png
sidebar_icon = static/images/icons/unifi.png
description = The UniFi® Controller is a wireless network management software solution from Ubiquiti Networks. It allows you to manage multiple wireless networks using a web browser.
open_in = this_tab
groups = admin_only

[Openhab]
prefix = https://
url = openhab.YourPersonalHomeLabSite.dyndns.org
icon = static/images/icons/openhab.png
sidebar_icon = static/images/icons/openhab.png
description = Openhab
open_in = this_tab
groups = public

[Owncloud]
prefix = https://
url = owncloud.YourPersonalHomeLabSite.dyndns.org
icon = static/images/icons/Apps-Owncloud-icon.png
sidebar_icon = static/images/icons/Apps-Owncloud-icon.png
description = Owncloud
open_in = this_tab
groups = public

[Home assistant]
prefix = https://
url = homeassistant.YourPersonalHomeLabSite.dyndns.org
icon = static/images/icons/homeassistant.png
sidebar_icon = static/images/icons/homeasssistant.png
description = Home assistant
open_in = this_tab
groups = admin_only
  • background = https://picsum.photos/1920/1080?blur=5 -> in questo modo ogni volta che farai accesso alla dashboard ci sarà uno sfondo casuale.
  • Rimpiazza “YouMustChooseAGoodPassword” con una password di adeguata complessità. Queste credenziali manterranno al sicuro la configurazione dei tuoi host interni (non pubblici) dato che la dashboard sarà esposta su internet.
  • Uno dei collegamenti è proprio verso l’interfaccia di Nginx Proxy Manager, in questo modo puoi usare il proxy inverso per accedere alla sua stessa interfaccia di gestione url= nginxproxymanager.YourPersonalHomeLabSite.dyndns.org (dovrai prima configurare host come abbiamo fatto per la dashboard) oppure potrai configurare la dashboard con l’indirizzo diretto url= IP_OF_THE_HOMELAB_SERVER:81 (prefix = http://)
  • Gli altri collegamenti potranno essere riferiti a servizi interni alla lan o esterni, come ad esempio unifi.ui.com o qualsiasi altra cosa possa farti comodo nello gestire il server di casa.
  • Le icone dovranno essere caricate manualmente nella dashboard. Usa la funzione drag & drop-choose" nel tab “image”. Mi raccomando al nome dei file!

7 Setup del server DNS locale

Per usare le access list basate sull’ip del mittente è necessario che le richieste locali vengano gestite all’interno della rete senza passare per la wan. Se stai richiedendo una pagina da internet, ad esempio da una connessione mobile, un dns pubblico ti instraderà verso l’interfaccia pubblica del tuo router di casa che a sua volta ti instraderà verso il tuo server locale. E fin qui tutto fila. Al contrario, se la richiesta proviene dalla lan stessa, magari un pc collegato alla stessa rete, allora dobbiamo far in modo di non essere indirizzati al nostro router, uscendo e rientrando dalla nostra rete, ma dobbiamo andare direttamente verso il server locale e il reverse proxy. Solo in questo modo il nostro ip mittente rientrerà all’interno della sottorete e riusciremo a distinguerlo dal traffico che proviene dall’esterno della rete. Per fare questo configureremo un piccolo server dns interno. Per farlo crea il file /opt/homelab/proxy_dashboard/dns/dnsmasq.conf:

1
2
3
4
5
6
server=1.1.1.1
server=8.8.8.8
#explicitly define host-ip mappings
address=/YourPersonalHomeLabSite.dyndns.org/IP_OF_THE_HOMELAB_SERVER
address=/.YourPersonalHomeLabSite.dyndns.org/IP_OF_THE_HOMELAB_SERVER
address=/#.YourPersonalHomeLabSite.dyndns.org/IP_OF_THE_HOMELAB_SERVER

Una volta configurato il server dns interno dovrai configurarlo nella pagina del dhcp del router e/o direttamente sui device stessi come server dns primario della configurazione ip.

8 Aggiungere gli altri host al proxy inverso

Adesso puoi configurare altre rotte al proxy inverso per collegare tutti i tuoi servizi domestici e gestire facilmente la gestione dei certificati per gli https e raggiungerli con un sottodominio facile da ricordare (come mysubdomain.YourPersonalHomeLabSite.dyndns.org).

Navighiamo verso l’interfaccia di Nginx proxy manager, e passiamo alla creazione di access list per restringere l’accessibilità di alcuni host ai soli membri della rete lan, per evitare che alcune risorse siano raggiungibili dall’esterno della rete (per ragioni di sicurezza).

Per farlo http://IP_OF_THE_HOMELAB_SERVER:81, e poi Access list -> Add Access List.

Chiamiamo la access list “LAN” e impostiamo il flag su Satisfy Any. Compilare come descritto dalle immagini:

/it/homelab-dashboard-https/access_list.png
Questa access list restringerà la visibilità della pagina ai soli device presenti in rete locale LAN, escludendolo dalla WAN (connessione a internet).

Ok, ora possiamo creare un host la cui accessibilità sarà limitata all’interno della lan: ![proxy configuration for hosts - SSL Certificates](host_gui_npm.png “Ricorda di impostare “request new ssl certificate” e impostare il flag force ssl sul tab ssl.")

Ottimo, allo stesso modo potrai crearne altri per gli altri servizi (ad esempio home assistant, owncloud, nextcloud …)

![Proxy configuration - Home Assistant Example](home_assistnat_host.png “Dalle impostazioni di home assistant dovrai aggiungere “homeassistant.yourpersonalHomeLabSite.Dyndns.org” come un trusted_proxies”)

9 Ti prudono ancora le mani?

Sull’interfaccia di Nginx Proxy Manager puoi creare una access list che consenta l’accesso dalla LAN o in alternativa l’immissione di username e password in caso di accesso da internet, per avere una configurazione flessibile alle varie esigenze. Per farlo, crea una nuova access list come visto prima, imposta “satisfy any” e aggiungi degli username e password nel secondo tab.

10 Avvertenze

Di base stai esponendo il proxy inverso e tutti gli host su internet, a meno delle access list configurate, e questo può costituire un rischio per la privacy e la sicurezza cibernetica. Per tale motivo è necessario avere sempre un occhio di riguardo per i test e per raffinare la configurazione, accertandosi che tutto stia funzionando correttamente e le uniche cose accessibili su internet siano quelle desiderate.

Se navighi dall’esterno verso il tuo ip pubblico noterai una schermata di errore 404, motivata dal fatto che al proxy inverso è richiesta la pagina web associata a quell’indirizzo ip. Il proxy inverso però non sa quale contenuto fornire, in quanto non è configurato alcun host associato ad un indirizzo ip.

Se vuoi limitare al massimo i servizi esposti su internet ti basta impostare tutti gli host, ad eccezione del principale della dashboard, sulla Access list “LAN”.

Un’ultima cosa. Google Chrome, Edge e i dispositivi Google sembra che abbiano iniziato ad utilizzare i propri servizi dns al posto di quelli del sistema operativo. Questo può creare qualche problema al traffico interno, in quanto noteremo che le richieste interne andranno verso la wan e poi torneranno indietro. Per evitare il problema, dalle impostazioni del browser basta impostare su off la configurazione “use secure dns”. In alternativa, se la tua casa è dotata di firewall, puoi bloccare le richieste di dns verso i server autoritativi di Google (magari consentendoli solo al tuo server locale). Ho notato inoltre che è meglio disabilitare il flag #use-dns-https-svcb-alpn in edge://flags/ e chrome://flags/. Ne parlo qui

11 Bisogno di una mano?

Se qualcosa non funziona come dovrebbe non preoccuparti, sei sulla strada giusta. Fai una passata per verificare punto per punto che i prerequisiti siano soddisfatti e assicurati di partire da un ambiente il più possibile pulito. In caso ci siano ancora dei problemi non esitare a lasciare un commento in modo che io o qualcun altro ti possa aiutare.