DNS-MENTEURS

Apacherpipfsensejeedom

J'utilise de plus en plus de service Web dans mon installation informatique personnelle.
Quelques usages dans l'ordre d'importance:

  1. Ma domotique avec l'excellent JEEDOM 
  2. Mes caméras
  3. Mon NAS sous Open Media Vault 
  4. Et pas mal d'autres choses
Quand on commence à avoir plusieurs services accessible depuis l'éxtérieur plusieurs problématiques se posent:

  • Comment acceder avec une seule adresse IP à plusieurs services en interne sur le même port ?  ( https 443 , http 80) 
  • Comment gérer la sécurité ? (  est ce bien sécurisé d'accéder en direct à vos services ? Jeedom ouvert en direct sur internet ? ) ( en cas d'intruision vérifier chaque log de chaque service )
  • Certains services ne sont pas sécurisable en https , est ce sérieux d'y accéder directement depuis l'extérieur sans intermédiaire ?? ( mettre un VPN  a chaque fois ???)
  • Comment gérer la performance ? des choses ne pourraient t'elle pas être compréssées ou mise en cache pour aller plus vite ?

Et bien tout cela, c'est le role du REVERSE PROXY
!rp
cf wikipedia

Le reverse proxy va vous permettre avec un seul équipement d'accéder à plusieurs services Web internes en en faisant qu'une seule redirection de port
Le reverse proxy va ajouter de la sécurité, car il va vous permettre de ne plus laisser vos services web accessible en fontal sur internet
Le reverse proxy va ajouter de la sécurité, car il va vous permettre de chiffrer les flux écoutables sur internet, même vers des services Web qui ne sont pas sécurisés
Le reverse proxy va ajouter de la performance car il va mettre en cache des éléments statiques et va même pouvoir compresser des flux.

Le reverse proxy sur mon réseau privée.

Quand j'ai réfléchi à comment implémenter mon Reverse proxy j'ai  voulu ajouter un peu de sécurité.
Je trouvait qu'un reverse proxy accessible depuis internet, avait plutot sa place dans une DMZ

En effet il est plus sur de positionner son RP dans une zone qui n'a pas un full accès à tout votre réseau.
Je voulais que le RP n'ai accès qu'aux services qu'il est censé "reverse proxifier"  
C'est à dire les ports 443 ou 80 de mes services internes

Voiçi le schéma simplfié de mon réseau focusé sur le RP

lan

J'ai la chance d'avoir choisi un PFSENSE comme routeur / Firewall 

De plus j'avais pensé les choses au départ.

Mon PFSENSE est installé sur un ALIX 2D13 ( 3 ports Ethernet)

alix

Je l'utilisais pour le WAN et le LAN, il me restait donc un port pour la DMZ

Coté Gandi:

il faudra bien sur créer les entrées DNS qui pointe vers l'ip publique de votre Box

Pour ma part cam et Maison

Coté PFSENSE:


on remarque que je n'utilise aucune IP dans mes Virtual Hosts.

Que des FQDN, le but et d'utiliser que la fonction DNS 

Je vais utiliser la technique du SPLIT DNS

Même FQDN mais résolu différement en fonction de la requête:

J'ai donc utilisé mon PFSENSE en tant que resolveurs DNS

Ce qui est très pratique, car je peux lui donner des noms qu"il resoudra avec une IP locale pour mes équipement interne.

1 - J'ai crée activé ma 3ème interface et je l'ai nommée DMZ
2 - Renseigner l'IP de cette interface : Ce sera la passerelle du reverse Proxy

pfsenseip

3 - J'ai utilise une reservation DHCP statique pour fournir l'IP au Raspberry

pfsensedhcp
4 - J'ai créer 2 entrée DNS dans mon resolveur PFSENSE ' cela marche aussi si vou sutilisez PFSENSE en Redirecteur)

cam.monfomaine.fr ---> Pour la caméra
maison.mondomaine.fr ---> Pour Jeedom

pfsensedns

Le Split DNS est simple voiçi uin schéma de ce qui va se passer.

schemadns




Pas besoin de paramétrer des règles de routage PFSense s'occupe de tout.

Il faut par contre paramétrer des règles de NAT et de Firewall


NAT :  Tous ce qui arrive sur le port 443 est natté vers le RP

pfsensenat

Firewall : On ouvre les accès du RP vers les port 443 de Jeedom et 80 de la caméra
On autorise ausi le RP à faire des requetes DNS vers PFSENSE

pfsensefirewall


Attention : PFSENSE m'avait créer une regle de NAT Unbound qui me remplacait l'ip source par l'ip de la DMZ
Du coup dans les logs du reverse proxy on ne voyais que l'ip de la passerelle, ce qui n'est pas pratique pour analyser

