Asustor Mise en place d'un Reverse Proxy sous Docker (Niveau Intermédiaire)

Drthrax74

Chevalier Jedi
1 Janvier 2021
470
110
83
Mise en place d'un Reverse Proxy sous Docker (Niveau Intermédiaire)

Présentation du schéma du Reverse Proxy
1646496563140.png

0. Qu'est qu'un Reverse Proxy ?

Un Reverse Proxy est un type de serveur, habituellement placé en frontal de serveurs web.


1. Pourquoi le mettre en place ?
- Le reverse proxy se chargera de répondre au demande au lieu que se soit le serveur en direct.
- Evite à un attaquant de tape l'IP WAN suivi du port pour tombé sur la machine Backend.
- Il se charge de la mise à jour des Certificats SSL dans le cas de Let's Encrypt.


2. Comment mettre en place le Reverse Proxy ?
Pour la mise en place d'un Reverse Proxy, il existe plusieurs méthode, mais je vais me concentré sur celle avec Docker avec le panel d'administration Portainer.

3. Installation de Docker sous Asustor. (Portainer inclus)
Aller sur le panel d'administration du NAS Asustor puis clique sur App Central.

1646497847530.png

Dans la partie supérieur droit, dans le champs de recherche taper le mot docker-ce. (Ne pas installer le Registry Pack, inutile)
Puis cliquer sur Installer.


1646497509705.png

Faire de même avec Portainer-ce.

1646497616535.png

Lors de l'installation, cette fenêtre apparaît:

1646497665826.png

Le port par défaut pour portainer est 19943, si vous avez un Pare-Feu, pensez à crée une règle d'autorisation.

4. Installation de Portainer

Depuis l'interface du NAS, cliquer sur l'icône applicatif Portainer CE.

1646497896512.png

Configurer Environnements Portainer-CE:

Dans le menu Portain.IO, cliquer le mot Environnements puis sur LOCAL.
1647044682825.png



Récupérer l'adresse IP du NAS en regardent l'URL: (Mon cas: 192.168.1.2)
1647044830091.png


Dans le Champs Public IP, taper l'adresse IP du NAS puis cliquer sur Update Environnement.
1647044900538.png

Avantage:
- Lorsqu'on aura un conteneur avec un port exposer et qu'on clique l'adresse sera celle du NAS : PORT au lieu de 0.0.0.0 : PORT .


----------------------------

Création du STACK:
Un Stack est l'équivalent d'un fichier docker-compose.yml mais pour portainer.

Composition du Stack:
- Un Service qui utilisera l'image linuxserver/mariadb. (Base de donnée MariaDB)
- Un Service qui utilisera l'image jc21/nginx-proxy-manager. (Reverse Proxy)

- Un Service qui utilisera l'image pbertera/syslogserver. (Syslog)
- Un Service qui utilisera l'image amir20/dozzle.

Fonctionnement:
- Le conteneur MariaDB communiquera avec le conteneur Reverse-Proxy (Communication dans les 2 sens)
- Le conteneur Reverse Proxy qui exposera le port 80 et 443. (On fera du NAT)

Exemple:
Le conteneur pour le service web (Nginx) utilise le port 80 (HTTP) et 443 (HTTPS).
En sortie on pourra définir que le port HTTP est sur le 8080 et HTTPS 1443 par exemple


1647046168592.png


Création du Stack "supervision" et coller le code suivant:

YAML:
En cours de peaufinement

1647046905363.png


- La zone Name correspond au nom des conteneurs, j'ai mis en préfixe CN_XXXXX.
- La zone State est l'état du conteneur. (Healthy = Bonne santé, running = En cours)
- Le zone Published ports sont le port en sorti du conteneur, il son cliquable.

Le port 1443, lorsqu'on le clique il rediriger sur une page en HTTP, il faudra remplacer http en https.
Le port 81 est le port du panel de Reverse Proxy.

Identifiant par défaut du Reverse Proxy
Email: admin@example.com
Password: changeme


CONFIGURATION PARE-FEU ADM :
1647047327395.png



ADM Configuration: (Si votre pare-feu est actif)

1647047640978.png

1647047665988.png

Connexion au panel Web Reverse Proxy.



Identifiant par défaut du Reverse Proxy
Email: admin@example.com
Password: changeme
1647047913082.png

1647536842066.png

