Script de configuration d’un firewall netfilter avec iptables sur une passerelle sous GNU/Linux

Le but de ce script est de configurer un firewall sur une passerelle avec 3 interfaces réseau à savoir une vers le WAN (Internet par exemple) non sécurisé, une vers des machines Wifi, très peu sécurisé étant donné la facilité pour cracker une clé WEP ou même une passphrase WPA-PSK, et enfin un LAN qui lui sera considéré comme sûr.

Vous pouvez placer ce script sous le nom firewall.sh dans le répertoire /sbin/ avec le propriétaire/groupe root.root et les droits 700.
Ce script pourra être lancé avec trois paramètres différents :
-no permet de désactiver le firewall (supprime les règles et permet tout par défaut) #/sbin/firewall.sh -no
-o permet de l’activer avec des options de sécurité minimales, c’est-à-dire que tout peut sortir du firewall qui est considéré comme sûr. Cette option est utile pour lancer des pings de la passerelle par exemple mais est déconseillée en production. #/sbin/firewall.sh -o
-a permet de l’activer avec les options de sécurité maximales (les politiques par défaut sont DENY, tout est interdit par défaut, on décide ensuite ce qui est autorisé) #/sbin/firewall.sh -a
La configuration des adresses ip, des interfaces réseau ainsi de des ports est effectuée en début de script (#parametres). A vous de les modifier suivant votre configuration. Vous remarquerez qu’il n’y a pas d’adresse IP pour l’interface WAN, ce qui permet un fonctionnement par DHCP au niveau de l’interface externe (obtention dynamique d’une adresse IP par le routeur).
Un certain nombre de services sont installés sur la passerelle (serveur web (apache), ntp (ntpd), DNS (bind), fichiers (samba), ssh (openssh), ftp (proftpd)) et il faut donc laisser l’accès à ces services depuis toutes les interfaces ou parfois depuis le LAN uniquement.
D’une manière générale, le LAN étant considéré comme sûr, il a accès au firewall (tous les services de la passerelle) et à tous les réseaux. Le WAN a accès uniquement à certains services de la passerelle (web, ftp etc.) et le Wifi a accès à ces mêmes services ainsi qu’au WAN.
Les logiciels qui nécessitent un comportement de type « serveur » comme les clients de visioconférence ou encore de P2P ont également été pris en compte. On fait alors du forward de ports et d’ip vers des machines du LAN.
Enfin, j’ai volontairement laissé des lignes obsolètes en commentaire, ce qui pourra vous donner des idées de configuration.
Ce script est à modifier selon vos besoins, son intérêt est plus didactique qu’autre chose. Vous l’utiliserez d’ailleurs à vos risques et périls, je ne garantis rien. Si vous repérez des maladresses ou des erreurs, merci de me le faire savoir (anthony(AT)nonsenz.org avec un sujet clair, pour ne pas aller avec le spam).

#!/bin/bash
#firewall.sh
#Passerelle
#par NonSenZ – pollux.nonsenz.org
#Usage :
# -no pour desactiver le firewall (sur lan protege par ex.)
# -o permet a toutes les requetes de sortir
# (ne protege pas contre les chevaux de Troie)
# -a protection maxi

#Parametres
FTP_PORTS= »20:21″
HIGH_PORTS= »1024:65535″
IP_SERVER_LAN= »192.168.0.5″
IP_SERVER_WIFI= »192.168.1.5″
IP_LAN= »192.168.0.0/24″
IP_LAN_BROADCAST= »192.168.0.255″
IP_WIFI= »192.168.1.0/24″
IP_WIFI_BROADCAST= »192.168.1.255″
INET_DEV= »eth0″
LAN_DEV= »eth1″
WIFI_DEV= »eth2″
IP_BITT= »192.168.0.2″ #hote interne bittorrent
IP_MULE= »192.168.0.2″ #hote interne e-mule
GM_IP_IN= »192.168.0.1″ #hote gnomemeeting interne
TCP_PORT_RANGE=30000:30010 #H245 si pas de tunnel
RTP_PORT_RANGE=5000:5016 #RTP connexions (2 audio, 2 video – RTP et RTCP)
TCP_LISTENING_PORT=1720 #H323
#GK_PORT_RANGE=5020:5023 #dans le cas d’une Gatekeeper

#Suivant les options – flush et politique par defaut
case $1 in
-no)
#Vide les regles
iptables -t filter -F
iptables -t filter -X
iptables -t nat -F
iptables -t nat -X
#Politique par defaut
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
echo « Firewall desactive »
exit 1
;;
-o)
#Vide les regles
iptables -t filter -F
iptables -t filter -X
iptables -t nat -F
iptables -t nat -X
#Politique par defaut
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
echo « Configuration protection mini »
;;
-a)
#Vide les regles
iptables -t filter -F
iptables -t filter -X
iptables -t nat -F
iptables -t nat -X
#Politique par defaut
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
echo « Configuration protection maxi »
;;
*)
echo « Argument manquant ! »
echo « Les options autoris\uffffes sont: »
echo « -a pour une protection optimale »
echo « -o autorise les output »
echo « -no desactive le firewall »
echo « $0 : ECHEC »
exit 1
;;
esac

