#!/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 #Pour debian: echo 1 > /proc/sys/net/ipv4/ip_forward ############################################################################## # Constantes IPT=/sbin/iptables IPT="/sbin/iptables" IPTS="/sbin/iptables-save" IPTR="/sbin/iptables-restore" # Interface qui est sur Internet (WAN) WAN_IFACE="eth0" # Interface Wireless WLAN_IFACE="wlan0" # Interface qui est dans votre réseau local (LAN) LAN_IFACE="eth1" # Adresse de votre passerelle (Firewall) LAN_IP="192.168.0.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