Dans mon exemple, le port 80,443 sont le service Web (HTTP et HTTPS) et le 81 le panel de supervision.
Le port Externe Correspond depuis l'extérieur
Le port Interne:
L'adresse IP en interne dois être l'IP du NAS pour que sa marche.

Ensuite il suffit d'aller sur l'adresse suivant: http://monIPWAN:81
Message automatiquement fusionné :

Aller sur le site de NO-IP, crée un Host virtuel. (monadress.ddns.net par exemple)

Ensuite aller sur le panel Nginx Reverse Proxy.
sur la partie supérieur droite, cliquer sur 'ADD Proxy Host' ce qui permet d'ajouter un domaine a une IP LOCAL suivis de son port et du type de protocole (HTTP/HTTPS)


1647537101318.png



Supposons que mon NAS est accessible à l'adresse suivante: HTTP://192.168.1.32:8000

En prenant mon adresse, je vois que c'est du HTTP sur l'ip 192.168.1.32 avec le port 8000.



Domain Names: Votre nom de domaine.
Scheme: HTTP
Forward Hostname / IP: Adresse IP ou le nom de la machine (Résolvable via le DNS en local)
Forward Port: 80



1647537398151.png


Si le "SSL certificate" est par défaut, le domaine ne sera accessible qu'en HTTP. (http://mondomain.drthrax74.ddns.net)


1647537491151.png


Pour avoir une URL en HTTPS, il suffit de sélectionne dans le menu déroulant "Request Let's Encrypt" qui sert à demander un certificat SSL à Let's Encrypt.


1647537454202.png


Cocher la Case Force SSL et puis cocher la case "I agree to let's Encrypt Terms of Service" puis sur Save
1647537634798.png

Une fois valider, une ligne apparaît, on voit le domaine à gauche "mondomain.drthrax74.ddns.net qui envoie en interne sur le serveur http://192.168.1.32:8000 (On peux teste l'url en interne pour confirmer le bon fonctionnement)

Si on désire tester l'url, il suffit de cliquer sur le domaine.


1647537727910.png


