25 avril 2024

Tuto Virtualisation V.2018 : Partie V, Firewall

Cinquième partie du tutoriel sur la virtualisation « Xen et OpenVswitch sont dans une Debian« .
Dans la partie précédente, nous avons mis en place notre réseau de trois VMs et configuré le tout.
Nous allons maintenant nous occuper de mettre en place les firewalls sur les deux machines exposées au net : le Dom0 et le routeur.
Ce n’est pas un cours magistral sur Netfilter (iptable étant la ligne de commande qui permet de modifier la configuration de ce dernier). Il y a de très bon tuto trouvable à ce sujet sur le net.
Pour résumer brièvement, on va principalement utiliser les table FILTER (qui sert à … filtrer) et NAT qui sert elle à faire de la translation d’adresse.
Ensuite, au niveau des chaines, on trouvera surtout INPUT et OUTPUT qui sont liés au process du system sur lequel netfilter tourne. FORWARD elle, concerne les paquets qui transitent d’une interface à une autre.
Ensuite, je vais détailler un maximum les commandes, et je pense qu’avec cela, vous devriez comprendre le fonctionnement.

I – DOM0

Au niveau de l’hyperviseur, on veut simplement tout bloquer, puis ensuite, autoriser le ssh et quelques autres requêtes.
On va créer un fichier /root/scripts/firewall, et le remplir de la sorte :
Tout d’abord, on purge tout dans les tables filter et nat :

#!/bin/bash
# PURGE
iptables -t filter -F
iptables -t filter -X
iptables -t nat -F
iptables -t nat -X

Ensuite, on interdit tout. En effet, par défaut, la politique est de tout autoriser, ce qui n’est, vous en conviendrez, pas forcement très sécurisant.

# ON BLOQUE TOUT
iptables -t filter -P INPUT DROP
iptables -t filter -P FORWARD DROP
iptables -t filter -P OUTPUT DROP

