[Tuto] Firewall Netfilter

Cette article va vous apprendre comment mettre en place un Routeur et Parefeu Linux qui est un élément indispensable car c’est celui qui va filtrer le trafic en n’autorisant que les échanges permis par l’administrateur afin de protéger votre réseau.

1 – Mise en place d’un parefeu
2 – Activation du routeur dans le noyau
3 – Définir une politique de règles par défaut
4 – Contexte
5 – Mise en place du NAT
6 – Autoriser le trafic local
7 – Ne pas casser les connexions déjà établies
8 – Autoriser les requêtes ICMP, ICMPv6, RA et NDP
9 – Redirection de ports
10 – Limiter le scans de port et les attaque type D-DOS
11 – Script Firewall IPv4
12 – Script Firewall IPv6
13 – Utilisation du Firewall

.

L’ensemble des commandes seronts éxécutées avec les privilèges root

$ sudo -s
password :
# 

1 – Mise en place d’un parefeu

Pour le Parefeu, nous utiliserons iptables et ip6tables (NetFilter) qui sont déjà dans le noyau linux, si ce n’est pas le cas :

# aptitude install iptables
# aptitude install ip6tables

.

2 – Activation du routeur dans le noyau

# echo 1 > /proc/sys/net/ipv4/ip_forward
# echo 1 > /proc/sys/net/ipv6/conf/all/forwarding

# sysctl -p

.

3 – Definir une politique de règles par default

# On bloque tout en entrée
iptables -t filter -P INPUT DROP
ip6tables -t filter -P INPUT DROP

# On interdit tous les paquets destinés à être router
iptables -t filter -P FORWARD DROP
ip6tables -t filter -P FORWARD DROP

# On autorise tout en sortie
iptables -t filter -P OUTPUT ACCEPT
ip6tables -t filter -P OUTPUT ACCEPT

.

4 – Contexte

Supposons que notre Routeur/Parefeu dispose de 3 interfaces réseaux :

eh0 -> WAN :
IPv4 : 78.xx.xx.xx
IPv6 : 2001:db8:abcd::1/64

eth1 -> LAN :
IPv4 : 172.16.1.0 /24
IPv6 : 2001:db8:abcd:1::1/64

eth2 -> DMZ :
IPv4 : 172.16.2.0 /24
IPv6 : 2001:db8:abcd:2::1/64

.

5 – Mise en place du NAT

Le NAT va permettre de translater les IPv4 privée non routables en IP public routable de l’interface WAN, ainsi les réseaux LAN et DMZ pourront communiquer sur internet. Le NAT permet aussi de masquer les IPs privées du réseau. Les adresses IPv6 sont des adresse Global routables sur internet, le NAT n’existe plus en IPv6 ou que dans une utilisation spécifique.

# On NAT le LAN
iptables -t nat -A POSTROUTING -o eth0 -s 172.16.1.0/24 -j MASQUERADE
# On NAT la DMZ
iptables -t nat -A POSTROUTING -o eth0 -s 172.16.2.0/24 -j MASQUERADE

Il faut maintenant autoriser la communication entre les interfaces :

# On autorise le LAN à communiquer avec le WAN
iptables -t filter -A FORWARD -i eth1 -o eth0 -s 172.16.1.0/24 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
ip6tables -t filter -A FORWARD -i eth1 -o eth0 -s 2001:db8:abcd:1::1/64 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT

# Autoriser la DMZ à communiquer avec le WAN
iptables -t filter -A FORWARD -i eth2 -o eth0 -s 172.16.2.0/24 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
ip6tables -t filter -A FORWARD -i eth2 -o eth0 -s 2001:db8:abcd:2::1/64 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT

# Autoriser le LAN à communiquer avec la DMZ
iptables -t filter -A FORWARD -i eth1 -o eth2 -s 172.16.1.0/24 -d 172.16.2.0/24 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
ip6tables -t filter -A FORWARD -i eth1 -o eth2 -s 2001:db8:abcd:1::/64 -d 2001:db8:abcd:2::/64 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT

# Empêcher la DMZ à communiquer avec le LAN mais autoriser les réponses
iptables -t filter -A FORWARD -i eth2 -o eth1 -s 172.16.2.0/24 -d 172.16.1.0/24 -m state --state NEW -j DROP
iptables -t filter -A FORWARD -i eth2 -o eth1 -s 172.16.2.0/24 -d 172.16.1.0/24 -m state --state RELATED,ESTABLISHED -j ACCEPT
ip6tables -t filter -A FORWARD -i eth2 -o eth1 -s 2001:db8:abcd:2::/64 -d 2001:db8:abcd:1::/64 -m state --state NEW -j DROP
ip6tables -t filter -A FORWARD -i eth2 -o eth1 -s 2001:db8:abcd:2::/64 -d 2001:db8:abcd:1::/64 -m state --state RELATED,ESTABLISHED -j ACCEPT

.

6 – Autoriser le trafic local

iptables -t filter -A INPUT -i lo -j ACCEPT
ip6tables -t filter -A INPUT -i lo -j ACCEPT

.

7 – Ne pas casser les connexions déjà établies

Il s’agit d’une règle très importante, comme écrit dans le titre: elle va permettre de ne pas interrompre une connexion qui a déjà été établie.

iptables -t filter -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
ip6tables -t filter -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

iptables -t filter -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
ip6tables -t filter -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT

.

8 – Autoriser les requêtes ICMP, ICMPv6, RA et NDP

iptables -t filter -A INPUT -p icmp --icmp-type echo-request -m state --state NEW -j ACCEPT
iptables -t filter -A INPUT -p icmp --icmp-type echo-reply -m state --state RELATED,ESTABLISHED -j ACCEPT
ip6tables -t filter -A INPUT -p icmpv6 --icmpv6-type echo-request -m state --state NEW -j ACCEPT
ip6tables -t filter -A INPUT -p icmpv6 --icmpv6-type echo-reply -m state --state RELATED,ESTABLISHED -j ACCEPT

ip6tables -t filter -A INPUT -p icmpv6 --icmpv6-type neighbour-solicitation -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
ip6tables -t filter -A INPUT -p icmpv6 --icmpv6-type neighbour-advertisement -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
ip6tables -t filter -A INPUT -p icmpv6 --icmpv6-type router-advertisement -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT

.

9 – Redirection de ports

La redirection de port va permettre de rendre un service disposant d’une adresse IPv4 privée non-routable sur internet, à être accessible depuis l’extérieur.

Contexte : Nous avons 1 serveur de Mail, un serveur WEB et un serveur DNS que nous voulons rendre accessible depuis l’extérieur.

Serveur SSH : 172.16.2.1/24 -> port TCP 22
: 2001:db8:abcd:2::a/64 -> port TCP 22

Serveur WEB : 172.16.2.2/24 -> port TCP 80 et 443
: 2001:db8:abcd:2::b/64 -> port TCP 80 et 443

Serveur DNS : 172.16.2.3/24 -> port TCP et UDP 53
: 2001:db8:abcd:2::c/64 – port TCP et UDP 53

# Redirection du Port TCP 22 en IPv4 vers le Serveur SSH
iptables -t filter -A FORWARD -i eth0 -o eth2 -p tcp -d 172.16.2.1 --dport 22 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 22 -j DNAT --to 172.16.2.1:22

# Autoriser l'acces au serveur SSH en IPv6
iptables -t filter -A FORWARD -i eth0 -o eth2 -p tcp -d 2001:db8:abcd:2::a --dport 22 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT

# Redirection du Ports TCP 80 et 443 en IPv4 vers le Serveur WEB
iptables -t filter -A FORWARD -i eth0 -o eth2 -p tcp -d 172.16.2.2 --dport 80,443 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80,443 -j DNAT --to 172.16.2.2

# Autoriser l'acces au serveur WEB en IPv6
iptables -t filter -A FORWARD -i eth0 -o eth2 -p tcp -d 2001:db8:abcd:2::b --dport 80,443 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT

# Redirection du Port TCP/UDP 53 en IPv4 vers le Serveur DNS
iptables -t filter -A FORWARD -i eth0 -o eth2 -p tcp -d 172.16.2.3 --dport 53 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
iptables -t filter -A FORWARD -i eth0 -o eth2 -p udp -d 172.16.2.3 --dport 53 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 53 -j DNAT --to 172.16.2.3:53
iptables -t nat -A PREROUTING -i eth0 -p udp --dport 53 -j DNAT --to 172.16.2.3:53

# Autoriser l'acces au serveur DNS en IPv6 TCP/UDP
ip6tables -t filter -A FORWARD -i eth0 -o eth2 -p tcp -d 2001:db8:abcd:2::c --dport 53 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
ip6tables -t filter -A FORWARD -i eth0 -o eth2 -p udp -d 2001:db8:abcd:2::c --dport 53 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT

.

10 – Limiter le scans de port et les attaque type D-DOS

iptables -t filter -A INPUT -p tcp --syn -m limit --limit 2/s --limit-burst 30 -j ACCEPT
iptables -t filter -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
iptables -t filter -A INPUT -p tcp --tcp-flags ALL NONE -m limit --limit 1/h -j ACCEPT
iptables -t filter -A INPUT -p tcp --tcp-flags ALL ALL -m limit --limit 1/h -j ACCEPT

Vous avez maintenant un Pare-feu opérationnel, vous pouvez également créez un script afin d’automatiser vos règles.

Commençons par créer un script exécutable et qui sera lancer au démarrage, pour celà :

$ cd /etc/init.d
# touch firewall && touch firewall6
# chmod 700 firewall && chmod 700 firewall6
# chmod a+x firewall && chmod a+x firewall6
# update-rc.d firewall default && update-rc.d firewall6 default

Voici un exemple de script que j’ai créé avec des variables pour simplifier la gestion.
J’ai décidé de séparer les règles IPv4 et IPv6 en deux scripts différents pour plus de claireté 🙂

.

11 – Script Firewall IPv4

# vim /etc/init.d/firewall

#!/bin/bash
# Script Netfilter

### BEGIN INIT INFO
# Provides: netfilter
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Should-Start: $portmap
# Should-Stop: $portmap
# X-Start-Before: nis
# X-Stop-After: nis
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# X-Interactive: true
# Short-Description: Lancement du Firewall au demarrage
# Description: Script routeur parefeu par Loan Naze.
#
### END INIT INFO

# Declaration des macros
ext_if="eth0"
int_if="eth1"
dmz_if="eth2"
ext_ip="78.xx.xx.xx"
int_net="172.16.1.0/24"
dmz_net="172.16.2.0/24"
server="172.16.2.2"
ipfilter="iptables -t filter"
ipnat="iptables -t nat"
portserver="21,80,443"

case "$1" in

start)

# On vide les anciennes règles
iptables -F
iptables -X
iptables -Z
echo -e "On vide les anciennes règles.. [OK] \n"

# Regles par defaut
$ipfilter -P INPUT DROP
$ipfilter -P FORWARD DROP
$ipfilter -P OUTPUT ACCEPT
echo -e "Bloquer Entrée / Bloquer Routage / Autoriser Sortie.. [OK] \n"

# Activation du NAT
$ipnat -A POSTROUTING -o eth0 -s $lan -j MASQUERADE
$ipnat -A POSTROUTING -o eth0 -s $dmz -j MASQUERADE
echo -e "Activation du NAT.. [OK] \n"

# Forcer le LAN à passer par le Proxy (Proxy Transparent)
$ipnat -A PREROUTING -p tcp -s $int_if --dport 80 -j REDIRECT --to-port 3128
echo -e "Forcer le LAN à passer par le Proxy.. [OK] \n"

# Tout autoriser sur l'interface local
$ipfilter -A INPUT -i lo -j ACCEPT
$ipfilter -A OUTPUT -o lo -j ACCEPT
echo -e "Tout autoriser sur l'interface local.. [OK] \n"

# Autoriser les connexions établies
$ipfilter -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
$ipfilter -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
echo -e "Ne pas casser les connexions établies.. [OK] \n"

# On autorise le LAN à communiquer avec le WAN
$ipfilter -A FORWARD -i $int_if -o $ext_if -s $int_net -m state --state NEW -j ACCEPT
echo -e "On autorise le LAN à communiquer avec le WAN.. [OK] \n"

# On autorise la DMZ à communiquer avec le WAN
$ipfilter -A FORWARD -i $dmz_if -o $ext_if -s $dmz_net -m state --state NEW -j ACCEPT
echo -e "On autorise la DMZ à communiquer avec le WAN.. [OK] \n"

# Autoriser le LAN a communiquer avec la DMZ
$ipfilter -A FORWARD -i $int_if -o $dmz_if -s $int_net -d $dmz_net -m state --state NEW -j ACCEPT
echo -e "Autoriser le LAN a communiquer avec la DMZ.. [OK] \n"

# Interdire la DMZ à communiquer avec le réseau local (LAN)
$ipfilter -A FORWARD -i $dmz_if -o $int_if -s $dmz_net -d $int_net -m state --state NEW -j DROP
echo -e "Interdire la DMZ à communiquer avec le réseau local.. [OK] \n"

# Autoriser SSH sur l'interface WAN
$ipfilter -A INPUT -i $ext_if -d $ext_ip -p tcp --dport ssh -j ACCEPT
echo -e "Autoriser SSH sur l'interface WAN.. [OK] \n"

# Redirections des ports FTP, HTTP, HTTPS vers le serveur
$ipfilter -A FORWARD -i $ext_if -o $dmz_if -p tcp -d $server -m multiport --dports $portserver -m state --state NEW -j ACCEPT
$ipnat -A PREROUTING -i $ext_if -p tcp -m multiport --dports $portserver -j DNAT --to $server
echo -e "Redirections des ports FTP, HTTP, HTTPS vers le serveur.. [OK] \n"

# Autoriser les requêtes ICMP echo
$ipfilter -A INPUT -p icmp --icmp-type echo-request -m state --state NEW -j ACCEPT
echo -e "Autoriser les requêtes ICMP echo.. [OK] \n"

# Limiter scan de port et anti D-DOS
$ipfilter -A INPUT -p tcp --syn -m limit --limit 2/s --limit-burst 30 -j ACCEPT
$ipfilter -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
$ipfilter -A INPUT -p tcp --tcp-flags ALL NONE -m limit --limit 1/h -j ACCEPT
$ipfilter -A INPUT -p tcp --tcp-flags ALL ALL -m limit --limit 1/h -j ACCEPT
echo -e "Limiter le scan de ports et les attaques.. [OK] \n"

sleep 3
echo -e "Le Firewall a été démarrée avec succès.. [OK] \n"
RETVAL=$?
;;

stop)
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

sleep 3
echo -e "Arret du Firewall.. [OK]\n"
RETVAL=$?
;;

restart)
$0 stop && $0 start
RETVAL=$?
;;

status)
iptables -L

RETVAL=$?
;;

*)
echo "Usage: $0 { start | stop | restart | status }"
RETVAL=1
;;

esac
exit $RETVAL

.

12 – Script Firewall IPv6

# vim /etc/init.d/firewall

#!/bin/bash
# Script Netfilter

### BEGIN INIT INFO
# Provides: netfilter
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Should-Start: $portmap
# Should-Stop: $portmap
# X-Start-Before: nis
# X-Stop-After: nis
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# X-Interactive: true
# Short-Description: Lancement du Firewall au demarrage
# Description: Script routeur parefeu par Loan Naze.
#
### END INIT INFO

# Declaration des macros
int_if="eth1"
ext_if="eth0"
dmz_if="eth2"
ext_ip="2001:db8:abcd::1"
int_net="2001:db8:abcd:1::/64"
dmz_net="2001:db8:abcd:2::/64"
server="2001:db8:abcd:2::a"
ip6filter="ip6tables -t filter"
portserver="21,80,443"

case "$1" in

start)
# On vide les anciennes règles
ip6tables -F
ip6tables -X
ip6tables -Z
echo -e "On vide les anciennes règles.. [OK] \n"

# Regles par default du firewall
$ip6filter -P INPUT DROP
$ip6filter -P FORWARD DROP
$ip6filter -P OUTPUT ACCEPT
echo -e "Bloquer Entrée / Bloquer Routage / Autoriser Sortie.. [OK] \n"

# Autoriser loopback
$ip6filter -A INPUT -i lo -j ACCEPT
$ip6filter -A OUTPUT -o lo -j ACCEPT
echo -e "Autoriser loopback.. [OK] \n"

# Autoriser les connexions établies
$ip6filter -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
$ip6filter -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
echo -e "Autoriser les connexions établies.. [OK] \n"

# On autorise le LAN à communiquer avec le WAN
$ip6filter -A FORWARD -i $int_if -o $ext_if -s $int_net -m state --state NEW -j ACCEPT
echo -e "On autorise le LAN à communiquer avec le WAN.. [OK] \n"

# On autorise la DMZ à communiquer avec le WAN
$ip6filter -A FORWARD -i $dmz_if -o $ext_if -s $dmz_net -m state --state NEW -j ACCEPT
echo -e "On autorise la DMZ à communiquer avec le WAN.. [OK] \n"

# Autoriser le LAN a communiquer avec la DMZ
$ip6filter -A FORWARD -i $int_if -o $dmz_if -s $int_net -m state --state NEW -j ACCEPT
echo -e "Autoriser le LAN a communiquer avec la DMZ.. [OK] \n"

# Interdire la DMZ à communiquer avec le réseau local (LAN)
$ip6filter -A FORWARD -i $dmz_if -o $int_if -s $int_if -m state --state NEW -j DROP
echo -e "Interdire la DMZ à communiquer avec le réseau local.. [OK] \n"

# Autoriser SSH sur l'interface WAN
$ip6filter -A INPUT -i $ext_if -p tcp --dport ssh -d $ext_ip -m state --state NEW -j ACCEPT
echo -e "Autoriser SSH sur l'interface WAN.. [OK] \n"

 # Autoriser Les requêtes ICMPv6 echo-reply/NS/NDP/RA
$ip6filter -A INPUT -p icmpv6 --icmpv6-type echo-request -m state --state NEW -j ACCEPT
$ip6filter -A INPUT -p icmpv6 --icmpv6-type neighbour-solicitation -m state --state NEW -j ACCEPT
$ip6filter -A INPUT -p icmpv6 --icmpv6-type neighbour-advertisement -m state --state NEW -j ACCEPT
$ip6filter -A INPUT -p icmpv6 --icmpv6-type router-advertisement -m state --state NEW -j ACCEPT
echo -e "Autoriser Les requêtes ICMPv6 echo-reply/NS/NDP/RA.. [OK] \n"

# Autoriser l'accès au serveur
$ip6filter -A FORWARD -i $ext_if -o $dmz_if -p tcp -m multiport --ports $portserver -d $server -m state --state NEW -j ACCEPT
echo -e "Autoriser l'accès au serveur.. [OK] \n"

# Limiter scan de port et anti D-DOS
$ip6filter -A INPUT -p tcp --syn -m limit --limit 2/s --limit-burst 30 -j ACCEPT
$ip6filter -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
$ip6filter -A INPUT -p tcp --tcp-flags ALL NONE -m limit --limit 1/h -j ACCEPT
$ip6filter -A INPUT -p tcp --tcp-flags ALL ALL -m limit --limit 1/h -j ACCEPT
echo -e "Limiter le scan de ports et les attaques.. [OK] \n"

sleep 3
echo -e "Le Firewall a été démarrée avec succès.. [OK] \n"
RETVAL=$?
;;

stop)
ip6tables -P INPUT ACCEPT
ip6tables -P FORWARD ACCEPT
ip6tables -P OUTPUT ACCEPT

sleep 3
echo -e "Arret du Firewall.. [OK]\n"
RETVAL=$?
;;

restart)
$0 stop && $0 start
RETVAL=$?
;;

status)
iptables -L

RETVAL=$?
;;

*)
echo "Usage: $0 { start | stop | restart | status }"
RETVAL=1
;;

esac
exit $RETVAL

.

13 – Utilisation du Firewall

# service firewall start
# service firewall6 start
-> Démarrer le Firewall

# service firewall stop
# service firewall6 stop
-> Stopper le Firewall

# service firewall restart
# service firewall6 restart
-> Redémarrer le Firewall

# service firewall status
# service firewall6 status
-> Affiche les règles activées

Laisser un commentaire

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