Transformation d'une machine Linux en routeur firewall

DESMETTRE Julien
LEBON Samuel
FI 2001
RIO 2000

EXEMPLE IPCHAINS

     IPChains: Exemple complet et commenté

#! /bin/sh
# Création d'un routeur filtrant avec masquage
# définition des variables

IPCHAINS=/sbin/ipchains

LOCALNET="192.168.1.0/24" # le réseau privé de l'entreprise
ETHINSIDE="192.168.1.1" # exemple d'adresse IP interne
ETHOUTSIDE="193.251.53.1" # exemple d'adresse IP publique
LOOPBACK="127.0.0.1/8" # adresse de loopback ; constante
ANYWHERE="0/0"
OUTSIDEIF=eth1 # nom de l'interface du routeur côté extérieur
FORWARD_PROCENTRY=/proc/sys/net/ipv4/ip_forward

# Les deux commandes suivantes renverront des codes d 'erreur si les règles existent déjà ; placé avant
# set- e pour que le script ne plante pas dans ce cas précis :

$IPCHAINS -N outside
$IPCHAINS -N portmap
set -e # annule immédiatement le script, à cause d'une erreur sur les règles

# Nettoyer la table de filtrage et l'IP forwarding (mise à plat du firewall) :

echo "0" > ${FORWARD_PROCENTRY}

$IPCHAINS -F forward
$IPCHAINS -F input
$IPCHAINS -F output
$IPCHAINS -F outside
$IPCHAINS -F portmap

# Masquage des paquets à destination de l'extérieur ; ne pas masquer les paquets local vers local :

$IPCHAINS -A forward -s $LOCALNET -d $LOCALNET -j ACCEPT
$IPCHAINS -A forward -s $ETHOUTSIDE -d $ANYWHERE -j ACCEPT
$IPCHAINS -A forward -s $LOCALNET -d $ANYWHERE -j MASQ

# Définition des priorités ; délais minimum de connexions pour www, telnet, ftp, ssh ; paquets sortants
# seulement :

$IPCHAINS -A output -p tcp -d $ANYWHERE www -t 0x01 0x10
$IPCHAINS -A output -p tcp -d $ANYWHERE telnet -t 0x01 0x10
$IPCHAINS -A output -p tcp -d $ANYWHERE ftp -t 0x01 0x10
$IPCHAINS -A output -p tcp -d $ANYWHERE ssh -t 0x01 0x10

# Définition des règles de filtrage :

$IPCHAINS -A input -s $LOCALNET -j ACCEPT
$IPCHAINS -A input -s $LOOPBACK -j ACCEPT
$IPCHAINS -A input -s $ETHOUTSIDE -j ACCEPT

# Définition des règles pour les paquets venant de l'extérieur :

$IPCHAINS -A input -i ${OUTSIDEIF} -j outside
$IPCHAINS -A input -i ppp+ -j outside


Définition des règles pour les paquets venant de l'extérieur

# Refuser tout paquet venant de l'extérieur et ayant une adresse interne, pour éviter l'IP Spoofing :

$IPCHAINS -A outside -s $LOCALNET -j DENY
$IPCHAINS -A outside -s $LOOPBACK -j DENY

# Aucun paquet venant de l'extérieur ne doit pénétrer sur le réseau local, parce qu'à l'extérieur, personne
# n'est supposé connaître la plage d'adresses privée interne :

$IPCHAINS -A outside -d $LOCALNET -j DENY

# Refuser toute connexion sur le port X (blocs 6000 à 6010) :

$IPCHAINS -l -A outside -p TCP -s $ANYWHERE -d $ANYWHERE 6000:6010 -j DENY

# Refuser les connexion externes vers les ports NFS (111 et 2049), sur TCP ou UDP :

$IPCHAINS -l -A outside -p TCP -s $ANYWHERE -d $ANYWHERE 111 -j DENY
$IPCHAINS -l -A outside -p TCP -s $ANYWHERE -d $ANYWHERE 2049 -j DENY
$IPCHAINS -l -A outside -p UDP -s $ANYWHERE -d $ANYWHERE 111 -j DENY
$IPCHAINS -l -A outside -p UDP -s $ANYWHERE -d $ANYWHERE 2049 -j DENY

# Refuser les paquets XDM de l'extérieur (port 177 UDP) :

$IPCHAINS -l -A outside -p UDP -s $ANYWHERE -d $ANYWHERE 177 -j DENY

# Refuser les paquets YP/NIS (port 653) :

$IPCHAINS -l -A outside -p TCP -s $ANYWHERE -d $ANYWHERE 653 -j DENY

# Ne pas surcharger le port 80 TCP en évitant les connexions extérieures sur ce port :

$IPCHAINS -A outside -p TCP -s $ANYWHERE -d $ANYWHERE 80 -j DENY

# Accepter les connexions FTP (ports 20 et 21) :

$IPCHAINS -A outside -p TCP -s $ANYWHERE 20:21 -d $ANYWHERE 1024: -j ACCEPT

# Accepter les paquets SSH d' administration à distance :

$IPCHAINS -A outside -p TCP -s $ANYWHERE -d $ANYWHERE ssh -j ACCEPT

# Accepter les paquets DNS venant de l'extérieur (port 53 TCP et UDP) :

$IPCHAINS -A outside -p TCP -s $ANYWHERE -d $ANYWHERE 53 -j ACCEPT
$IPCHAINS -A outside -p UDP -s $ANYWHERE -d $ANYWHERE 53 -j ACCEPT

# Accepter tout le trafic SMTP sur le port 25 uniquement :

$IPCHAINS -A outside -p TCP -s $ANYWHERE -d $ANYWHERE 25 -j ACCEPT

# Accepter les paquets NTP de synchronisation d'horloge (port 123) :

$IPCHAINS -A outside -p UDP -s $ANYWHERE -d $ANYWHERE 123 -j ACCEPT

# Eteindre et connecter tous les autres paquets entrants, TCP ou UDP, sur des ports réservés :

$IPCHAINS -l -A outside -p TCP -s $ANYWHERE -d $ANYWHERE :1023 -y -j DENY
$IPCHAINS -l -A outside -p UDP -s $ANYWHERE -d $ANYWHERE :1023 -j DENY

# Check against the portmapper ruleset

$IPCHAINS -A outside -j portmap

Fin des règles pour les paquets venant de l'extérieur


# D'autres options de règles de filtrage :

$ IPCHAINS -A output -p UDP -i $OUTSIDEIF -s $ANYWHERE 513 -d $ANYWHERE -j DENY

# Empêcher les paquets NetBios de sortir :

$ IPCHAINS -A output -p UDP -i $OUTSIDEIF -s $ANYWHERE 137 -d $ANYWHERE -j DENY

# Activer l'IP Forwarding :

echo "1" > ${FORWARD_PROCENTRY}

# Empêcher le ping des stations extérieures à votre réseau local sur celui-ci :

$ IPCHAINS -A input -b -i eth0 -p icmp -s 0/0 -d 0/0

# Interdire la consultation de certaines pages, par exemple www.enic.fr (pour toutes les adresses du réseau local), http://webenic.enic.fr (juste pour les adresses du réseau local commençant par 192.168.61) et http://www.laetitia-casta.com/ (juste pour l'adresse du réseau local 192.168.61.5). Vous pouvez mettre à la place des noms les adresses IP correspondantes :

$ IPCHAINS -A output -i eth1 -s 0/0 -d www.enic.fr -l -j REJECT
$ IPCHAINS -A output -i eth1 -s 192.168.61.0/24 -d webenic.enic.fr -l -j REJECT
$ IPCHAINS -A output -i eth1 -s 192.168.61.5/32 -d www.laetitia-casta.com -l -j REJECT

# Protéger son réseau local NetBEUI des attaques extérieures :

$ IPCHAINS -A input -i eth0 -p tcp -s 0/0 -d 192.168.61.0/24 139 -l -j DENY
$ IPCHAINS -A input -i eth0 -p udp -s 0/0 -d 192.168.61.0/24 139 -l -j DENY

# Protection pour les attaques BackOrifice :

IPCHAINS -A input -i eth0 -p tcp -s 0/0 -d 192.168.61.0/24 31137 -l -j DENY
IPCHAINS -A input -i eth0 -p udp -s 0/0 -d 192.168.1.0/24 31137 -l -j DENY

# Protection pour les attaques NetBUS :

IPCHAINS -A input -i eth0 -p tcp -s 0/0 -d 192.168.1.0/24 12345:12346 -l -j DENY
IPCHAINS -A input -i eth0 -p udp -s 0/0 -d 192.168.1.0/24 12345:12346 -l -j DENY

Fin du script