samedi 28 novembre 2015

Box et Reverse Proxy

Notions fondamentales

Une box ADSL comprend au minimum deux composants principaux:
  • Un routeur
  • Une passerelle

Routeur

Le routeur sera doté d'une IP publique ou externe de type 93.154.12.218, qui permettra de le contacter depuis Internet. Dans un premier temps, le routeur d'une box ADSL va rejeter tout le trafic entrant depuis Internet. Il ne s'agit pas d'un parefeu mais plus simplement, il ne sait que faire de ce trafic entrant ...
Un routeur à pour fonction principale de router les paquets entre différents réseaux: Réseau privé vs Réseau internet

Passerelle

La passerelle comporte une adresse IP locale de type 192.168.1.1.
Il s'agit d'une notion logique qui constitue un point de sortie lorsque l'adresse d'un hôte de destination est introuvable sur le réseau local.

NAT/PAT

Un équipement connecté au réseau local ou privé sera affecté d'une adresse locale de type 192.168.1.10. Cet équipement peut envoyer des requêtes à destination d'Internet (173.194.67.94) qui seront transmises au routeur. Malheureusement, le routeur ne pourra pas transmettre à son destinataire (173.194.67.94) l'adresse locale de l'expéditeur (192.168.1.10) car celle-ci est inconnue d'Internet. Le routeur va substituer l'adresse locale de l'expéditeur par son adresse IP publique, c'est la Network Address Translation (NAT):
192.168.1.10 => 93.154.12.218.
Pour identifier sans ambiguïté les deux interlocuteurs, il sera nécessaire d'ajouter un port de communication en plus des adresses IP. Le couple adresse IP:Port est appelé socket réseau. En procédant d'une manière analogue aux adresses IP, le routeur va réaliser des translations de ports lors de communication entre différents réseaux: c'est la Port Address translation (PAT).

Hébergement d'applications

Il s'agit d'autoriser l'accès à des applications locales depuis Internet. Dans ce cas, les clients Internet connaissent uniquement l'IP publique du routeur de la Box (soit directement soit par l'intermédiaire d'un nom de domaine).
Pour un serveur Web qui écouterait sur le port 80 d'une machine 192.168.1.10, le routeur doit accepter des requêtes sur son IP publique et sur le port 80. Si ce routeur n'est pas affecté de régles, il va détruire tout le trafic entrant !
Il devient nécessaire de configurer des règles NAT/PAT sur le routeur afin d'autoriser certains trafics entrants depuis Internet. On pourra  par exemple, écrire une consigne pour que le trafic entrant sur le port 80 soit dirigé vers le port 1080 d'une machine locale 192.168.1.10.
  • 93.154.12.218:80 => 192.168.1.10:1080
  • 93.154.12.218:90 => 192.168.1.20:2090
  • ...

Intérêt du Reverse Proxy

Serveur de domaines

Depuis l'apparition des nano-pc, les réseaux domestiques ressemblent de plus en plus à de petits réseaux d'entreprises. On trouve désormais sur de nombreux réseaux domestiques: plusieurs serveurs (nano-pc) hébergeant chacun plusieurs services eux mêmes à l'écoute sur plusieurs ports ...
Il devient très difficile de se souvenir des différentes url et des règles NAT/PAT correspondantes. On peut éviter ces nombreuses règles en redirigeant la totalité du trafic entrant vers un Reverse Proxy qui traduira des requêtes de domaine pour les rediriger vers le service adéquat:
  • http://mondomaine.music.no-ip.biz => 192.168.1.10:1090
  • http://mondomaine.video.no-ip.biz => 192.168.1.11:1091
  • http://mondomaine.camera.no-ip.biz => 192.168.1.12:1092
  • ...

Blocage de ports

De plus, un Reverse Proxy sera très utile pour passer outre certains blocages de ports lors d'une connexion à un réseaux domestique depuis:
  • un réseau d'entreprise (proxy)
  • un réseau mobile
  • un hotspot wifi
  • ...

Connexions SSL

SSL est un protocole utilisé abondamment dans les réseaux domestiques pour sécuriser les accès depuis Internet. En effet, on supposera que personne ne souhaite émettre en clair sur Internet ses informations de connexion pour accéder à des applications Web d'un réseau domestique ...
Un reverse proxy de type NginX peut aussi assurer le rôle d'un front-end HTTPS vers de multiples back-end HTTP. Dans ce cas, le protocole SSL sera entièrement géré par NginX en front-end Internet afin de conserver un simple protocole HTTP pour l'intégralité du réseau domestique local:
[Internet] (web browser) HTTPS [Réseau domestique](front-end Nginx) HTTP (back-end services)

