OldGentooWiki:Utilisation de Iptables pour débutant

De Gentoo-Quebec.

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


Gentoo-quebec+Funtoo-quebec.png

Utilisation de Iptables pour débutant


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é sur internet sans défense.

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

Prenez pour acquis que l'interface eth1 est un câble qui est relié directement au modem câble tandis que l'interface eth0 est branché dans votre réseau local et que cet interface donne le signal à une switch 4 ports par exemple.

Par conséquent, vous devez avoir 2 cartes réseau dans l'ordinateur qui va devenir votre routeur/firewall.

De plus, nous allons installer un serveur DHCP ainsi qu'un serveur DNS pour obtenir les mêmes services qu'un routeur Linksys vous offre par exemple.

Sommaire

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            


Configuration de Iptables

script iptables.sh

#!/bin/bash

# Constantes
IPT=/sbin/iptables

IPTS="/sbin/iptables-save"

IPTR="/sbin/iptables-restore"

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

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

# 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"

$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


# Si un packet est invalide, on le drop pour ne pas causer d'erreur
$IPT -A INPUT -m state --state INVALID -j LOG --log-prefix "DROP INVALID " --log-ip-options --log-tcp-options
$IPT -A INPUT -m state --state INVALID -j DROP

# Tout le trafic venant de l'interface Loopback est accepté.
$IPT -A INPUT -i $LOOP_IFACE -p ALL -j ACCEPT

# On accepte le trafic en entrée si et seulement si il a été initié par un client du LAN

$IPT -A INPUT -i $LAN_IFACE -p ALL  -m state --state ESTABLISHED,RELATED -j ACCEPT

# Si on reçoit un packet qui arrive sur l'interface eth1 et qu'il ne provient pas du LAN, c'est un packet qui est spoofé.
$IPT -A INPUT -i $LAN_IFACE -s ! $LAN_NET -j DROP

# On accepte seulement les packets ICMP dans le LAN à raison de 1 par seconde
$IPT -A INPUT -i $LAN_IFACE -p ICMP  -m limit --limit 1/s -j ACCEPT  

# On accepte une connection SSH sur le firewall si le client est dans le LAN
$IPT -A INPUT -i $LAN_IFACE -p tcp -s $LAN_NET --dport 22 --syn -m state --state NEW -j ACCEPT

# On accepte le trafic en entrée si et seulement si il a été initié par un client du LAN
$IPT -A INPUT -i $WAN_IFACE  -p ALL  -m state --state ESTABLISHED,RELATED -j ACCEPT

# On accepte seulement ce type de packet ICMP s'il provient d'internet
$IPT -A INPUT -i $WAN_IFACE  -p ICMP --icmp-type time-exceeded -j ACCEPT

# On drop les packets de type broadcast
$IPT -A INPUT -i $WAN_IFACE -m pkttype --pkt-type broadcast -j DROP

# Si le packet vient d'internet et il y a un problème au niveau des flags, on le drop.
$IPT -A INPUT -i $WAN_IFACE -p tcp --tcp-flags ALL NONE -j DROP
$IPT -A INPUT -i $WAN_IFACE -p tcp --tcp-flags ALL ALL -j DROP
$IPT -A INPUT -i $WAN_IFACE -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
$IPT -A INPUT -i $WAN_IFACE -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
$IPT -A INPUT -i $WAN_IFACE -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
$IPT -A INPUT -i $WAN_IFACE -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP


# Si le packet est invalide, on le drop
$IPT -A FORWARD -m state --state INVALID -j LOG --log-prefix "DROP INVALID " --log-ip-options --log-tcp-options
$IPT -A FORWARD -m state --state INVALID -j DROP

# On redirige un packet vers le LAN si celui-ci pointe vers le LAN
$IPT -A FORWARD -i $WAN_IFACE -p ALL  -d $LAN_NET  -j ACCEPT

# Si le packet arrive sur le LAN on accepte qu'il soit redirigé
$IPT -A FORWARD -i $LAN_IFACE -p ALL -s $LAN_NET -j ACCEPT

# Si le packet arrive sur le LAN et qu'il n'est pas dans le range d'adresse du LAN, on le drop
$IPT -A FORWARD -i $LAN_IFACE -s ! $LAN_NET -j DROP

$IPT -A FORWARD -p icmp -m limit --limit 1/s -j ACCEPT

$IPT -A OUTPUT -m state --state INVALID -j LOG --log-prefix "DROP INVALID " --log-ip-options --log-tcp-options
$IPT -A OUTPUT -m state --state INVALID -j DROP

# On permet le trafic en sortie
$IPT -A OUTPUT -p ALL -o $WAN_IFACE -j ACCEPT
$IPT -A OUTPUT -p ALL -s $LOOP_IP    -j ACCEPT
$IPT -A OUTPUT -p ALL -o $LOOP_IFACE -j ACCEPT
$IPT -A OUTPUT -p ALL -s $LAN_IP -j ACCEPT
$IPT -A OUTPUT -p ALL -o $LAN_IFACE -j ACCEPT

# Puisqu'on est derrière un firewall et qu'on doit utiliser la fonction NAT pour communiquer avec l'internet.
$IPT -t nat -A POSTROUTING -o $WAN_IFACE -j MASQUERADE


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

Outils personnels