OldGentooWiki:Utilisation de Iptables comme Firewall/Gateway

De Gentoo-Quebec.

Go-previous.png Indes des trucs et astuces avancés


Gentoo-quebec+Funtoo-quebec.png

Utilisation de Iptables comme Firewall/Gateway


Sommaire

Mise en Contexte

L'utilisation et la configuration d'un Firewall sous Linux est un sujet délicat, car il faut avoir de la patience et surtout les compétences pour bien configurer celui-ci, sinon nous pouvons être complètement exposés sur internet sans défense.

Voici le script qui va servir d'exemple tout au long de ce wiki

Le firewall est configuré pour être utilisé comme un Gateway, car il peut rediriger les packets vers un réseau local composé de plusieurs ordinateurs.

script iptables

#!/bin/bash
#
# Generated iptables firewall script for the Linux 2.4 kernel
# Script generated by Easy Firewall Generator for IPTables 1.15
# copyright 2002 Timothy Scott Morizot
# Sylvain Alain 2009
# Traduction ainsi que modification de certaines règles

##############################################################################

# Constantes
IPT=/sbin/iptables

IPT="/sbin/iptables"

IPTS="/sbin/iptables-save"

IPTR="/sbin/iptables-restore"

# Interface qui est sur Internet (WAN)
WAN_IFACE="eth1"

# Interface Wireless
WLAN_IFACE="wlan0" 

# Interface qui est dans votre réseau local (LAN)
LAN_IFACE="eth0"

# Adresse de votre passerelle (Firewall)
LAN_IP="192.168.1.1" 

LAN_NET="192.168.1.0/24" (Sous-réseau avec le masque 255.255.255.0)

LAN_BCAST="192.168.1.255" (Adresse de broadcast.)

# Interface Loopback

LOOP_IFACE="lo"

LOOP_IP="127.0.0.1"

##################### Démarrage du script ####################
#
# On réinitialise toutes les polices par défaut à la valeur accepté. C'est-à-dire on laisse passer le trafic.

$IPT -P INPUT ACCEPT
$IPT -P FORWARD ACCEPT
$IPT -P OUTPUT ACCEPT
$IPT -t nat -P PREROUTING ACCEPT
$IPT -t nat -P POSTROUTING ACCEPT
$IPT -t nat -P OUTPUT ACCEPT
$IPT -t mangle -P PREROUTING ACCEPT
$IPT -t mangle -P OUTPUT ACCEPT

# Les tables sont effacées.
$IPT -F
$IPT -t nat -F
$IPT -t mangle -F
$IPT -X
$IPT -t nat -X
$IPT -t mangle -X

# Le comportement par défaut est de bloquer le trafic.
$IPT -P INPUT DROP
$IPT -P OUTPUT DROP
$IPT -P FORWARD DROP

# Création des tables usager 

$IPT -N bad_packets

$IPT -N bad_tcp_packets

$IPT -N icmp_packets

# Table utilisée pour gérer les paquets UDP qui viennent de l'Internet.
$IPT -N udp_inbound

# Table utilisée pour bloquer le trafic UDP qui va sortir du lan et qui va aller sur internet.Par défaut, on laisse passer le trafic UDP en provenance du LAN.
$IPT -N udp_outbound

# Table utilisée si vous avez un serveur ssh ou ftp ou tout autre service que vous voulez rentre disponible sur l'internet.
# Par défaut, seulement le trafic initié par le LAN va pouvoir entrer, car on n'accepte pas le trafic qui veut entrer sans raison.
$IPT -N tcp_inbound

# Table utilisée pour bloquer le trafic TCP qui va sortir du lan et qui va aller sur internet.Par défaut, on laisse passer le trafic TCP en provenance du LAN.

$IPT -N tcp_outbound

# Cette option permet d'utiliser la notion de masquerade, car en utilisant cette fonction, on utilise le Firewall comme un gateway qui va faire comme si 
# toutes les requêtes des clients étaient en fait celle du Firewall
$IPT -t nat -A POSTROUTING -o $WAN_IFACE -j MASQUERADE

########Fonction ########
# bad_packets chain

# Cette fonction va être utilisée lorsqu'un packet internet va vouloir traverser le Firewall, soit l'interface WAN. 

#########################

# Cette règle est très importante, car elle permet de valider que le trafic provenant WAN n'a pas été modifié pour faire comme si le packet en question proviennait de votre LAN.

# C'est impossible, car si le packet provient d'internet, il ne peut pas avoir une adresse provenant de votre LAN, ainsi il faut se protéger pour ne pas se faire hacker.

# On drop le packet dans le but répondre à notre attaquant.

# On active la journalisation
$IPT -A bad_packets -p ALL -i $WAN_IFACE -s $LAN_NET -j LOG \
      --log-prefix "fp=bad_packets:2 a=DROP "

# On drop le packet.
$IPT -A bad_packets -p ALL -i $WAN_IFACE -s $LAN_NET -j DROP

# Si le packet est détecté comme étant invalide, on active la journalisation.

$IPT -A bad_packets -p ALL -m state --state INVALID -j LOG \
      --log-prefix "fp=bad_packets:1 a=DROP "

# On drop le packet.
$IPT -A bad_packets -p ALL -m state --state INVALID -j DROP


# Si le packet est toujours valide rendu à cette étape, nous poursuivons notre validation en appelant la fonction bad_tcp_packets

$IPT -A bad_packets -p tcp -j bad_tcp_packets

# Si tout est valide, on retourne à l'appelant
$IPT -A bad_packets -p ALL -j RETURN



########Fonction ########
# bad_tcp_packets chain

# Tout les packets TCP vont passer dans cette fonction.
# De plus, s'il y a une nouvelle connection qui arrive sur le Firewall, il faut que celle-ci envoit un packet SYN. Si ce n'est pas le cas, nous somme en présence d'un scanner de ports.
# Par conséquent, on va dropper le packet pour éviter de répondre et donner signe de vie à notre attaquant.

#########################

# Si la fonction est appelée et que la source est notre réseau interne (LAN), nous effectuons pas de vérification, car nous faisons confiance à notre réseau internet (LAN) au niveau des erreurs de packets.

$IPT -A bad_tcp_packets -p tcp -i $LAN_IFACE -j RETURN

# Si la fonction est appelée et que la source est notre réseau interne (wLAN), nous effectuons pas de vérification, car nous faisons confiance à notre réseau internet (LAN) au niveau des erreurs de packets.

$IPT -A bad_tcp_packets -p tcp -i $WLAN_IFACE -j RETURN

# However, I originally did apply this filter to the forward chain
# for packets originating from the internal network.  While I have
# not conclusively determined its effect, it appears to have the
# interesting side effect of blocking some of the ad systems.
# Apparently some ad systems have the browser initiate a NEW
# connection that is not flagged as a syn packet to retrieve
# the ad image.  If you wish to experiment further comment the
# rule above. If you try it, you may also wish to uncomment the
# rule below.  It will keep those packets from being logged.
# There are a lot of them.
# $IPT -A bad_tcp_packets -p tcp -i $LAN_IFACE ! --syn -m state \
#     --state NEW -j DROP


# Si nous sommes en présence d'une nouvelle tentative de connection sur notre Firewall et que celle-ci n'a pas le flag syn, c'est pas normal, on ne répond pas.
# C'est possiblement une attaque.

# On journalise l'évènement
$IPT -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j LOG \
     --log-prefix "fp=bad_tcp_packets:1 a=DROP "

# On drop le packet
$IPT -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j DROP

# Il y a quelque chose que ne fonctionne pas au niveau des flags, on journalise et on drop.

$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL NONE -j LOG \
      --log-prefix "fp=bad_tcp_packets:2 a=DROP "
$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL NONE -j DROP

$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL ALL -j LOG \
      --log-prefix "fp=bad_tcp_packets:3 a=DROP "
$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL ALL -j DROP

$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL FIN,URG,PSH -j LOG \
     --log-prefix "fp=bad_tcp_packets:4 a=DROP "
$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP

$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j LOG \
     --log-prefix "fp=bad_tcp_packets:5 a=DROP "
$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP

$IPT -A bad_tcp_packets -p tcp --tcp-flags SYN,RST SYN,RST -j LOG \
     --log-prefix "fp=bad_tcp_packets:6 a=DROP "
$IPT -A bad_tcp_packets -p tcp --tcp-flags SYN,RST SYN,RST -j DROP