Reverse proxy NginX

Installation et configuration

L'installation du paquet nginx se réalise très simplement depuis un système linux debian:
sudo apt-get install nginx 
 Puis il faut créer ou mettre à jour le fichier de configuration du proxy localisé sous /etc/nginx/nginx.conf:

user www-data;
worker_processes 4;
pid /var/run/nginx.pid;
events {
    worker_connections 768;
}
http {
    # Basic Settings
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;    include /etc/nginx/mime.types;
    default_type application/octet-stream;
    # Logging Settings
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;
    # Gzip Settings
    gzip on;
    gzip_disable "msie6";
    # Virtual Host Configs
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}


Maintenant, que le proxy NginX est prêt à fonctionner, il faut définir comment NginX va réagir aux requêtes qu’il recevra. Pour cela, il faut écrire des règles de redirection dans un fichier de configuratio localisé sous le répertoire /etc/nginx/sites-enabled.


Les fichiers de configuration des sites actifs contenus sous le répertoire /etc/nginx/sites-enabled  sont en général des liens symboliques vers le répertoire /etc/nginx/sites-available

pi@rpi-proxy /etc/nginx $ ls -alrht /etc/nginx/sites-enabled/
total 8,0K
drwxr-xr-x 5 root root 4,0K aout   9 21:09 ..
lrwxrwxrwx 1 root root   39 nov.  29 17:21 default -> /etc/nginx/sites-available/domain_no-ip
drwxr-xr-x 2 root root 4,0K nov.  29 17:27
.

NginX prenant en compte les règles dans l’ordre, il faut commencer par lui dire que toutes les requêtes pour un domaine donné arrivant par un port donné doivent être renvoyées vers le serveur web. Dans l'exemple ci-dessous, on demande à NginX d’écouter le port 80 et de rediriger les requêtes pour le domaine tom23.com vers le serveur web situé sur l’ip 192.168.2.56 du réseau domestique local.
server { 
    listen 80; 
    server_name tom23.com; 
    location / { 
        proxy_pass http://192.168.2.56/  
    } 
}

SSL et certificats auto-signé

Il faut d'abord  installer openssl afin de créer les clés SSL et le certificat :

apt-get install openssl
Sous le répertoire /etc/ngnix, il faut genérer une clé RSA en 1024 bits:
openssl genrsa -out ngnix.key 1024
A partir de cette clé, on va pouvoir créer le certificat générique:
openssl req -new -key nginx.key -out nginx.csr
Puis on crée finalement le certificat au format x509:
openssl x509 -req -days 365 -in nginx.csr -signkey nginx.key -out nginx.crt

La configuration du serveur NginX se fait par modification du fichier contenu
dans le répertoire /etc/nginx/sites-enable:
server {
    listen 443;
    server_name localhost;
    root html;
    index index.html index.htm;
    ssl on;
    ssl_certificate nginx.crt;
    ssl_certificate_key nginx.key;
    ssl_session_timeout 5m;
    ssl_protocols SSLv3 TLSv1;
    ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv3:+EXP;
    ssl_prefer_server_ciphers on;
    location / {
        proxy_pass http://tom23:8080;
    }
    location /toto {
        proxy_pass http://tom24:8026/toto;
    }
}
server {
    listen 443;
    server_name toto.no-ip.biz;
    root html;
    index index.html index.htm;
    ssl on;
    ssl_certificate nginx.crt;
    ssl_certificate_key nginx.key;
    ssl_session_timeout 5m;
    ssl_protocols SSLv3 TLSv1;
    ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv3:+EXP;
    ssl_prefer_server_ciphers on;

    location / {
        try_files $uri $uri/ =404;
    }
    location /toto {
        proxy_pass http://
tom24:8026/toto;
    }
}
server {
    listen 443;
    server_name titi.no-ip.biz;
    root html;
    index index.html index.htm;
    ssl on;
    ssl_certificate nginx.crt;
    ssl_certificate_key nginx.key;
    ssl_session_timeout 5m;
    ssl_protocols SSLv3 TLSv1;
    ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv3:+EXP;
    ssl_prefer_server_ciphers on;

    location / {
        proxy_pass http://tom25:8080;
    }
}

Aucun commentaire:

Enregistrer un commentaire