http://www.kultur-frankreich.de/wiki/doku.php?id=serveur_dedie:iptables

Firewall IpTables

Exemple de configuration d'iptables :

Créer le dossier /etc/firewall dans lequel on placera un fichier initiptables.sh servant à la configuration du firewall, et un fichier flush_iptables.sh, servant à vider les règles (flush). Exemple de fichier init_iptables.sh (commenter les règles inutiles) : <code bash> !/bin/bash # IP réservées RESERVED_NET=“0.0.0.0/8 1.0.0.0/8 2.0.0.0/8 3.0.0.0/8 4.0.0.0/8 5.0.0.0/8 7.0.0.0/8 10.0.0.0/8 14.0.0.0/8 23.0.0.0/8 27.0.0.0/8 31.0.0.0/8 36.0.0.0/8 37.0.0.0/8 39.0.0.0/8 41.0.0.0/8 42.0.0.0/8 58.0.0.0/8 59.0.0.0/8 60.0.0.0/8 70.0.0.0/8 71.0.0.0/8 72.0.0.0/8 73.0.0.0/8 74.0.0.0/8 75.0.0.0/8 76.0.0.0/8 77.0.0.0/8 78.0.0.0/8 79.0.0.0/8 83.0.0.0/8 84.0.0.0/8 85.0.0.0/8 86.0.0.0/8 87.0.0.0/8 88.0.0.0/8 89.0.0.0/8 90.0.0.0/8 91.0.0.0/8 92.0.0.0/8 93.0.0.0/8 94.0.0.0/8 95.0.0.0/8 96.0.0.0/8 97.0.0.0/8 98.0.0.0/8 99.0.0.0/8 100.0.0.0/8 101.0.0.0/8 102.0.0.0/8 103.0.0.0/8 104.0.0.0/8 105.0.0.0/8 106.0.0.0/8 107.0.0.0/8 108.0.0.0/8 109.0.0.0/8 110.0.0.0/8 111.0.0.0/8 112.0.0.0/8 113.0.0.0/8 114.0.0.0/8 115.0.0.0/8 116.0.0.0/8 117.0.0.0/8 118.0.0.0/8 119.0.0.0/8 120.0.0.0/8 121.0.0.0/8 122.0.0.0/8 123.0.0.0/8 124.0.0.0/8 125.0.0.0/8 126.0.0.0/8 197.0.0.0/8 222.0.0.0/8 223.0.0.0/8 224.0.0.0/8 225.0.0.0/8 226.0.0.0/8 227.0.0.0/8 228.0.0.0/8 229.0.0.0/8 230.0.0.0/8 231.0.0.0/8 232.0.0.0/8 233.0.0.0/8 234.0.0.0/8 235.0.0.0/8 236.0.0.0/8 237.0.0.0/8 238.0.0.0/8 239.0.0.0/8 240.0.0.0/8 241.0.0.0/8 242.0.0.0/8 243.0.0.0/8 244.0.0.0/8 245.0.0.0/8 246.0.0.0/8 247.0.0.0/8 248.0.0.0/8 249.0.0.0/8 250.0.0.0/8 251.0.0.0/8 252.0.0.0/8 253.0.0.0/8 254.0.0.0/8 255.0.0.0/8 169.254.0.0/16 172.16.0.0/12 173.0.0.0/8 174.0.0.0/8 175.0.0.0/8 176.0.0.0/8 177.0.0.0/8 178.0.0.0/8 179.0.0.0/8 180.0.0.0/8 181.0.0.0/8 182.0.0.0/8 183.0.0.0/8 184.0.0.0/8 185.0.0.0/8 186.0.0.0/8 187.0.0.0/8 189.0.0.0/8 190.0.0.0/8” echo “Paramétrage des règles du firewall…” ###### Initialisation ###### # Ignore les ping envoyés par broadcasts ou multicasts echo 1 > /proc/sys/net/ipv4/icmpechoignore_broadcasts # Interdit toute connexion entrante ou sortante iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT DROP echo “- Interdire toute connexion entrante ou sortante : [OK]” # Vide toutes les règles et tables iptables -F iptables -X iptables -Z iptables -t nat -F iptables -t nat -Z iptables -t nat -X iptables -t mangle -Z iptables -t mangle -F iptables -t mangle -X echo “- Vider toutes les règles et tables : [OK]” # Création de nouvelles chaines pour loguer et droper iptables -N LOGDROPINPUT iptables -A LOGDROPINPUT -j LOG –log-prefix '[IPTABLES DROP INPUT] : ' iptables -A LOGDROPINPUT -j DROP iptables -N LOGDROPFORWARD iptables -A LOGDROPFORWARD -j LOG –log-prefix '[IPTABLES DROP FORWARD] : ' iptables -A LOGDROPFORWARD -j DROP iptables -N LOGDROPOUTPUT iptables -A LOGDROPOUTPUT -j LOG –log-prefix '[IPTABLES DROP OUTPUT] : ' iptables -A LOGDROPOUTPUT -j DROP # Rejette les fausses connexions prétendues s'initialiser et sans bit SYN iptables -A INPUT -p tcp ! –syn -m state –state NEW,INVALID -j REJECT echo “- Rejeter les connexions sans bit SYN : [OK]” # Ne casse pas les connexions établies iptables -A INPUT -m state –state RELATED,ESTABLISHED -j ACCEPT iptables -A OUTPUT -m state –state RELATED,ESTABLISHED -j ACCEPT echo “- Ne pas casser les connexions établies : [OK]” ##### Règles d'autorisation ###### # Autorise loopback iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT echo “- Autoriser loopback : [OK]” # SSH iptables -A INPUT -p tcp –dport 22 -m limit –limit 5/hour -j ACCEPT echo “- Autoriser 5 connexions/heure SSH entrant port 22 : [OK]” iptables -A INPUT -p tcp –dport 32 -j ACCEPT echo “- Autoriser SSH entrant : [OK]” # Ping iptables -A INPUT -p icmp –icmp-type echo-request -j ACCEPT iptables -A OUTPUT -p icmp –icmp-type echo-request -j ACCEPT echo “- Autoriser PING entrant/sortant : [OK]” # NTP iptables -A OUTPUT -p udp –dport 123 -j ACCEPT echo “- Autoriser NTP sortant : [OK]” # DNS iptables -A OUTPUT -p tcp –dport 53 -j ACCEPT iptables -A OUTPUT -p udp –dport 53 -j ACCEPT iptables -A INPUT -p tcp –dport 53 -j ACCEPT iptables -A INPUT -p udp –dport 53 -j ACCEPT echo “- Autoriser DNS entrant/sortant : [OK]” # HTTP iptables -A OUTPUT -p tcp –dport 80 -j ACCEPT iptables -A INPUT -p tcp –dport 80 -j ACCEPT echo “- Autoriser HTTP entrant/sortant : [OK]” # HTTPS iptables -A INPUT -p tcp –dport 443 -j ACCEPT iptables -A INPUT -p tcp –dport 8443 -j ACCEPT echo “- Autoriser HTTPS entrant : [OK]” # FTP modprobe ipconntrackftp iptables -A OUTPUT -p tcp –dport 21 -j ACCEPT iptables -A INPUT -p tcp –dport 20 -j ACCEPT iptables -A INPUT -p tcp –dport 21 -j ACCEPT iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT echo “- Autoriser FTP entrant/sortant : [OK]” # Mail iptables -A INPUT -p tcp –dport 25 -j ACCEPT iptables -A INPUT -p tcp –dport 110 -j ACCEPT iptables -A INPUT -p tcp –dport 143 -j ACCEPT iptables -A OUTPUT -p tcp –dport 25 -j ACCEPT iptables -A OUTPUT -p tcp –dport 110 -j ACCEPT iptables -A OUTPUT -p tcp –dport 143 -j ACCEPT echo “- Autoriser SMTP/POP/IMAP entrant/sortant : [OK]” # Webmin iptables -A INPUT -p tcp –dport 10000 -j ACCEPT echo “- Autoriser Webmin entrant : [OK]” # Munin si le grapheur est en local et monitore des serveurs externes iptables -A OUTPUT -p tcp –dport 4949 -j ACCEPT echo “- Autoriser Munin sortant : [OK]” # Munin si noeud monitoré par un serveur externe (-s xxx.xxx.xxx.xxx est optionnel et permet de limiter l'accès au serveur qui effectue le monitoring) iptables -A INPUT -p tcp –dport 4949 -s xxx.xxx.xxx.xxx -j ACCEPT iptables -A OUTPUT -p tcp –dport 4949 -j ACCEPT echo “- Autoriser Munin entrant/sortant : [OK]”
# RTM (monitoring OVH) iptables -A OUTPUT -p udp –dport 6100:6200 -j ACCEPT echo “- Autoriser RTM (monitoring OVH) sortant : [OK]” # Proxy Squid iptables -A INPUT -p tcp –dport 3128 -j ACCEPT echo “- Autoriser le proxy entrant : [OK]” ##### Règles de rejet ###### # IP réservées (LOURD) for net in $RESERVEDNET; do iptables -A INPUT -i eth0 -s $net -j LOGDROP iptables -A FORWARD -i eth0 -s $net -j LOG_DROP done echo “- Intertire les IP réservées : [OK]” ##### Log et rejet ###### # Toutes les connexions qui n'ont pas passé les règles du firewall seront refusées et loguées iptables -A FORWARD -j LOGDROPFORWARD iptables -A INPUT -j LOGDROPINPUT iptables -A OUTPUT -j LOGDROPOUTPUT echo “Terminé.” </code> Fichier flush_iptables.sh : <code bash> !/bin/bash echo -n “Réinitialisation des règles du firewall…” # Remet la police par défaut à ACCEPT iptables -P INPUT ACCEPT iptables -P FORWARD ACCEPT iptables -P OUTPUT ACCEPT # Remet les polices par défaut pour la table NAT iptables -t nat -P PREROUTING ACCEPT iptables -t nat -P POSTROUTING ACCEPT iptables -t nat -P OUTPUT ACCEPT # Vide (flush) toutes les règles existantes iptables -F iptables -t nat -F iptables -t mangle -Z # Efface toutes les chaînes qui ne sont pas à défaut dans la table filter et nat iptables -X iptables -t nat -X iptables -t mangle -X echo “ [OK]” </code> Créer le fichier de chargement du firewall /etc/init.d/firewall : <code bash> !/bin/bash # Lancement du script de Firewall # Fonction pour le lancement du firewall start() { echo “Application des règles IpTables : ” /etc/firewall/init_iptables.sh } # Fonction pour arrêter le firewall (on flush) stop() { echo “Flush des règles IpTables : ” /etc/firewall/flush_iptables.sh } case $1 in start) start ;; stop) stop ;; restart) stop start ;; status) /sbin/iptables -L /sbin/iptables -t nat -L ;; *) echo “Usage: /etc/init.d/firewall {start|stop|restart|status}.” esac exit </code> Rendre ces 3 fichiers exécutable : <code bash> chmod +x /etc/firewall/initiptables.sh chmod +x /etc/firewall/flushiptables.sh chmod +x /etc/init.d/firewall </code> Ajouter ce script au démarrage : <code bash> update-rc.d firewall defaults </code> ===== Vérifier la configuration ===== Pour tester, on peut utiliser nmap depuis une machine distante (sous linux comme sous windows). Sous Debian : Installer nmap : <code bash> apt-get update apt-get install nmap </code> Tester : <code bash> nmap -vv xxx.xxx.xxx.xxx </code> Les logs sont placés dans le fichier /var/log/messages. ===== Ressources ===== * Tutoriel Dedibox : http://assistance.dedibox.fr/documentation/doku.php?id=admin:iptables * Tutoriel Iptables : http://iptables-tutorial.frozentux.net/fr/book1.html * How To Iptables : http://www.netfilter.org/documentation/HOWTO/packet-filtering-HOWTO.html * Documentation Multilingue de Netfilter et Iptables : http://www.netfilter.org/documentation/ * Bible française pour apprendre les bases de la sécurité sous Linux : http://olivieraj.free.fr/fr/linux/information/firewall/ * Rusty's Remarkably Unreliable Guides : http://people.netfilter.org/~rusty/unreliable-guides/ * Tutorial Labo-Linux de l'école Supinfo : http://www.labo-linux.org/index.php?page=essentiels&id=478 * Tutorial sur Lea linux : http://www.lea-linux.org/cached/index/Reseau-secu-iptables.html