#Modules necessaires
modprobe ip_tables
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ip_nat_irc

#Tout ce qui a ete initialise peut sortir
iptables -A OUTPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
#Tout ce qui a ete initialise peut entrer
iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT

#On filtre donc maintenant sur les ouvertures de connexions (state NEW)

 

#autorise les requetes locales
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

############
# LAN -> firewall
############

#autorise les requetes du LAN
iptables -A INPUT -s $IP_LAN -d $IP_SERVER_LAN -j ACCEPT
iptables -A OUTPUT -s $IP_SERVER_LAN -d $IP_LAN -j ACCEPT
##autorise les diffusions pour les requetes dhcp
iptables -A INPUT -s 0.0.0.0/32 -d 255.255.255.255/32 -j ACCEPT
##autorise les diffusions pour samba et cups
iptables -A INPUT -s $IP_LAN -d $IP_LAN_BROADCAST -j ACCEPT
iptables -A OUTPUT -s $IP_SERVER_LAN -d $IP_LAN_BROADCAST -j ACCEPT
##autorise les requetes sur le port 123 pour ntp (heure et date)
iptables -A OUTPUT -p tcp –dport 123 -j ACCEPT
iptables -A OUTPUT -p udp –dport 123 -j ACCEPT

 

#############
# ? -> firewall
#############
#repond aux pings
iptables -A INPUT -p icmp –icmp-type destination-unreachable -j ACCEPT
iptables -A INPUT -p icmp –icmp-type time-exceeded -j ACCEPT
iptables -A INPUT -p icmp –icmp-type echo-request -j ACCEPT
iptables -A INPUT -p icmp –icmp-type echo-reply -j ACCEPT
#Services locaux
iptables -A INPUT -p tcp –dport ssh -j ACCEPT
iptables -A INPUT -p tcp –dport http -j ACCEPT
iptables -A INPUT -p tcp –dport https -j ACCEPT
iptables -A INPUT -p tcp -s $IP_LAN –dport 10000 -j ACCEPT
##FTP
#Autorise la connexion FTP
iptables -A INPUT -p tcp –dport $FTP_PORTS -j ACCEPT
#FTP actif
iptables -A OUTPUT -p tcp –sport $FTP_PORTS -j ACCEPT
#FTP passif
iptables -A INPUT -p tcp –sport $HIGH_PORTS –dport $HIGH_PORTS -m state –state ESTABLISHED,RELATED -j ACCEPTiptables -A OUTPUT -p tcp –sport $HIGH_PORTS –dport $HIGH_PORTS -m state –state ESTABLISHED,RELATED -j ACCEPT
##samba #inutile si tout est accepte sur le LAN
#iptables -A INPUT -p udp -s $IP_LAN -d $IP_SERVER_LAN -m multiport –dports 137,138 -j ACCEPT
#iptables -A INPUT -p tcp -s $IP_LAN -d $IP_SERVER_LAN -m multiport –dports 139,445 -j ACCEPT
#iptables -A INPUT -p udp -s $IP_LAN -d $IP_LAN_BROADCAST –dport 137 -j ACCEPT
##DNS #inutile si tout est accepte sur le LAN
#iptables -A INPUT -s $IP_LAN -d $IP_SERVER_LAN -p tcp –dport 53 -j ACCEPT
#iptables -A INPUT -s $IP_LAN -d $IP_SERVER_LAN -p udp –dport 53 -j ACCEPT
#utile si un resolver (DNS) est installe sur la passerelle
iptables -A OUTPUT -p tcp –dport 53 -j ACCEPT
iptables -A OUTPUT -p udp –dport 53 -j ACCEPT

 

#FORWARD – Fait suivre certaines requetes vers des clients
##bittorrent
iptables -A FORWARD -p TCP –dport 6881 -j ACCEPT
iptables -A PREROUTING -t nat -p tcp –dport 6881 -j DNAT –to-destination $IP_BITT:6881
##emule
iptables -A FORWARD -p TCP –dport 4662 -j ACCEPT
iptables -A PREROUTING -t nat -p tcp –dport 4662 -j DNAT –to-destination $IP_MULE:4662
##Gnomemeeting
iptables -A PREROUTING -t nat -i $INET_DEV -p tcp –dport $TCP_PORT_RANGE -j DNAT –to-dest $GM_IP_IN
iptables -A PREROUTING -t nat -i $INET_DEV -p udp –dport $RTP_PORT_RANGE -j DNAT –to-dest $GM_IP_IN
iptables -A PREROUTING -t nat -i $INET_DEV -p tcp –dport $TCP_LISTENING_PORT -j DNAT –to-dest $GM_IP_IN
iptables -A FORWARD -p tcp -i $INET_DEV –dport $TCP_PORT_RANGE -d $GM_IP_IN -j ACCEPT
iptables -A FORWARD -p udp -i $INET_DEV –dport $RTP_PORT_RANGE -d $GM_IP_IN -j ACCEPT
iptables -A FORWARD -p tcp -i $INET_DEV –dport $TCP_LISTENING_PORT -d $GM_IP_IN -j ACCEPT
###Gnomemeeting Gatekeeper
#iptables -t nat -I PREROUTING -i $OUT_DEV -p udp –dport $GK_PORT_RANGE -j DNAT –to-dest $IN_HOST
#iptables -I FORWARD -p udp -i $OUT_DEV –dport $GK_PORT_RANGE -d $IN_HOST -j ACCEPT
#iptables -I POSTROUTING -t nat -o $IN_DEV -d $IN_HOST -p udp –dport $GK_PORT_RANGE -j ACCEPT

#############
# LAN -> INET
#############
iptables -A FORWARD -i $LAN_DEV -o $INET_DEV -m state –state ! INVALID -j ACCEPT
iptables -A FORWARD -i $INET_DEV -o $LAN_DEV -m state –state ESTABLISHED,RELATED -j ACCEPT

##############
# WIFI -> INET
##############
iptables -A FORWARD -i $WIFI_DEV -o $INET_DEV -m state –state ! INVALID -j ACCEPT
iptables -A FORWARD -i $INET_DEV -o $WIFI_DEV -m state –state ESTABLISHED,RELATED -j ACCEPT

##############
# LAN -> WIFI
##############
iptables -A FORWARD -i $LAN_DEV -o $WIFI_DEV -m state –state ! INVALID -j ACCEPT
iptables -A FORWARD -i $WIFI_DEV -o $LAN_DEV -m state –state ESTABLISHED,RELATED -j ACCEPT

 

#Diverses protections et logs
iptables -A FORWARD -m state –state INVALID -m limit –limit 3/s -j LOG –log-prefix « INVALID FORWARD:  »
iptables -A FORWARD -m state –state INVALID -j DROP
iptables -A FORWARD -p TCP –tcp-flags ! ALL SYN -m state –state NEW -m limit –limit 3/s -j LOG –log-prefix « FORWARD TCP sans SYN:  »
iptables -A FORWARD -p TCP –tcp-flags ! ALL SYN -m state –state NEW -j DROP
iptables -A FORWARD -j LOG -m limit –limit 3/s –log-prefix « BAD FORWARD  »
iptables -A FORWARD -j DROP

#NAT-Tout ce qui sort est nate avec l’adresse publique de l’interface INET
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o $INET_DEV -j MASQUERADE

#empeche l’IP spoofing
echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter

#bloque et logue le reste
iptables -N denylog
iptables -A denylog -m limit –limit 40/minute -j LOG –log-prefix « IPTABLES  »
iptables -A denylog -j DROP
iptables -A INPUT -j denylog
#Save
iptables-save >/etc/iptables-perso.conf
echo  » DONE. »

N.B. Reste à lancer le script automatiquement au démarrage et hop, roule ma poule.
TODO : VPN entre un client en wifi et le LAN

Laisser un commentaire