Les 2 Points à droite, servent à éditer ou à mettre hors ligne le domaine (Cas d'une maintenance par exemple)

N'oublier pas que trop de demande Let's encrypt par jours bloque 24 H votre IP.
Message automatiquement fusionné :




Il y a 3 conteneurs:
- Une base de donnée
- Un serveur Phpmyadmin pour gérer la BDD
- Un service Reverse proxy qui utilise la BDD.

Le conteneur Reverse Proxy attend que la BDD soit opérationnel avant de se lancer. (Depends_on)


YAML:
################
version: '3.9' #
services:      #
################
#
#
#################################################################
# docker exec -ti CN_MariaDB /usr/bin/top                       #
 MariaDB:                                                       #
  # ----------------------------------------------------------- #
  image: 'linuxserver/mariadb'                                  #
  container_name: 'CN_MariaDB'                                  #
  network_mode: 'bridge'                                        #
  # ----------------------------------------------------------- #
  hostname: 'MariaDB'                                           #
  domainname: 'LAN'                                             #
  # ----------------------------------------------------------- #
  restart: 'unless-stopped'                                     #
  # ----------------------------------------------------------- #
  environment:                                                  #
   # ---------------------------------------------------------- #
   TZ: 'Europe/Paris'                                           #
   # ---------------------------------------------------------- #
   MYSQL_ROOT_PASSWORD: 'root'                                  #
   MYSQL_DATABASE: 'ReverseProxy'                               #
   # ---------------------------------------------------------- #
   MYSQL_USER: 'admin'                                          #
   MYSQL_PASSWORD: 'admin'                                      #
  # ----------------------------------------------------------- #
  volumes:                                                      #
   - 'MariaDB:/config'                                          #
  # ----------------------------------------------------------- #
  expose:                                                       #
   - '3306'                                                     #
  # ----------------------------------------------------------- #
  healthcheck:                                                  #
     test: ["CMD", "mysqladmin", "ping", "--silent"]            #
#################################################################
#
#
#################################################################
 ReverseProxy:                                                  #
  # ----------------------------------------------------------- #
  image: 'jc21/nginx-proxy-manager:latest'                      #
  container_name: 'CN_ReverseProxy'                             #
  network_mode: 'bridge'                                        #
  # ----------------------------------------------------------- #
  hostname: 'ReverseProxy'                                      #
  domainname: 'Lan'                                             #
  # ----------------------------------------------------------- #
  restart: 'unless-stopped'                                     #
  # ----------------------------------------------------------- #
  depends_on:                                                   #
   MariaDB:                                                     #
    condition: 'service_healthy'                                #
  # ----------------------------------------------------------- #
  environment:                                                  #
   # ---------------------------------------------------------- #
   PUID: '1004'                                                 #
   PGID: '1004'                                                 #
   TZ: 'Europe/Paris'                                           #
   # ---------------------------------------------------------- #
   DB_MYSQL_HOST: 'db'                                          #
   DB_MYSQL_PORT: '3306'                                        #
   # ---------------------------------------------------------- #
   DB_MYSQL_NAME: 'ReverseProxy'                                #
   DB_MYSQL_USER: 'admin'                                       #
   DB_MYSQL_PASSWORD: 'admin'                                   #
   # ---------------------------------------------------------- #
  # ----------------------------------------------------------- #
  ports:                                                        #
   - '1800:80'   # HTTP                                         #
   - '1443:443'  # HTTPS                                        #
   - '181:81'    # WebUI                                        #
  # ----------------------------------------------------------- #
  volumes:                                                      #
   - 'LetsEncrypt:/etc/letsencrypt'                             #
   - 'ReverseProxy:/data'                                       #
  # ----------------------------------------------------------- #
  links:                                                        #
   - 'MariaDB:db'                                               #
  # ----------------------------------------------------------- #
  healthcheck:
   test: ["CMD", "curl", "-f", "http://localhost"]
   interval: '30s'
   timeout: '10s'
   retries: '3'
   start_period: '3s'
#################################################################
#
#
#################################################################
# docker exec -ti CN_PHPMyAdmin /usr/bin/top                    #
 PHPMyAdmin:                                                    #
  # ----------------------------------------------------------- #
  image: 'phpmyadmin/phpmyadmin'                                #
  container_name: 'CN_PHPMyAdmin'                               #
  hostname: 'PHPMyAdmin'                                        #
  domainname: 'LAN'                                             #
  # ----------------------------------------------------------- #
  network_mode: 'bridge'                                        #
  # ----------------------------------------------------------- #
  restart: 'always'                                             #
  # ----------------------------------------------------------- #
  environment:                                                  #
   # ---------------------------------------------------------- #
   #PMA_ARBITRARY: '0'            #
   PMA_HOST: 'mysql'              #
   PMA_PORT: '3306'               #
   # ---------------------------- #
   #PMA_PMADB: 'phpmyadmin'       #
   # ---------------------------- #
   PMA_USER: 'admin'              #
   PMA_PASSWORD: 'admin'          #
   # ---------------------------- #
  # ----------------------------------------------------------- #
  ports:                                                        #
   - '1000:80'                                                  #
  # ----------------------------------------------------------- #
  links:                                                        #
   - 'MariaDB:mysql'                                            #
#################################################################
#
#
#################################################################
# Déclaration des volumes #
###########################
volumes:            #
 # ---------------- #
 LetsEncrypt:       #
  external: 'false' #
 # ---------------- #
 MariaDB:           #
  external: 'false' #
 # ---------------- #
 ReverseProxy:      #
  external: 'false' #
 # ---------------- #
#####################
 

Pièces jointes

  • 1646497163372.png
    1646497163372.png
    28.3 KB · Affichages: 3
  • 1646497299773.png
    1646497299773.png
    131.3 KB · Affichages: 1
  • 1646497405235.png
    1646497405235.png
    133.1 KB · Affichages: 2
  • 1646497903935.png
    1646497903935.png
    18.2 KB · Affichages: 0
  • 1647044781545.png
    1647044781545.png
    1.6 KB · Affichages: 0
  • 1647045554421.png
    1647045554421.png
    1.6 KB · Affichages: 0
  • 1647045558723.png
    1647045558723.png
    7.1 KB · Affichages: 1
  • 1647046802477.png
    1647046802477.png
    52.6 KB · Affichages: 0
  • 1647046891863.png
    1647046891863.png
    52.6 KB · Affichages: 0
  • 1647537285038.png
    1647537285038.png
    21.7 KB · Affichages: 6
Dernière édition:
Un reverse proxy à pour but de répondre au demande, et de transmettre la demande au bon serveur.
L'avantage de pas utiliser le reverse proxy de ASUSTOR, si on analyse la requête on saura pas si c'est un NAS. (DEADBOLT par exemple)

Va sur shodan.io et fait une recherche sur ton IP ou tape ASUSTOR comme mot clé, tu comprendras vite fait qu'un Reverse proxy te cache un minimum.
 
Un reverse proxy à pour but de répondre au demande, et de transmettre la demande au bon serveur.
L'avantage de pas utiliser le reverse proxy de ASUSTOR, si on analyse la requête on saura pas si c'est un NAS. (DEADBOLT par exemple)

Va sur shodan.io et fait une recherche sur ton IP ou tape ASUSTOR comme mot clé, tu comprendras vite fait qu'un Reverse proxy te cache un minimum.
bonjour
La réponse est intéressante, et pour le coup, met la balle chez Asustor : pourquoi Asustor ne cache t'il pas les informations d'identification dans son proxy ? Si on active le reverse proxy, c'est un peu pour des raisons de sécurité il me semble...
 
Le fondement du Proxy reverse est de protéger les serveurs en Arrière plan en répondant au demande des internautes et aussi de centralisé la gestion des certificats SSL, le problème c'est que le NAS ne doit pas faire office de réponse en directe. (Un conteneur serait mieux approprié, car sa isole le processus)

Je penses sincèrement qu'il vaut mieux faire comme ceci car la requête du Reverse Proxy affiche pas en gros sur le front de l'IP, je suis ASUSTOR .
 
Bonjour,

j'ai essayé d'installer en reprenant ton compose dans portainer (juste modifier les ports d'entrées)
tous les dockers sont ready.
J'arrive bien sur la page congratulations... sur le 80
sur le 81 j'arrive à la page de login.
Par contre en mettant admin@example.com et changeme, il ne fait rien (aucun message d'erreur, juste le cercle qui tourne et puis rien) , je n'accède pas à l'interface.
pour infos, j'ai essayé de l'installé via le compose donné sur le site de proxymanager, il me fait exactement la même chose !
une idée du pourquoi ?
Merci

ps: que je mette n'importe quoi en login il faut la même chose

ps2: Resolu, j'arrive à y accéder :)
 
Dernière édition:
Bonjour,
Il suffit de vérifier si le conteneur à réussi à se connecter dans MariaDB en regardant la log, si c'est bon, normalement tu arriveras à te connecter.
Si c'est pas le cas, relance juste le conteneur après que MariaDB soit bien démarré et se sera bon.
 
Bonjour,
Il suffit de vérifier si le conteneur à réussi à se connecter dans MariaDB en regardant la log, si c'est bon, normalement tu arriveras à te connecter.
Si c'est pas le cas, relance juste le conteneur après que MariaDB soit bien démarré et se sera bon.
J'avais essayé également c'était pareil aucun problème n'apparaissait dans les logs des containers. Dans la base mysql le user admin@examp... bien créé, le log de nginx pas de souci.
J'ai supprimé le stack complet, reboot du nas,refait le stack, toujours le même probleme, de nouveau reboot du nas et là miracle !
 
Bonjour,
Le problème que tu rencontres est le fait que Nginx se lance avant la base de donnée, lors de son lancement, il envoie les tables dans la base de donnée.
 
Bonjour,

moi j'ai un autre souci, dans les logs de nginx (que ce soit avec NPM ou SWag, je ne vois que l'ip de docker plutot que l'ip réelle de la connexion.
Que ce soit sur le bridge "par défaut" ou un autre network créé en bridge, il indique toujours la passerelle dans les logs. Un peu embétant pour fail2ban et crowdsec. J'ai bien sûr refait le stack mais même problème.
Le reste fonctionne bien (pour les redirections, certif let's encrypt etc)
 
Pourrais tu ouvrir un fil de discussion avec des images pour voir visuellement le problème, puis mp le lien du fil .
 
Dernière édition:
Bonjour Drthrax,

Je me penche actuellement sur la solution de reverse proxy que tu proposes, mais je me demande où sont situés les volumes suivants sur le NAS en local :
  • 'LetsEncrypt:/etc/letsencrypt'
  • 'ReverseProxy:/data'
Par exemple.

J'ai un peu de mal avec les volumes docker XD