$IPT -A bad_tcp_packets -p tcp --tcp-flags SYN,FIN SYN,FIN -j LOG \
     --log-prefix "fp=bad_tcp_packets:7 a=DROP "
$IPT -A bad_tcp_packets -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP

# S'il n'y a pas n'anomalie, on retourne à l'appelant.
$IPT -A bad_tcp_packets -p tcp -j RETURN

########Fonction ########
# icmp_packets chain
# Cette fonction est utilisée seulement pour les packets ICMP en provenant de l'internet (WAN).
# Le retour de type 8 (Echo Request) n'est pas accepté par défaut, car on ne veut pas répondre au ping.
# Le retour de type 11 (Time Exceeded) est accepté, car c'est le seul qui est absolument nécessaire pour que cela fonctionne.

# Les packets ICMP vont nous donner l'état d'une requête, une connection refusée etc...

# Pour plus de détails : http://www.ee.siue.edu/~rwalden/networking/icmp.html

#########################

# Les packets ICMP proviennent de la couche 2 (Liaison de données) de la couche OSI et selon le standard, il n'est pas accepté d'avoir des packets qui utilisent la fragmentation.
# Lorsque cette situation ce présente, nous sommes en présence d'un deni de service (DOS).

# On journalise l'évènement et on drop le packet.
$IPT -A icmp_packets --fragment -p ICMP -j LOG \
     --log-prefix "fp=icmp_packets:1 a=DROP "
$IPT -A icmp_packets --fragment -p ICMP -j DROP


# Si vous voulez répondre au ping, vous devez activer les 3 lignes suivantes :

# $IPT -A icmp_packets -p ICMP -s 0/0 --icmp-type 8 -j LOG \
#    --log-prefix "fp=icmp_packets:2 a=ACCEPT "
# $IPT -A icmp_packets -p ICMP -s 0/0 --icmp-type 8 -j ACCEPT


# Par défaut, on drop les packet ICMP de type ping, car nous ne voulons pas répondre.

$IPT -A icmp_packets -p ICMP -s 0/0 --icmp-type 8 -j DROP

# On accepte seulement les packets ICMP qui ont de type 11 (Délai dépassé)
$IPT -A icmp_packets -p ICMP -s 0/0 --icmp-type 11 -j ACCEPT

# Si aucune anomalie, on retourne à l'appelant.
$IPT -A icmp_packets -p ICMP -j RETURN

########Fonction ########
# udp_inbound chain
# Cette fonction traite les packets UDP en provenant de l'internet (WAN).
# Elle va traiter les packets qui proviennent d'une nouvelle connection seulement, soit new.
#########################

# Les packets netbios sont droppés par défaut s'ils proviennent de l'internet.

$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 137 -j DROP
$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 138 -j DROP

# On rejette les packets qui veulent communiquer via le port 113.

$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 113 -j REJECT

# On laisse passer le protocle DHCP
$IPT -A udp_inbound -p UDP -s 0/0 --source-port 67 --destination-port 68 \
     -j ACCEPT

# S'il n'y a pas d'anomalie, on retourne à l'appelant
$IPT -A udp_inbound -p UDP -j RETURN

########Fonction ########
# udp_outbound chain
# Cette fonction est utilisée pour bloquer en sortie les ports UDP pour éviter que les clients sur le réseau LAN puisse communiquer vers l'internet(WAN) avec ceux-ci.

# Cette fonction est utilisée seulement avec FORWARD.
#########################

# Si on bloque rien, par défaut on accepte que le packet puisse traverser le LAN pour se ramasser vers l'internet.

$IPT -A udp_outbound -p UDP -s 0/0 -j ACCEPT

########Fonction ########
# tcp_inbound chain

# Cette fonction est utilisée pour permettre des connections TCP venant de l'internet d'arriver jusqu'à votre LAN.
# Par défaut, si le packet ce rend ici, il va être droppé par défaut, car la police par défaut est justement drop.
# C'est ici que vous devez activer les ports pour les serveurs que vous hébergez dans votre LAN.

# Prenez note que tout est en commentaire pour vous protégez.

#########################

### Protection contre les attaques de force brute pour FTP
#$IPT -A tcp_inbound -p tcp -s 0/0 --destination-port 21 -m state --state NEW -m recent --set
#$IPT -A tcp_inbound -p tcp -s 0/0 --destination-port 21 -m state --state NEW -m recent --update --seconds 600 --hitcount 3 -j DROP

### Protection contre les attaques de force brute pour SSH
#$IPT -A tcp_inbound -p tcp -s 0/0 --destination-port 22 -m state --state NEW -m recent --set
#$IPT -A tcp_inbound -p tcp -s 0/0 --destination-port 22 -m state --state NEW -m recent --update --seconds 600 --hitcount 3 -j DROP

# Activation d'un serveur FTP maison
# Serveur FTP (Control)
#$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 21 -j ACCEPT

# Serveur FTP (Data)
#$IPT -A tcp_inbound -p TCP -s 0/0 --source-port 20 -j ACCEPT

# Serveur SSH
#$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 22 -j ACCEPT

# Permettre le protocole ICQ
# Le procotole ICQ doit être en mesure d'ouvrir des nouvelles connections sur le client et dans ce cas, on doit permettre l'ouverture d'une connection venant de l'extérieur sur certains ports.
#$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 5000:5100 -j ACCEPT

# Permettre le transfert de fichiers via MSN Messenger
#$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 6891:6900 -j ACCEPT

# Si celui-ci ne fait pas partie des exceptions, on retourne à l'appelant et le packet est droppé.
$IPT -A tcp_inbound -p TCP -j RETURN

########Fonction ########
# tcp_outbound chain

# Cette fonction est utilisée pour bloquer en sortie les packets TCP provenant du réseau LAN.
# Cette fonction est utilisé seulement par FORWARD

#########################

# On bloque le protocole IRC
# $IPT -A tcp_outbound -p TCP -s 0/0 --destination-port 194 -j REJECT

# On bloque le protocole Telnet
#$IPT -A tcp_outbound -p TCP -s 0/0 --destination-port 23 -j REJECT

# On bloque SSH
# $IPT -A tcp_outbound -p TCP -s 0/0 --destination-port 22 -j REJECT

# On bloque le protocole FTP
#$IPT -A tcp_outbound -p TCP -s 0/0 --destination-port 21 -j REJECT
#$IPT -A tcp_outbound -p TCP -s 0/0 --destination-port 20 -j REJECT

# On bloque AIM
#$IPT -A tcp_outbound -p TCP -s 0/0 --destination-port 5190 -j REJECT
#$IPT -A tcp_outbound -p TCP -s 0/0 --destination-port 4443 -j REJECT

# On bloque MSN Messenger
# $IPT -A tcp_outbound -p TCP -s 0/0 --destination-port 1863 -j REJECT


# Par défaut, on laisse tout passer en sortie venant de l'interface LAN.
$IPT -A tcp_outbound -p TCP -s 0/0 -j ACCEPT

############## Les évènements gérés par le FIREWALL ############################
#
# La fonction INPUT Chain
# Tout les packets qui entre soit par le réseau LAN ou WAN appellent cette fonction
###############################################################################

# L'interface Loopback passe sans restriction

$IPT -A INPUT -p ALL -i $LOOP_IFACE -j ACCEPT


# Tout ce qui entre doit passer dans la fonction bad_packets et s'il y a un erreur, on drop le packet.
$IPT -A INPUT -p ALL -j bad_packets

        # DOCSIS compliant cable modems
        # Some DOCSIS compliant cable modems send IGMP multicasts to find
        # connected PCs.  The multicast packets have the destination address
        # 224.0.0.1.  You can accept them.  If you choose to do so,
        # Uncomment the rule to ACCEPT them and comment the rule to DROP
        # them  The firewall will drop them here by default to avoid
        # cluttering the log.  The firewall will drop all multicasts
        # to the entire subnet (224.0.0.1) by default.  To only affect
        # IGMP multicasts, change '-p ALL' to '-p 2'.  Of course,
        # if they aren't accepted elsewhere, it will only ensure that
        # multicasts on other protocols are logged.
        # Drop them without logging.

# Certains modems câble doivent communiquer vers l'adresse 224.0.0.1 sinon, ils ne vont pas fonctionner.
# On accepte ou on drop.
$IPT -A INPUT -p ALL -d 224.0.0.1 -j DROP
# $IPT -A INPUT -p ALL -d 224.0.0.1 -j ACCEPT

# Permettre au réseau local de passer librement et de communiquer avec le Firewall
$IPT -A INPUT -p ALL -i $LAN_IFACE -s $LAN_NET -j ACCEPT
$IPT -A INPUT -p ALL -i $LAN_IFACE -d $LAN_BCAST -j ACCEPT

$IPT -A INPUT -p ALL -i $WLAN_IFACE -s $LAN_NET -j ACCEPT
$IPT -A INPUT -p ALL -i $WLAN_IFACE -d $LAN_BCAST -j ACCEPT



# On accepte seulement les connections venant de l'internet qui ont le status ESTABLISHED ou RELATED, car cela nous garantie que c'est le LAN qui a initié une connection.
$IPT -A INPUT -p ALL -i $WAN_IFACE -m state --state ESTABLISHED,RELATED \
     -j ACCEPT

# Dans le cas contraire, on doit valider si le packet peut passer.
$IPT -A INPUT -p TCP -i $WAN_IFACE -j tcp_inbound
$IPT -A INPUT -p UDP -i $WAN_IFACE -j udp_inbound
$IPT -A INPUT -p ICMP -i $WAN_IFACE -j icmp_packets

# Si on packet broadcast arrive jusqu'ici, on le drop.
$IPT -A INPUT -m pkttype --pkt-type broadcast -j DROP

# Si pour une raison X, le packet est rendu ici, on le journalise pour pouvoir l'examiner plus tard.
$IPT -A INPUT -j LOG --log-prefix "fp=INPUT:99 a=DROP "


###############################################################################
# La fonction FORWARD Chain

# Cette fonction est utilisé pour acheminer les packets vers le Firewall ou de traiter ceux que le Firewall envoit.
###############################################################################

# On vérifie si le packet est valide
$IPT -A FORWARD -p ALL -j bad_packets

# On vérifie si on a le droit d'envoyer ce packet TCP.
$IPT -A FORWARD -p tcp -i $LAN_IFACE -j tcp_outbound
$IPT -A FORWARD -p tcp -i $WLAN_IFACE -j tcp_outbound


# On vérifie si on a le droit d'envoyer ce packet UDP.
$IPT -A FORWARD -p udp -i $LAN_IFACE -j udp_outbound
$IPT -A FORWARD -p udp -i $WLAN_IFACE -j udp_outbound

# Si tout est correct, on accepte de l'envoyer
$IPT -A FORWARD -p ALL -i $LAN_IFACE -j ACCEPT
$IPT -A FORWARD -p ALL -i $WLAN_IFACE -j ACCEPT


# Si le packet vient de l'internet et qu'il a été initié par le LAN, on l'accepte.
$IPT -A FORWARD -i $WAN_IFACE -m state --state ESTABLISHED,RELATED \
     -j ACCEPT

# Si on se rendu ici, on journalise le packet qui est en erreur et on le drop.
$IPT -A FORWARD -j LOG --log-prefix "fp=FORWARD:99 a=DROP "

###############################################################################
# La fonction OUTPUT Chain

# Cette fonction est utilisé pour que le FIREWALL puisse envoyer les packets sur l'internet.
###############################################################################

# On laisse tout sortir sauf les packets ICMP qui sont invalide.
$IPT -A OUTPUT -m state -p icmp --state INVALID -j DROP

# Le trafic qui se promène sur l'Interface Loopback
$IPT -A OUTPUT -p ALL -s $LOOP_IP -j ACCEPT
$IPT -A OUTPUT -p ALL -o $LOOP_IFACE -j ACCEPT

# Le trafic qui se promène sur le réseau LAN
$IPT -A OUTPUT -p ALL -s $LAN_IP -j ACCEPT
$IPT -A OUTPUT -p ALL -o $LAN_IFACE -j ACCEPT

$IPT -A OUTPUT -p ALL -o $WLAN_IFACE -j ACCEPT

# Le trafic qui sort vers l'internet
$IPT -A OUTPUT -p ALL -o $WAN_IFACE -j ACCEPT

# Si on se rend là, on journalise le packet et on le drop.
$IPT -A OUTPUT -j LOG --log-prefix "fp=OUTPUT:99 a=DROP "

# Vu qu'on est en DHCP, on active le NAT pour faire à semblant que c'est le Firewall qui envoit tous les packets sur internet, même si c'est le clients du réseau interne qui le font pour de vrai.
$IPT -t nat -A POSTROUTING -o $WAN_IFACE -j MASQUERADE


Installation de Iptables

Gnome-dev-computer.png
# emerge -av iptables

Configuration du noyau pour Iptables

Configuration des options nécessaire section Networking

Network Support 
 --> Networking options 
     [*] Network packet filtering framework (Netfilter)  ---> 
        [*]   Advanced netfilter configuration (NEW)  
        Core Netfilter Configuration  --->   
             <M> Netfilter LOG over NFNETLINK interface
             <M> Netfilter connection tracking support         
             <M> Connection mark tracking support 
             [*] Connection tracking events  
             <M>   UDP-Lite protocol connection tracking support    
             <M>   FTP protocol support
             <M>   IRC protocol support
             <M>   Connection tracking netlink interface      
             <M> Netfilter Xtables support (required for ip_tables) 
             <M>   "CONNMARK" target support 
             <M>   "MARK" target support
             <M>   "connmark" connection mark match support
             <M>   "conntrack" connection tracking match support
             <M>   "iprange" address range match support
             <M>   "length" match support
             <M>   "limit" match support     
             <M>   "mark" match support
             <M>   "multiport" Multiple port match support               
             <M>   "pkttype" packet type match support 
             <M>   "recent" match support
             <M>   "state" match support     
             <M>   "string" match support
             <M>   "tcpmss" match support   
        IP: Netfilter Configuration  --->  
             <M> IPv4 connection tracking support (required for NAT)
             [*] proc/sysctl compatibility with old connection tracking (NEW)
             <M> IP tables support (required for filtering/masq/NAT)
                <M>   "addrtype" address type match support
                <M>   "ah" match support
                <M>   "ecn" match support
                <M>   "ttl" match support 
                <M>   Packet filtering
                <M>   REJECT target support 
                <M>   LOG target support 
                <M>   ULOG target support  
                <M>   Full NAT 
                <M>   MASQUERADE target support 
                <M>   NETMAP target support
                <M>   REDIRECT target support 
                <M>   Basic SNMP-ALG support
                <M>   Packet mangling 
                <M>   CLUSTERIP target support (EXPERIMENTAL) 
                <M>   ECN target support 
                <M>   "TTL" target support 
                <M>   raw table support (required for NOTRACK/TRACE) 
                <M>   ARP tables support                               
                <M>   ARP packet filtering 
                <M>   ARP payload mangling            


Cheminement par défaut des packets

Cheminement

À l’arrivée d’un paquet (après décision de routage) :

1. Si le paquet est destiné à l’hôte local Alors
2.       il traverse la chaîne INPUT.
3.       Si il n’est pas rejeté Alors
4.            il est transmis au processus impliqué.
5. Sinon
6.       Si le paquet est destiné à un hôte d’un autre réseau Alors
7.                 il traverse la chaîne FORWARD
8.                 Si il n’est pas rejeté Alors
9.                        il poursuit alors sa route
10.                Si le packet a traversé la chaîne FORWARD lors d'un échange LAN --> WAN, celui-ci va passer par la chaîne OUTPUT pour sortir définitivement du firewall et s'en aller vers l'internet.


Enfin, la clause FORWARD est utilisée seulement par le firewall et si celui-ci gère des adresses IP sous lui. De plus, la clause FORWARD est utilisée pour faire transiger le trafic entre le LAN et le WAN.

Pour les autres périphériques, c'est la clause OUTPUT qui est utilisée.

Mise en place du Firewall

Vous devez enregistrer ce fichier dans le répertoire /root

Par la suite, vous devez lancer les commandes suivantes pour activer le firewall :

script iptables.sh

# cd /root
# chmod +x iptables.sh
# ./iptables.sh
# iptables -L -v
# iptables-save
# /etc/init.d/iptables save
# rc-update add iptables default
# /etc/init.d/iptables start


Installation du serveur DHCP et DNS sur le firewall

Gnome-dev-computer.png
# emerge -av dnsmasq


Configuration du serveur DHCP

# nano /etc/dnsmasq.conf
dhcp-range=192.168.1.100,192.168.1.254 72h
interface=eth0


Gnome-dev-computer.png
# rc-update add dnsmasq default
# /etc/init.d/dnsmasq start

Installation d'un programme pour gérer les connexions IRC

Gnome-dev-computer.png
# emerge -av midentd
# rc-update add midentd default
# /etc/init.d/midentd start

Explications

La première chose qu'il faut comprendre en utilisant Iptables c'est son mode de fonctionnement. En effet, sans connaître celui-ci, les règles(rules) n'ont plus de signification.

1. Lorsqu'un packet veut entrer ou sortir, il passe obligatoirement dans le Firewall. Le packet en question va déclencher (Trigger) l'évènement INPUT,FORWARD ou OUTPUT.

  • L'évènement INPUT est déclenché quand un packet veut entrer dans votre réseau via une interface.
  • L'évènement FORWARD est déclenché quand un packet doit être redirigé vers une autre addresse IP ou un port puisque celle-ci ne correspond pas à la destination finale du packet.
  • L'évènement OUTPUT permet de laisser passer un packet sans restriction sur le réseau choisit.
  • INPUT,FORWARD et OUTPUT il faut les comparer comme des triggers sur une base de données Oracle.

2. Il existe 4 actions lorsqu'on veut agir sur un packet, ACCEPT,DROP,REJECT et RETURN.

  • ACCEPT comme son nom l'indique permet d'accepter le packet.
  • DROP, permet de rejeter le packet sans pour autant donner signe de vie à l'émetteur du packet.
  • REJECT, permet de rejeter le packet, par contre on donne signe de vie en émettant une réponse à l'émetteur du packet.
  • RETURN, permet de retourner à la fonction appelante, ce qui est très pratique dans plusieurs situations.

3. Pour qu'une règle puisse s'exécuter, il faut qu'elle soit valide à 100% au niveau des critères, par la suite l'action va être exécutée.

4. Il est très important de noter que lorsque la règle s'exécute avec l'action ACCEPT,DROP ou REJECT, on effectue l'action et par la suite on passe au packet suivant.

5. Seulement l'action RETURN est en mesure de continuer d'exécuter le script.

Exemple du cheminement d'un packet venant de l'internet

Tout d'abord, puisque le packet vient d'internet, celui-ci va déclencher l'évènement INPUT et tout ce qui est dans cette section va être validé et surtout exécuté séquentiellement

1. Le packet va déclencher l'exécution de la règle suivante : $IPT -A INPUT -p ALL -j bad_packets

2. Cela va exécuter la routine bad_packets. Si tout est conforme, par la suite on va exécuter la routine bad_tcp_packets si le packet en question utilise le protocole TCP.

3. Si tout est conforme, l'exécution continue et on se retrouve à l'endroit où la fonction bad_packets a été déclenchée.

4. La règle $IPT -A INPUT -p ALL -d 224.0.0.1 -j DROP va être vérifiée et si elle ne correspond pas, on continue l'exécution.

5. La règle $IPT -A INPUT -p ALL -i $WAN_IFACE -m state --state ESTABLISHED,RELATED -j ACCEPT va s'exécuter si le packet a été initiée par le client. Si ce n'est pas le cas, on continue, sinon on accepte la réception du packet et c'est terminé.

6. Si la règle n'a pas été exécutée au point 5, on va exécuter les règles suivantes :

$IPT -A INPUT -p TCP -i $WAN_IFACE -j tcp_inbound $IPT -A INPUT -p UDP -i $WAN_IFACE -j udp_inbound $IPT -A INPUT -p ICMP -i $WAN_IFACE -j icmp_packets Si quelque chose correspond, on va accepter ou refuser le packet.

7. Si le packet est maintenant rendu à cette étape, on va le refuser automatiquement, car la règle par défaut configurée au début du programme est DROP.

$IPT -P INPUT DROP

Exemple du cheminement d'un packet qui est redirigé

Tout d'abord, puisque le packet doit être redirigé de votre réseau local vers le Firewall ou vice versa, c'est évènement FORWARD qui va être déclenché.

1. Le packet va déclencher la règle $IPT -A FORWARD -p ALL -j bad_packets

2. Cela va exécuter la routine bad_packets. Si tout est conforme, par la suite on va exécuter la routine bad_tcp_packets si le packet en question utilise le protocole TCP.

3. Le packet va déclencer la règle $IPT -A FORWARD -p tcp -i $LAN_IFACE -j tcp_outbound si celui-ci provient du réseau local LAN via le protocole TCP et il sera accepté ou droppé.