A ce niveau, plus rien ne passe. On va donc commencer par autoriser ce qu’on désire. A savoir le loopback (le fameux 127.0.0.1; les pings sortants et entrant ainsi que les connexions déjà établies et les retours (Netfilter interprétant les règles dans l’ordre, plus tôt sont ces règles, mieux c’est pour la rapidité de traitement.)

# LOOPBACK OK
iptables -t filter -A INPUT -i lo -j ACCEPT
iptables -t filter -A OUTPUT -o lo -j ACCEPT
# PING IN ET OUT OK
iptables -t filter -A INPUT -p icmp -j ACCEPT
iptables -t filter -A OUTPUT -p icmp -j ACCEPT
# Autoriser les connexions déjà effectuées et les retours.
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

Ensuite, on va autoriser en entré le port 23 (notre port SSH), puis en sortie les ports DNS, HTTPS, HTTPS et NTP :

# Autoriser le port 23 en entrée
iptables -t filter -A INPUT -p tcp --dport 23 -j ACCEPT
# Autoriser le dom0 a faire des requêtes DNS, HTTP, NTP
iptables -t filter -A OUTPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 443 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 53 -j ACCEPT
iptables -t filter -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -t filter -A OUTPUT -p udp --dport 123 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 123 -j ACCEPT

On va également autoriser en entrée le port ntp, uniquement depuis les VMs (-s 10.99.1.0/24, ce qui veut dire, qui a pour source ce réseau) afin qu’elles puissent se mettre à l’heure et également le port ssh en sortie uniquement vers les VMs (-d 10.99.1.0/24, ce qui veut dire, qui a pour destination ce réseau) :

# Autoriser les Domus a demander le ntp
iptables -t filter -A INPUT -p udp -s 10.99.1.0/24 --dport 123 -j ACCEPT
iptables -t filter -A INPUT -p tcp -s 10.99.1.0/24 --dport 123 -j ACCEPT
# Autoriser le ssh depuis le dom0 vers les domus
iptables -t filter -A OUTPUT -d 10.99.1.0/24 -p tcp --dport 22 -j ACCEPT
echo - OK

Puis on le rend exécutable :

dom0# chmod +x /root/scripts/firewall

Et nous allons en faire un service :
Créez un fichier /etc/systemd/system/firewall.service et mettez ce qui suit :

[Unit]
Description=Route
After=network-online.target
[Service]
Type=oneshot
ExecStart=/root/scripts/firewall
[Install]
WantedBy=multi-user.target

Puis :

dom0# systemctl enable firewall.service

Pour l’activer de suite :

dom0# systemctl start firewall

On peut vérifier le bon déroulement avec :

dom0# : systemctl status firewall

Ce qui doit retourner :

● firewall.service - Firewall
 Loaded: loaded (/etc/systemd/system/firewall.service; enabled; vendor preset: enabled)
 Active: inactive (dead) since Mon 2018-04-09 13:22:11 CEST; 1min 57s ago
 Process: 31758 ExecStart=/root/scripts/firewall (code=exited, status=0/SUCCESS)
 Main PID: 31758 (code=exited, status=0/SUCCESS)
Apr 09 13:22:11 d systemd[1]: Starting Firewall...
Apr 09 13:22:11 d systemd[1]: Started Firewall.

Ici, c’est le SUCCESS qui nous indique que tout s’est déroulé sans accrocs.

II – VM Routeur

Sur le routeur, on va trouver la même base, mais on va y rajouter également les premières règles de NAT. Ce fichier sera régulièrement retouché durant le tutoriel en fonction des services que l’on met en place, etc…

dom0# ssh 10.99.1.2

Dans un fichier /root/scripts/firewall, mettez cela :

#!/bin/bash
# On purge
iptables -t filter -F
iptables -t filter -X
iptables -t nat -F
iptables -t nat -X
# Interdire toute connexion entrante, sortante ou forwardée
iptables -t filter -P INPUT DROP
iptables -t filter -P FORWARD DROP
iptables -t filter -P OUTPUT DROP
# Autoriser les connexions deja effectuées et les retours
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
# Autoriser loopback
iptables -t filter -A INPUT -i lo -j ACCEPT
iptables -t filter -A OUTPUT -o lo -j ACCEPT
# Autoriser ping
iptables -t filter -A INPUT -p icmp -j ACCEPT
iptables -t filter -A OUTPUT -p icmp -j ACCEPT

Maintenant, on autoriser le ssh sur le routeur depuis l’hyperviseur :

# SSH // DOM0 -> ROUTEUR
iptables -t filter -A INPUT -p tcp -s 10.99.1.1 --dport 22 -j ACCEPT

On autoriser le routeur à faire du DNS, HTTP, HTTPS et NTP :

# DNS // ROUTEUR -> EXT
iptables -t filter -A OUTPUT -p udp --dport 53 -j ACCEPT
# HTTP/HTTPS // ROUTEUR -> EXT
iptables -t filter -A OUTPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 443 -j ACCEPT
# NTP // ROUTEUR -> DOM0
iptables -t filter -A OUTPUT -p udp -d 10.99.1.1 --dport 123 -j ACCEPT

Ensuite, on va passer aux règles qui concernent ce qui vient de l’extérieur vers nos VMS. Dans un premier temps, redirection du HTTP et du HTTPS vers notre reverse proxy (on modifie l’adresse de destination (Ip de la VM proxy) des paquets pour les ports 80 et 433 (PREROUTING) puis on autorise leur FORWARD.

# -> VM PROXY : HTTP ET HTTPS
iptables -t nat -A PREROUTING -i eth0 -d IP_FAILOVER -p tcp --dport 80 -j DNAT --to-destination 10.10.1.10
iptables -t nat -A PREROUTING -i eth0 -d IP_FAILOVER -p tcp --dport 443 -j DNAT --to-destination 10.10.1.10
iptables -t filter -A FORWARD -p tcp -d 10.10.1.10 --dport 80 -j ACCEPT
iptables -t filter -A FORWARD -p tcp -d 10.10.1.10 --dport 443 -j ACCEPT

Ensuite, les règles concernant ce qui vient des VMS et qui va vers l’extérieur (ces règles seront nettement modifiées par la suite, à la mise en place du DNS, du proxy interne, etc…)
En premier, l’IDS :

# REGLE IDS
# PING
iptables -t filter -A FORWARD -p icmp -s 10.2.1.3 -j ACCEPT
# DNS
iptables -t filter -A FORWARD -p udp -s 10.2.1.3 --dport 53 -j ACCEPT
# HTTP ET HTTPS
iptables -t filter -A FORWARD -p tcp -s 10.2.1.3 --dport 80 -j ACCEPT
iptables -t filter -A FORWARD -p tcp -s 10.2.1.3 --dport 443 -j ACCEPT

Ensuite, le proxy :

# PROXY
# PING
iptables -t filter -A FORWARD -p icmp -s 10.10.1.10 -j ACCEPT
# DNS
iptables -t filter -A FORWARD -p udp -s 10.10.1.10 --dport 53 -j ACCEPT
# HTTP ET HTTPS
iptables -t filter -A FORWARD -p tcp -s 10.10.1.10 --dport 80 -j ACCEPT
iptables -t filter -A FORWARD -p tcp -s 10.10.1.10 --dport 443 -j ACCEPT

Et on termine par les règles de POSTROUTING (changement de l’adresse de départ des paquets (afin qu’ils puissent revenir sans encombre vers nous)

########################################
# POSTROUTING DES IPS 10.2.1.3, 10.10.1.10, 10.10.1.11 POUR LES PAQUETS SORTANT PAR ETH0
iptables -t nat -A POSTROUTING -o eth0 -s 10.2.1.3 -j SNAT --to 212.83.179.33
iptables -t nat -A POSTROUTING -o eth0 -s 10.10.1.10 -j SNAT --to 212.83.179.33
echo - OK

Puis, comme pour le Dom0, on va créer un service :
Créez un fichier /etc/systemd/system/firewall.service et mettez ce qui suit :

[Unit]
Description=Route
After=network-online.target
[Service]
Type=oneshot
ExecStart=/root/scripts/firewall
[Install]
WantedBy=multi-user.target

Puis :

dom0# systemctl enable firewall.service

Pour l’activer de suite :

dom0# systemctl start firewall

On pourrait s’attarder aussi sur les autres VMs, mais ce n’est pas une priorité. On va déjà mettre en place nos différents services.
De plus, ces deux Firewalls seront retouchés. On reviendra donc la dessus plus tard, mais on a déjà une protection basique en place.
Nous allons passer à la dernière étape « préparatoire », la mise en place d’un nouveau VLAN.

Une réflexion sur « Tuto Virtualisation V.2018 : Partie V, Firewall »

  1. Dans la partie VM Routeur, il faut ajout le droit d’exécution au fichier firewall avant de créer le service
    chmod +x /root/scripts/firewall

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *