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