Mettre en place un contrôleur UniFi unique est très simple, mais dans des environnements de production, il est souvent nécessaire d’aller un peu plus loin que la simple mise en route d’une VM et d’y installer les paquets appropriés. En effet, il est généralement judicieux de faire appel à la magie du failover ou du load balancing (mise en place décrite dans cet article), mais aussi au reverse-proxy.
A quoi un reverse-proxy pourrait-il bien servir, me direz-vous. À ne pas exposer l’entièreté du serveur au grand public, pour commencer, mais aussi à tirer parti du cache qu’offre le reverse proxy. Ceci dans le but d’accélérer les requêtes par exemple.
Enfin, le reverse-proxy peut s’avérer très utile si on ne possède qu’un nom de domaine (avec ou sans sous-domaine), mais que l’on souhaite mettre en place plusieurs “points d’entrée” (Par exemple : https://unifi.domaine.fr et https://unms.domaine.fr ou encore https://tech.domaine.fr/unifi ou https://tech.domaine.fr/unms qui pointeront sur le même reverse-proxy qui fera l’aiguillage vers les machines correspondantes).
C’est ce dernier aspect du reverse-proxy que nous allons mettre en place dans cet article.
– Nous commencerons par installer et configurer Nginx pour exposer notre point d’entrée,
– nous installerons et configurerons Certbot (L’ensemble de scripts pour automatiser letsencrypt) pour installer des certificats TLS valides,
– enfin nous testerons le tout afin de s’assurer que tout fonctionne.
Certains aspects de la configuration ne seront pas traités par cet article et seront considérés acquis ou déjà en place. Si vous souhaitez en savoir plus sur certains de ces aspects, je vous conseille les excellents tutos DigitalOcean, et bien sûr tous les autres.
Pour ce qui est de la configuration, nous considèrerons ici que la machine est installée sous Ubuntu 16.04 (LTS), le réseau configuré et apt à jour. Dans mon cas, la machine est installée en local uniquement (zone Labo isolée, sur une infra dédiée), derrière un pare-feu depuis lequel je configurerai des redirections de ports vers le reverse-proxy :
– 80 (http)
– 443 (https)
– 8080 (adoptions des périphériques UniFi)
– 3478 (STUN pour la communication entre les périphériques UniFi et le contrôleur)
– 6789
La liste des ports utilisé par Unifi est disponible sur le site Ubiquiti à cette adresse : https://help.ubnt.com/hc/en-us/articles/218506997-UniFi-Ports-Used
Nous partons également du principe que vous possédez déjà un nom de domaine qui pointe vers l’adresse IP de votre infrastructure (Firewall, Machine, etc …) et un UniFi controller, peut en importe la version.
Nous aurons au final l’architecture suivante :
Installation et configuration de Nginx
Pour l’installation de Nginx, je vous dirige vers le tuto de DigitalOcean qui est très complet : https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-ubuntu-16-04
Une fois que vous avez un Nginx fonctionnel (Une page “Welcome to Nginx” s’affiche lorsque pour entrez l’adresse IP de la machine dans un navigateur), il faut passer à la configuration de ce dernier.
On va configurer le serveur pour “servir” du contenu à l’adresse unifi.lab.oxyline.ovh. On commence par se rendre dans le répertoire de configuration des hôtes virtuels de Nginx
$ cd /etc/nginx/conf.d/
Nous allons éditer notre propre fichier de conf : unifi.conf. Ce fichier est automatiquement ajouté à la conf de nginx (Directive include dans le fichier de conf général de Nginx)
J’explique dans les commentaires l’utilité des différentes parties
$ sudo vi unifi.conf
# On sert sur le port 80 pour rediriger vers le 443
server {
listen 80;
# On écoute sur toutes les interfaces mais seuls les appels à l'adresse ci-dessous déclencheront le traitement de notre fichier de conf
server_name unifi.lab.oxyline.ovh;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name unifi.lab.oxyline.ovh;
# On logue les acces et les erreurs dans leur journaux respectifs
error_log /var/log/nginx/unifi-443-error.log;
access_log /var/log/nginx/unifi-443-access.log;
# Partie importante pour s'affranchir des erreurs "Websocket connexion error" sur l'interface de l'UniFi. Dans les grandes lignes, on gère les alertes
# dynamiques sur le dashboard UniFi qui seront (En développement et disponibles dans les prochaines versions de UniFi) véhiculées par websockets.
# Plus d'infos : https://en.wikipedia.org/wiki/WebSocket
location /wss/ {
proxy_pass https://lab-ubnt-uni01.lab:8443;
proxy_http_version 1.1;
proxy_buffering off;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_read_timeout 86400;
}
# C'est ici que tout se joue. C'est avec ce bloc qu'on passe nos requêtes au serveur UniFi (Appelé Upstream)
location / {
proxy_pass_header Authorization;
proxy_pass https://lab-ubnt-uni01.lab:8443/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# Cette partie est également importante, elle servira pour le renouvellement des certificats par LetsEncrypt.
location /.well-known/acme-challenge/ {
root /usr/share/nginx/html;
}
}
On créé le répertoire /usr/share/nginx/html pour que Nginx puisse l’exposer au besoin
$ sudo mkdir /usr/share/nginx/html
Pour la suite, et pour que Certbot (que nous installerons juste après) ai conscience de l’existence de notre configuration il faut l’activer. Pour le faire c’est très simple, il nous suffit de redémarrer Nginx.
$ service nginx restart
On enregistre et on lance la commande
ubntrvs@lab-ubnt-rvs01:/etc/nginx/conf.d$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Nous avons à présent notre config prête. Il nous reste à installer LetsEncrypt pour demander et récupérer des certificats valides.
Installation et configuration de Certbot (LE)
Certbot, c’est le petit robot qui va vous simplifier la vie côté automatisation de l’obtention de vos certificats avec LetsEncrypt.
Comme pour l’installation de Nginx, je vous suggère le tuto de DigitalOcean pour installer LE : https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-16-04
En résumé, on ajoute le repo, on met à jour les dépôts, et on installe Certbot
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install python-certbot-nginx
Et après, on demande notre certificat :
sudo certbot --nginx -d unifi.lab.oxyline.ovh
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator nginx, Installer nginx
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): votre.adresse@email.com
Repondez “A” pour accepter les termes, puis oui ou non si vous souhaitez communiquer votre adresse email. Vous verrez Certbot aller modifier le fichier de conf précédemment écrit par nos soins juste au dessus.
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for unifi.lab.oxyline.ovh
Waiting for verification...
Cleaning up challenges
Deploying Certificate to VirtualHost /etc/nginx/conf.d/unifi.conf
La prochaine question permet à Certbot de savoir s’il doit, ou non, modifier notre configuration pour y ajouter une redirection HTTP -> HTTPS. Nous répondrons non (Choix 1) car nous l’avons déjà pris en compte dans notre configuration.
Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 1
Redirecting all traffic on port 80 to ssl in /etc/nginx/conf.d/unifi.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations! You have successfully enabled https://unifi.lab.oxyline.ovh
You should test your configuration at:
https://www.ssllabs.com/ssltest/analyze.html?d=unifi.lab.oxyline.ovh
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/unifi.lab.oxyline.ovh/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/unifi.lab.oxyline.ovh/privkey.pem
Your cert will expire on 2019-05-30. To obtain a new or tweaked
version of this certificate in the future, simply run certbot again
with the "certonly" option. To non-interactively renew *all* of
your certificates, run "certbot renew"
- Your account credentials have been saved in your Certbot
configuration directory at /etc/letsencrypt. You should make a
secure backup of this folder now. This configuration directory will
also contain certificates and private keys obtained by Certbot so
making regular backups of this folder is ideal.
- If you like Certbot, please consider supporting our work by:
Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le
Certbot gère le redémarrage de Nginx. Tout doit rouler à présent et si votre upstream (le serveur UniFi) fonctionne bien, vous devez pouvoir vous connecter dessus à l’adresse que vous aurez défini (Dans notre cas, http(s)://unifi.lab.oxyline.ovh).

plus de nouveau articles? j’attend la partie 2 moi
Patience, petit scarabée 😛
Nan, ça arrive, il faut que je prenne le temps de mettre mes idées au propre 🙂