Mise en place d'un Reverse Proxy sous Docker (Niveau Intermédiaire)
Présentation du schéma du Reverse Proxy
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.
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.
Faire de même avec Portainer-ce.
Lors de l'installation, cette fenêtre apparaît:
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.
Configurer Environnements Portainer-CE:
Dans le menu Portain.IO, cliquer le mot Environnements puis sur LOCAL.
Récupérer l'adresse IP du NAS en regardent l'URL: (Mon cas: 192.168.1.2)
Dans le Champs Public IP, taper l'adresse IP du NAS puis cliquer sur Update Environnement.
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
Création du Stack "supervision" et coller le code suivant:
YAML:
En cours de peaufinement
- 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 :
ADM Configuration: (Si votre pare-feu est actif)
Connexion au panel Web Reverse Proxy.
Identifiant par défaut du Reverse Proxy
Email: admin@example.com
Password: changeme
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)
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
Si le "SSL certificate" est par défaut, le domaine ne sera accessible qu'en HTTP. (http://mondomain.drthrax74.ddns.net)
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.
Cocher la Case Force SSL et puis cocher la case "I agree to let's Encrypt Terms of Service" puis sur Save
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.
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.png28.3 KB · Affichages: 4
-
1646497299773.png131.3 KB · Affichages: 2
-
1646497405235.png133.1 KB · Affichages: 3
-
1646497903935.png18.2 KB · Affichages: 1
-
1647044781545.png1.6 KB · Affichages: 1
-
1647045554421.png1.6 KB · Affichages: 1
-
1647045558723.png7.1 KB · Affichages: 2
-
1647046802477.png52.6 KB · Affichages: 1
-
1647046891863.png52.6 KB · Affichages: 1
-
1647537285038.png21.7 KB · Affichages: 7
Dernière édition: