Avertissement
Je rappel que les tutoriels présentés doivent permettre de créer une infrastructure web dans un environnement de test, le plus proche possible d’un serveur de production se rapprochant d’un serveur mutualisé chez un hébergeur comme 1&1.
Cette infrastructure présente les bases de la configuration et ne possède aucun moyen de défense contre d’éventuelles intrusions.
Par conséquent, vous êtes seul responsable si vous vous contentez de suivre ce tutoriel pour une mise en ligne d’un serveur web sur internet avec un accès public.
Vous voilà averti, passons aux choses sérieuses.
Introduction
Ce tuto fait parti d’un ensemble qui conduit à créer une infrastructure de serveurs web avec différents rôles en utilisant VirtualBox : “[Tuto – Infrastructure Web – Debian 8] – Présentation et objectifs”.
Il va vous permettre de mettre en place un serveur virtuel local avec un proxy et un reverse proxy.
L’objectif est de construire un vlan dans lequel seront installées les VMs web, base de données et administration / monitoring et ainsi n’avoir qu’un seul point d’entré pour une multitude de sites web.
Cloner la machine gabarit
Il vous faut tout d’abord cloner et configurer la machine gabarit préparée dans “[Tuto – Infrastructure Web – Debian 8] – La machine gabarit” puis dans “[Tuto – Infrastructure Web – Debian 8] – Cloner et préparer la machine gabarit“.
Dans ce tutoriel, je vais la nommer « jbnet-proxy »
Configuration de la VM
Avant de démarrer la VM « jbnet-proxy », il faut faire quelques ajustements dans sa configuration.
Pour la mémoire, 512 Mo suffisent largement.
Dans « Réseau », vous devez avoir le mode d’accès réseau de la carte 1 positionnée sur « Accès par pont ».
Par contre, il va falloir ajouter une seconde carte réseau pour le VLAN.
Cliquez sur « Carte 2 ».
- Activez la carte.
- « Mode d’accès réseau » : sélectionnez « Réseau interne »
- Validez en cliquant sur le bouton [Ok]
Démarrez la VM.
Configuration réseau
Activer et configurer la carte eth1
Puisque vous avez suivi le guide “[Tuto – Infrastructure Web – Debian 8] – Cloner et préparer la machine gabarit“, vous déjà probablement attribué une ip fixe à la carte eth0 (carte 1 de VirtualBox). Dans la suite de ce tutoriel, j’ai attribué l’ip 10.0.0.100 à la carte 1.
Pour la carte 2 (eth1), il faut ajouter son fichier de configuration dans le répertoire /etc/network/interfaces.d/.
Dupliquez le fichier /etc/network/interfaces.d/eth0.conf vers /etc/network/interfaces.d/eth1.conf
1 |
command cp /etc/network/interfaces.d/eth0.conf /etc/network/interfaces.d/eth1.conf |
Éditez le fichier et modifiez les paramètres pour arriver à cette configuration :
1 2 3 4 5 6 7 |
auto eth1 allow-hotplug eth1 iface eth1 inet static address 192.168.2.1 netmask 255.255.255.0 network 192.168.2.0 broadcast 192.168.2.255 |
Relancez le serveur pour la prise en compte :
1 |
command reboot |
Un ifconfig pour vérifier que tout est en ordre :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
root@jbnet-proxy:~# ifconfig eth0 Link encap:Ethernet HWaddr 08:00:27:b2:d2:30 inet adr:10.0.0.100 Bcast:10.0.0.255 Masque:255.255.255.0 adr inet6: fe80::a00:27ff:feb2:d230/64 Scope:Lien UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:79 errors:0 dropped:0 overruns:0 frame:0 TX packets:67 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 lg file transmission:1000 RX bytes:9047 (8.8 KiB) TX bytes:10900 (10.6 KiB) eth1 Link encap:Ethernet HWaddr 08:00:27:a2:8d:59 inet adr:192.168.2.1 Bcast:192.168.2.255 Masque:255.255.255.0 adr inet6: fe80::a00:27ff:fea2:8d59/64 Scope:Lien UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:10 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 lg file transmission:1000 RX bytes:0 (0.0 B) TX bytes:868 (868.0 B) lo Link encap:Boucle locale inet adr:127.0.0.1 Masque:255.0.0.0 adr inet6: ::1/128 Scope:Hôte UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 lg file transmission:0 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) |
Activer le transfert entre eth0 et eth1 avec l’ip forwarding et iptables
Il faut maintenant activer le lien entre les 2 cartes : c’est l’ip forwarding.
Vous pouvez vérifier l’état actuel de l’ip forwarding avec cette commande :
1 |
command sysctl net.ipv4.ip_forward |
Résultat :
1 |
net.ipv4.ip_forward = 0 |
Pour activer de façon permanente, décommentez la ligne suivante dans le fichier /etc/sysctl.conf
1 |
net.ipv4.ip_forward=1 |
Exécutez ces commandes pour la prise en compte de la modification (ou rebootez la VM) :
1 2 |
command sysctl -p /etc/sysctl.conf command service procps restart |
Résultat :
1 |
net.ipv4.ip_forward = 1 |
Il faut maintenant activer le transfert réseau entre les 2 cartes réseaux grâce à iptables :
1 2 |
command iptables -P FORWARD ACCEPT command iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE |
A partir de là, le transfert s’établit, mais n’est pas encore permanent.
Rendre permanente la configuration iptables
Il faut pour cela charger les règles iptables au démarrage du serveur.
Tout d’abord, sauvegardez les règles déjà configurées plus haut en créant le fichier /etc/iptables.up.rules
1 |
command iptables-save > /etc/iptables.up.rules |
Le fichier /etc/iptables.up.rules devrait contenir ces lignes :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# Generated by iptables-save v1.4.21 on Sat Aug 1 14:50:26 2015 *nat :PREROUTING ACCEPT [32:3626] :INPUT ACCEPT [10:2231] :OUTPUT ACCEPT [1:60] :POSTROUTING ACCEPT [1:60] -A POSTROUTING -o eth0 -j MASQUERADE COMMIT # Completed on Sat Aug 1 14:50:26 2015 # Generated by iptables-save v1.4.21 on Sat Aug 1 14:50:26 2015 *filter :INPUT ACCEPT [2527:227734] :FORWARD ACCEPT [33:2397] :OUTPUT ACCEPT [2076:207084] COMMIT # Completed on Sat Aug 1 14:50:26 2015 |
Créez le fichier /etc/network/if-pre-up.d/iptables :
1 2 |
#!/bin/sh /sbin/iptables-restore < /etc/iptables.up.rules |
Le fichier doit être exécutable :
1 |
command chmod 755 /etc/network/if-pre-up.d/iptables |
Rebooter la VM puis affichez la liste des règles iptables.
1 |
command iptables -t nat -L -nv |
Résultat :
1 2 3 4 5 6 7 8 9 10 11 12 |
Chain PREROUTING (policy ACCEPT 39 packets, 4987 bytes) pkts bytes target prot opt in out source destination Chain INPUT (policy ACCEPT 17 packets, 3592 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 1 packets, 60 bytes) pkts bytes target prot opt in out source destination Chain POSTROUTING (policy ACCEPT 1 packets, 60 bytes) pkts bytes target prot opt in out source destination 19 1215 MASQUERADE all -- * eth0 0.0.0.0/0 0.0.0.0/0 |
Comme l’indique la partie « Chain POSTROUTING », tous les paquets réseau sont redirigés vers eth0.
A ce stade, ce n’est utile que pour les serveurs sur le vlan (192.168.2.x).
Ils pourront principalement communiquer avec internet pour se mettre à jour, c’est la fonction proxy.
Mais en ce qui concerne l’hébergement de site, nous avons besoin que des connexion extérieures arrivent sur un serveur dans le vlan.
C’est donc l’inverse d’un proxy, on parle alors de reverse proxy.
Installer un reverse proxy avec NGINX
Installer et paramétrer NGINX
Créez le fichier /etc/apt/sources.list.d/nginx.list :
1 2 |
deb http://nginx.org/packages/mainline/debian/ jessie nginx deb-src http://nginx.org/packages/mainline/debian/ jessie nginx |
Récupérez la clé de sécurité apt :
1 |
command wget -O key http://nginx.org/keys/nginx_signing.key && command apt-key add key && rm -f key |
Mettez à jour la liste des dépôts et installez nginx :
1 2 |
command apt-get update command apt-get install nginx |
Créez une sauvegarde du fichier /etc/nginx/nginx.conf :
1 |
command cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.backup |
Éditez le fichier et adaptez-le pour arriver cette configuration (volontairement très simple) :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
user nginx; worker_processes 1; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; tcp_nopush on; #keepalive_timeout 65; #gzip on; include /etc/nginx/conf.d/*.conf; } |
Vous pouvez ajuster ces paramètres suivant la configuration du serveur :
- worker_processes : nombre de CPU du serveur.
- worker_connections : nombre de connections simultanées qui doit être égal ou inférieur à la valeur renvoyée par la commande « ulimit -a »
Créez le fichier /etc/nginx/conf.d/proxy.conf :
1 2 3 4 5 6 7 8 9 10 |
proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; client_max_body_size 10m; client_body_buffer_size 128k; proxy_connect_timeout 90; proxy_send_timeout 90; proxy_read_timeout 90; proxy_buffers 32 4k; |
Source : http://wiki.nginx.org/FullExample
Avant de redémarrer NGINX, effectuez un test pour vérifier que la configuration ne comporte pas d’erreur :
1 |
command service nginx configtest |
Résultat :
1 2 |
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful |
Puis relancez NGINX :
1 |
command service nginx restart |
Configurer un site web
Il faut maintenant indiquer à NGINX quel serveur solliciter dans le vlan suivant l’URL demandée.
Créez les répertoires :
1 2 |
command mkdir -p /etc/nginx/sites-available command mkdir -p /etc/nginx/sites-enabled |
- sites-available : contient les fichiers de configuration des sites web
- sites-enabled : contient un lien symbolique vers les fichiers de configuration des sites web actifs.
Exemple de fichier pour le site test.jbnet.lan : /etc/nginx/sites-available/test.jbnet.lan.conf
1 2 3 4 5 6 7 8 9 10 11 |
server { listen 80; server_name test.jbnet.lan; access_log /var/log/nginx/test.jbnet.lan.access.log; error_log /var/log/nginx/test.jbnet.lan.error.log; location / { proxy_pass http://192.168.2.10/; expires off; } } |
Pour activer la configuration, il faut créer un lien symbolique :
1 |
ln -s /etc/nginx/sites-available/test.jbnet.lan.conf /etc/nginx/sites-enabled/test.jbnet.lan.conf |
Pour que NGINX puisse prendre en compte les fichiers des sites web actifs, il faut ajouter une ligne dans le fichier /etc/nginx/nginx.conf :
1 |
include /etc/nginx/sites-enabled/*.conf; |
Ce qui donne :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
user nginx; worker_processes 1; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; tcp_nopush on; #keepalive_timeout 65; #gzip on; include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*.conf; } |
Redémarrez NGINX pour prendre en compte cette nouvelle configuration :
1 |
command service nginx restart |
ftp-proxy
ftp-proxy permet de mettre en place un proxy spécialement dédié au FTP.
Il va permettre de se connecter directement au serveur web situé dans un vlan.
Installation
1 |
command apt-get install ftp-proxy |
Faites-en une copie au cas où…
1 |
cp /etc/proxy-suite/ftp-proxy.conf /etc/proxy-suite/ftp-proxy.conf.backup |
Modifiez les paramètres suivant :
1 2 3 4 5 6 7 8 9 10 11 |
AllowMagicUser yes AllowTransProxy yes LogDestination /var/log/ftp-proxy/ftp-proxy.log LogLevel INF PidFile /var/run/ftp-proxy.pid Port 21 ServerType standalone DestinationTransferMode active PassiveMinDataPort 4262 PassiveMaxDataPort 4272 SockBindRand yes |
Commentez la ligne :
1 |
#DestinationAddress localhost |
Créez le répertoire de log :
1 2 |
command mkdir -p /var/log/ftp-proxy/ command chmod 777 /var/log/ftp-proxy/ |
Activer le service et le démarrage automatique au boot
Editez le fichier /etc/default/ftp-proxy et modifiez RUN_DAEMON à yes :
1 2 3 4 5 |
# This file controls the behaviour of the ftp-proxy init script. It # will be parsed as a shell script. # Set to "yes" to have the init script start ftp-proxy. RUN_DAEMON=yes |
Démarrez le service :
1 |
command service ftp-proxy start |
Le fichier /etc/hosts pour « orienter » la connexion FTP
Le serveur ftp-proxy a besoin de connaitre l’IP du serveur ftp cible.
Pour cela, il utilise le nom du serveur spécifié dans le nom d’utilisateur (ex : jbnet-user@test.jbnet.lan) et du fichier /etc/hosts.
Pour chaque site web ajouté sur un serveur web dans le vlan, il faut ajouter une ligne dans le fichier /etc/hosts du serveur proxy.
Par exemple, si le site web test.jbnet.lan est hébergé sur le serveur jbnet-web01 qui possède l’ip 192.168.2.10 :
1 |
192.168.2.10 test.jbnet.lan |
Connexion avec FileZilla
A partir de maintenant, pour vous connecter en FTP de votre PC vers une VM à l’intérieur du vlan, vous devez utiliser ces paramètres de connexion :
- Hôte : test.jbnet.lan (ou ip du serveur proxy)
- Identifiant : jbnet-user@test.jbnet.lan
- Mot de passe : celui que vous avez utilisé.
- Port : 21
Mais il faut d’abord créer le serveur web…
RDV au prochain chapitre.