Bienn désactiver la regle qui dit Sque tout ce qui vient de l'interface DMZ soit natté par DMZ Adresse. ( dernière ligne)
nat unbound


Voilà coté PFSENSE

Installation du reverse Proxy:

J'ai choisi d'utiliser un équipement tiers : un Raspberry Pie 3

j'ai commencé par une installation classique de Rapian strech Lite ( pas besoin d'interface graphique)

https://www.raspberrypi.org/downloads/raspbian/

Je vous conseille d'utiliser d'Etcher : qui est très simple à prendre en main :

https://etcher.io/

Je ne détaille pas l'installation de raspian

Placer une IP Fixe sur le raspberry 

Renseigner comme passerelle, l'adresse IP du PFSENSE ( interface DMZ)

Renseigner le DNS qui sera le pfsense.

Une fois le raspian installé on se lance dans l'installation du RP:

je pars du principe que vous avez déjà généré un certificat SSL chez un registrar

Je vais détailler un peu ce que j'ai fait pour un Certificat Gandi.

Je passe très vite sur la création du certificat Gandi ; Tout est expliqué sur le site

1 - Achat du certificat Gandi
2 - Création du CSR à fournir à Gandi en ligne de commande

openssl req -nodes -newkey rsa:2048 -sha256 -keyout maison.key -out maison.csr
3 - Copie du CSR sur le site de gandi
4 - Achat du certificat
5 - Validation du Certificat par ajout d'enregistrement CNAME dans votre DNS
6 - Récupération des certificats

gandi

g

7 - Vous devez avoir 4 fichiers :

GandiStandardSSLCA2.pem  maison.crt  maison.csr  maison.key
8 - Copier ces fichiers dans par exemple :
/etc/ssl/

Pour ma part j"ai placé les fichiers de certificats dans /etc/ssl/
sudo apt-get install apache2
sudo a2enmod ssl
sudo a2enmod proxy
sudo a2enmod proxy_http


Le virtual host pour Jeedom

vi /etc/apache2/sites-available/rp.conf

<VirtualHost *:443>
ServerName maison.domaine.fr
SSLEngine on
SSLProxyEngine On
SSLCertificateFile /etc/ssl/maison.crt
SSLCertificateKeyFile /etc/ssl/maison.key
SSLCertificateChainFile /etc/ssl/GandiStandardSSLCA2.pem
SSLVerifyClient None

HostnameLookups off
ProxyRequests off
ProxyVia off
ProxyPass / https://maison.domaine.fr/
ProxyPassReverse / https://maison.domaine.fr/

<Proxy *>
Order allow,deny
allow from all
</Proxy>
ErrorLog ${APACHE_LOG_DIR}/rproxy_error.log
CustomLog ${APACHE_LOG_DIR}/rproxy_access.log combined
</VirtualHost>

Pour ma caméra même principe:

vi /etc/apache2/sites-available/zcam.conf
<VirtualHost *:443>
ServerName cam.domaine.fr
SSLEngine on
SSLProxyEngine On
#SSLProtocol All
SSLCertificateFile /etc/ssl/maison.crt
SSLCertificateKeyFile /etc/ssl/maison.key
SSLCertificateChainFile /etc/ssl/GandiStandardSSLCA2.pem
SSLVerifyClient None

HostnameLookups off
ProxyRequests off
ProxyVia off
ProxyPass / http://cam.domaine.fr/
ProxyPassReverse / http://cam.domaine.fr/
<Proxy *>
Order allow,deny
#Deny from all
allow from all
</Proxy>
LogLevel warn
ErrorLog ${APACHE_LOG_DIR}/rproxy_error.log
CustomLog ${APACHE_LOG_DIR}/rproxy_access.log combined
</VirtualHost>

cd /etc/apaches/site-available
a2ensite rp.conf
a2ensite zcam.conf
/etc/init.d apache2 reload

Voila notre Reverse proxy est configuré



Si tout est OK  depuis l'extérieur on accéde bien à notre Jeedom et à notre Cam en passant
Par le Reverse Proxy

accesext

acces ext

Si tout est OK  depuis l'interne on accéde bien à notre Jeedom et à notre Cam en passant
en direct sur le lan ( DNS Résolu en local par pfsense)

Par contre vous aurez remarqué qu'une erreur de certificat est présent sur la cam

Ce qui est normal car j'utilise le même certificat dans les 2 virtual Hots 

Et ce certificat à été grée pour maison.mondomaine.fr et non cam.mondomaine.fr

Cela n'est pas grave, j'ai confiance en mon certificat, et le but est de chiffrer les flux vers ma 

caméra.