4. Le packet va déclencer la règle $IPT -A FORWARD -p tcp -i $WLAN_IFACE -j tcp_outbound si celui-ci provient du réseau sans-fil via le protocole TCP et il sera accepté ou droppé.

6. Le packet va déclencer la règle $IPT -A FORWARD -p udp -i $LAN_IFACE -j udp_outbound si celui-ci provient du réseau local LAN via le protocole UDP et il sera accepté ou droppé.

7. Le packet va déclencer la règle $IPT -A FORWARD -p udp -i $LAN_IFACE -j udp_outbound si celui-ci provient du réseau local LAN via le protocole UDP et il sera accepté ou droppé.

8. Si le packet en question se rend jusqu' à cette étape et qu'il provient de l'interface réseau local LAN, le packet va déclencer la règle $IPT -A FORWARD -p ALL -i $LOCAL_IFACE -j ACCEPT et il sera accepté.

9. Si le packet en question se rend jusqu'à cette étape et qu'il provient de l'interface réseau sans-fil, le packet va déclencer la règle $IPT -A FORWARD -p ALL -i $WLAN_IFACE -j ACCEPT et il sera accepté.

10. Le packet va déclencer la règle $IPT -A FORWARD -i $WAN_IFACE -m state --state ESTABLISHED,RELATED -j ACCEPT si celui-ci provient d'internet et qu'il est envoyé à la suite de l'initiation de la connection faite antérieurement par le client.En terme clair, c'est le LAN qui a initié une connection vers l'internet et internet envoie seulement des réponses, les packets venant de internet ne peuvent pas initier de connections sur le Firewall.

11. Si on se rend ici, on journalise le packet qui est en erreur et on le drop, car c'est pas normal $IPT -A FORWARD -j LOG --log-prefix "fp=FORWARD:99 a=DROP "

Exemple du cheminement d'un packet qui peut naviguer librement entre votre LAN et internet

Tout d'abord, puisque le packet doit traverser votre réseau local LAN pour traverser votre Firewall et s'en aller sur internet, celui-ci va déclencher l'évènement OUTPUT.

1. Le packet va déclencher la règle si celui-ci utilise le protocole ICMP et qu'il est invalide $IPT -A OUTPUT -m state -p icmp --state INVALID -j DROP

2. Le packet va cheminer librement s'il provient de l'addresse IP correspondant à l'interface Loopback car celui-ci va déclencer la règle $IPT -A OUTPUT -p ALL -s $LOOP_IP -j ACCEPT

3. Le packet va cheminer librement s'il possède comme destination l'interface Loopback car celui-ci va déclencer la règle $IPT -A OUTPUT -p ALL -o $LOOP_IFACE -j ACCEPT

4. Le packet va cheminer librement s'il provient de l'adresse IP correspondant à votre interface LAN car celui-ci va déclencer la règle $IPT -A OUTPUT -p ALL -s $LAN_IP -j ACCEPT

5. Le packet va cheminer librement s'il ppossède comme destination votre interface LAN car celui-ci va déclencer la règle $IPT -A OUTPUT -p ALL -o $LAN_IFACE -j ACCEPT

6. Le packet va cheminer librement s'il possède comme destination votre interface sans-fil car celui-ci va déclencer la règle $IPT -A OUTPUT -p ALL -o $WLAN_IFACE -j ACCEPT

7. Le packet va cheminer librement s'il possède comme destination internet car celui-ci va déclencer la règle $IPT -A OUTPUT -p ALL -o $WAN_IFACE -j ACCEPT

8. Enfin, si le script ce rend jusqu'ici, nous allons droppé le packet et il va être journalisé car il va déclencer la règle $IPT -A OUTPUT -j LOG --log-prefix "fp=OUTPUT:99 a=DROP "

Cheminement par défaut des packets

1. Lorsqu’un paquet entre dans une interface, il traverse les règles de type INPUT 2. S'il est accepté Alors 3. S'il est destiné à une autre machine Alors 4. il est routé vers les règles FORWARD 5. Sinon 6. il est rejeté 7. Le packet est finalement émis

Dans tous les cas, le packet traverse la règle OUTPUT.

Enfin, la clause FORWARD est utilisée seulement par le firewall et si celui-ci gère des adresses IP sous lui.


Outils personnels