informatique:linux:netfilter
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revisionNext revisionBoth sides next revision | ||
informatique:linux:netfilter [2009/06/08 20:15] – édition externe 127.0.0.1 | informatique:linux:netfilter [2017/05/04 08:27] – [cstate] pteu | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | {{tag> | ||
- | ======Netfilter====== | + | ======Netfilter |
Netfilter est le firewall intégré au noyau Linux. Il s' | Netfilter est le firewall intégré au noyau Linux. Il s' | ||
Line 8: | Line 7: | ||
=====Principe===== | =====Principe===== | ||
- | {{http://upload.wikimedia.org/ | + | {{ :informatique: |
+ | |||
+ | |||
+ | =====Les tables===== | ||
+ | |||
+ | * FILTER : contient les règles de filtrage | ||
+ | * NAT : contient les règles de translation d' | ||
+ | * MANGLE | ||
+ | * RAW | ||
+ | |||
+ | |||
+ | =====Les chaînes (points d' | ||
+ | |||
+ | * INPUT : paquets à destination de la machine | ||
+ | * OUTPUT : paquets envoyés par la machine | ||
+ | * FORWARD : paquets routés vers d' | ||
+ | * PREROUTING : paquets avant la décision de routage | ||
+ | * POSTROUTING : paquets juste avant de sortir sur la carte réseau | ||
Line 14: | Line 30: | ||
* Standarts | * Standarts | ||
+ | <code bash> | ||
+ | Option : Description : | ||
+ | -A Append (ajoute) | ||
+ | -D Delete (efface) | ||
+ | -I Insert (insère) | ||
+ | -R Replace (remplace) | ||
+ | -L List (liste) | ||
+ | -F Efface toutes les règles dans la ou les chaînes | ||
+ | -Z Remet les compteurs à zéro dans une ou plusieurs chaînes | ||
+ | -C Teste ce paquet sur une chaîne | ||
+ | -N Crée une chaîne définie par l' | ||
+ | -X Efface une chaîne définie par l' | ||
+ | -P Change le comportement d'une chaîne sur une cible | ||
+ | -E Change le nom d'une chaîne | ||
+ | -p Protocole (tcp, udp, ...) | ||
+ | -s Adresse/ | ||
+ | -d Adresse/ | ||
+ | -i Interface réseau d' | ||
+ | -o Interface réseau de sortie (nom ethernet) | ||
+ | -j Jump - Saute (cible de règle) | ||
+ | -m Correspondance étendue (peut utiliser des extensions) | ||
+ | -n Sortie numérique de ports et d' | ||
+ | -t Table à manipuler | ||
+ | -v Mode bavard | ||
+ | -x Vérifications étendues (affiche les valeurs exactes) | ||
+ | -f Prends uniquement en compte le second fragment ou ceux d' | ||
+ | -V Version du paquet | ||
+ | --line-numbers Affiche les numéros de ligne | ||
+ | </ | ||
- | Option : Description : | + | '' |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | -F Efface toutes les règles dans la ou les chaînes | + | |
- | -Z Remet les compteurs à zéro dans une ou plusieurs chaînes | + | |
- | -C Teste ce paquet | + | |
- | -N Crée une chaîne définie | + | |
- | -X Efface une chaîne définie par l'utilisateur | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | -d Adresse/ | + | |
- | -i Interface réseau d'entrée (nom ethernet) | + | |
- | -o Interface réseau de sortie (nom ethernet) | + | |
- | -j Jump - Saute (cible de règle) | + | |
- | -m Correspondance étendue (peut utiliser des extensions) | + | |
- | -n Sortie numérique de ports et d'adresses | + | |
- | -t Table à manipuler | + | |
- | -v Mode bavard | + | |
- | -x Vérifications étendues (affiche les valeurs exactes) | + | |
- | -f Prends uniquement | + | |
- | -V Version du paquet | + | |
- | --line-numbers Affiche les numéros de ligne | + | |
- | * Liées aux modules | + | Il est conseillé de faire du DROP sur la patte publique et du REJECT coté LAN utilisateurs pour les prévenir du filtrage. |
- | | + | '' |
- | --dport port destination | + | |
- | --icmp-type identifie un paquet ICMP (echo-reply echo-request) | + | |
+ | * Liées aux modules | ||
+ | <code bash> | ||
+ | --sport port source | ||
+ | --dport port destination | ||
+ | --icmp-type identifie un paquet ICMP (echo-reply echo-request) | ||
+ | </ | ||
=====Les extensions===== | =====Les extensions===== | ||
+ | <code bash> | ||
Module | Module | ||
mac Vérifie que l' | mac Vérifie que l' | ||
Line 59: | Line 87: | ||
owner Essaie de trouver des correspondances dans le créateur du paquet --uid-owner userid --gid-owner groupid --pid-owner processid --sid-owner sessionid | owner Essaie de trouver des correspondances dans le créateur du paquet --uid-owner userid --gid-owner groupid --pid-owner processid --sid-owner sessionid | ||
unclean Plusieurs tests de vérification aléatoires du bon état des paquets | unclean Plusieurs tests de vérification aléatoires du bon état des paquets | ||
+ | </ | ||
+ | ====cstate / conntrack==== | ||
- | =====Redirection===== | + | * Remplace l' |
+ | * On peut voir l' | ||
+ | * il existe un outil en CLI qui permet de manipuler les tables de session : **conntrack** | ||
+ | <code bash> | ||
+ | # afficher les connexions SSH ouvertes | ||
+ | conntrack -L -p tcp --dport 22 | ||
- | Exemple | + | # lister les événements |
+ | conntrack -E | ||
- | iptables | + | # supprimer une session ouverte : |
- | iptables | + | conntrack |
+ | </ | ||
+ | | ||
+ | |||
+ | |||
+ | |||
+ | =====Redirection (SNAT, MASQUERADE, DNAT)===== | ||
+ | |||
+ | Le *NAT est un mécanisme qui permet de modifier à la volée les adresses et/ou numéros de ports sur un routeur, qui conservera l' | ||
+ | |||
+ | Pour les exemples qui suivent, voici un réseau privé (LAN) connecté à internet par une passerelle (ROUTEUR) : | ||
+ | <code bash> | ||
+ | ( INTERNET )----(eth0 | ||
+ | \_1.2.3.4 | ||
+ | \____serveur1 192.168.0.1 /24 | ||
+ | \____serveur2 192.168.0.2 /24 | ||
+ | \____PCs clients 192.168.0.*/ | ||
+ | </ | ||
+ | |||
+ | **SNAT** : mis en place dans la chaine POSTROUTING, | ||
+ | |||
+ | Cela va être utile dans notre exemple pour permettre à tous les équipements d' | ||
+ | <code bash> | ||
+ | iptables -t NAT -A POSTROUTING -j SNAT --to-source 1.2.3.4 | ||
+ | </ | ||
+ | |||
+ | **MASQUERADE** : permet à iptables d' | ||
+ | |||
+ | <code bash> | ||
+ | iptables -t NAT -A POSTROUTING -o eth0 -j MASQUERADE | ||
+ | </ | ||
+ | |||
+ | **DNAT** : permet de modifier les IPs destinations, | ||
+ | |||
+ | Exemple de DNAT avec répartition de charge sur nos 2 serveurs : | ||
+ | <code bash> | ||
+ | iptables -t nat -A PREROUTING -p tcp -dport 80 -j DNAT --to-dest 192.168.0.1 --to-dest 192.168.0.2 | ||
+ | </ | ||
+ | |||
+ | Exemple de redirection du trafic HTTP et HTTPS vers un serveur mandataire (port 3128) : | ||
+ | <code bash> | ||
+ | iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-dest proxyhost: | ||
+ | iptables -t nat -A PREROUTING -p tcp --dport 443 -j DNAT --to-dest proxyhost: | ||
+ | </ | ||
=====Exemples===== | =====Exemples===== | ||
Line 86: | Line 165: | ||
iptables -I INPUT 1 -p tcp --dport 1165 -j ACCEPT | iptables -I INPUT 1 -p tcp --dport 1165 -j ACCEPT | ||
+ | |||
+ | * supprimer la règle précédente qui est en position #1 : 2 possibilités | ||
+ | |||
+ | iptables -D INPUT 1 | ||
+ | iptables -D INPUT -p tcp --dport 1165 | ||
On accepte les paquets tcp à destination du port 1165 | On accepte les paquets tcp à destination du port 1165 | ||
Line 94: | Line 178: | ||
On peut utiliser l' | On peut utiliser l' | ||
+ | |||
+ | * effacer toutes les règles iptables | ||
+ | |||
+ | iptables -F | ||
+ | iptables -X | ||
+ | |||
+ | * modifier la politique par défaut d'une chaine (seuls ACCEPT et DROP sont des politiques valides) ; par ex : passer INPUT à DROP | ||
+ | |||
+ | iptables -P INPUT -j DROP | ||
+ | |||
+ | * Créer une chaine personnalisée : permet de limiter les matches et simplifier les règles | ||
+ | <code bash> | ||
+ | #création de la règle | ||
+ | iptables -N RH253 | ||
+ | iptables -t RH253 -p tcp -dport 80 | ||
+ | #" | ||
+ | iptables -A INPUT -s 192.168.0.0/ | ||
+ | </ | ||
+ | |||
+ | * les règles iptables sont chargées en mémoire, donc perdues lors d'un reboot ; pour sauvegarder les règles : | ||
+ | <code bash> | ||
+ | # sous Redhat | ||
+ | service iptables save | ||
+ | # sous d' | ||
+ | iptables-save | ||
+ | </ | ||
+ | |||
+ | |||
+ | =====Exemple de script===== | ||
+ | |||
+ | <code bash> | ||
+ | #!/bin/bash | ||
+ | # | ||
+ | # Script iptables - tyr | ||
+ | # Author: pt3u | ||
+ | # 30/10/2008 Complément de flux pour le DHCP | ||
+ | # 17/09/2008 Personnalisation pour application sur tyr | ||
+ | # 22/02/2008 Création d' | ||
+ | # | ||
+ | |||
+ | |||
+ | # | ||
+ | # Variables | ||
+ | # | ||
+ | IPTABLES="/ | ||
+ | INET_IFACE=" | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | INET_BROADCAST=" | ||
+ | INET_ADDR=" | ||
+ | LAN=" | ||
+ | ROUTER=" | ||
+ | VPN=" | ||
+ | |||
+ | start () { | ||
+ | |||
+ | echo "### DEBUT chargement Netfilter.." | ||
+ | echo " | ||
+ | INET_ADDR=$INET_ADDR INET_BROADCAST=$INET_BROADCAST \ | ||
+ | LAN=$LAN ROUTER=$ROUTER VPN=$VPN" | ||
+ | |||
+ | |||
+ | # | ||
+ | # Parametrage du noyau | ||
+ | # | ||
+ | |||
+ | echo " Parametrage du noyau.." | ||
+ | # désactivation du forwarding (routage) | ||
+ | echo " | ||
+ | |||
+ | # protection anti-spoofing du kernel | ||
+ | echo " | ||
+ | |||
+ | # refuse les ping | ||
+ | #echo " | ||
+ | |||
+ | # refuse les ICMP broadcastés | ||
+ | echo " | ||
+ | |||
+ | # protection contre les messages d' | ||
+ | echo " | ||
+ | |||
+ | # rejet des redirections ICMP | ||
+ | echo " | ||
+ | echo " | ||
+ | echo " | ||
+ | |||
+ | # protection contre les synflood (n' | ||
+ | echo " | ||
+ | # nombre max de SYN_WAIT | ||
+ | echo " | ||
+ | |||
+ | # regles permettant de limiter les DoS (defaut: 60, | ||
+ | echo " | ||
+ | echo " | ||
+ | echo " | ||
+ | echo " | ||
+ | |||
+ | # rejet des paquets source-routés | ||
+ | echo " | ||
+ | |||
+ | # logger les paquets spoofes (@ source falsifiees ou non routables) | ||
+ | echo " | ||
+ | |||
+ | # modification de la durée max des connexions (12h au lieu de 5j) | ||
+ | #echo 43200 > / | ||
+ | |||
+ | # gestion des IPs dynamiques | ||
+ | #echo " | ||
+ | |||
+ | # | ||
+ | # iptables | ||
+ | # | ||
+ | |||
+ | # on flush la table filter (-t filter par défaut) | ||
+ | echo " Reinitialisation des tables.." | ||
+ | $IPTABLES -F | ||
+ | $IPTABLES -X | ||
+ | |||
+ | # | ||
+ | # Creation des chaines | ||
+ | # | ||
+ | echo " Creation des chaines.." | ||
+ | $IPTABLES -N bad_tcp_packets | ||
+ | $IPTABLES -N udp_packets | ||
+ | $IPTABLES -N icmp_packets | ||
+ | $IPTABLES -N tcp_packets | ||
+ | |||
+ | |||
+ | # | ||
+ | # Remplissage des chaines | ||
+ | # | ||
+ | |||
+ | echo " Remplissage des chaines.." | ||
+ | # bad_tcp_packets (cf iptables how-to et arno's iptables firewall) | ||
+ | #$IPTABLES -A bad_tcp_packets --tcp-flags SYN,ACK SYN,ACK \ | ||
+ | # -m state --state NEW -j REJECT --reject-with tcp-reset | ||
+ | # $IPTABLES -A bad_tcp_packets ! --syn -m state --state NEW \ | ||
+ | # -j LOG --log-level DEBUG --log-prefix "New not syn:" | ||
+ | $IPTABLES -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j DROP | ||
+ | $IPTABLES -A bad_tcp_packets -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP | ||
+ | $IPTABLES -A bad_tcp_packets -p tcp --tcp-flags \ | ||
+ | ALL SYN, | ||
+ | $IPTABLES -A bad_tcp_packets -p tcp --tcp-flags ALL ALL -j DROP | ||
+ | $IPTABLES -A bad_tcp_packets -p tcp --tcp-flags ALL FIN -j DROP | ||
+ | $IPTABLES -A bad_tcp_packets -p tcp --tcp-flags SYN,RST SYN,RST -j DROP | ||
+ | $IPTABLES -A bad_tcp_packets -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP | ||
+ | $IPTABLES -A bad_tcp_packets -p tcp --tcp-flags ALL NONE -j DROP | ||
+ | $IPTABLES -A bad_tcp_packets -p tcp --tcp-option 64 -j DROP | ||
+ | $IPTABLES -A bad_tcp_packets -p tcp --tcp-option 128 -j DROP | ||
+ | |||
+ | #In Microsoft Networks you will be swamped by broadcasts. These lines | ||
+ | #will prevent them from showing up in the logs. | ||
+ | # | ||
+ | #$IPTABLES -A udp_packets -i $INET_IFACE -p tcp -d $INET_BROADCAST \ | ||
+ | # | ||
+ | #$IPTABLES -A udp_packets -i $INET_IFACE -p tcp -d $INET_ADDR \ | ||
+ | # | ||
+ | $IPTABLES -A udp_packets -p udp --sport 53 -j ACCEPT | ||
+ | $IPTABLES -A udp_packets -p udp --dport 53 -j ACCEPT | ||
+ | $IPTABLES -A udp_packets -p udp -s 0.0.0.0 --dport 67 -j ACCEPT | ||
+ | $IPTABLES -A udp_packets -p udp -s $LAN --dport 67 -j ACCEPT | ||
+ | $IPTABLES -A udp_packets -p udp --dport 123 -j ACCEPT | ||
+ | $IPTABLES -A udp_packets -p udp -s $LAN --dport 137:139 -j ACCEPT | ||
+ | #20090929 acces openVPN | ||
+ | $IPTABLES -A udp_packets -p udp -s $VPN --dport 137:139 -j ACCEPT | ||
+ | $IPTABLES -A udp_packets -p udp --sport 161 -j ACCEPT | ||
+ | $IPTABLES -A udp_packets -p udp -s $LAN --dport 161 -j ACCEPT | ||
+ | $IPTABLES -A udp_packets -p udp -s $ROUTER --dport 514 -j ACCEPT | ||
+ | |||
+ | $IPTABLES -A tcp_packets -p tcp -m state --state ESTABLISHED, | ||
+ | $IPTABLES -A tcp_packets -p tcp --dport 21 -j ACCEPT | ||
+ | #1 2009-02-06 redirection de port anyWAN: | ||
+ | #1 $IPTABLES -A tcp_packets -p tcp -s $LAN --dport 22 -j ACCEPT | ||
+ | $IPTABLES -A tcp_packets -p tcp --dport 22 -j ACCEPT | ||
+ | # $IPTABLES -A tcp_packets -p tcp --dport 25 -j ACCEPT | ||
+ | #$IPTABLES -A tcp_packets -p tcp --dport 53 -j ACCEPT | ||
+ | $IPTABLES -A tcp_packets -p tcp --dport 80 -j ACCEPT | ||
+ | $IPTABLES -A tcp_packets -p tcp -s $LAN --dport 137:139 -j ACCEPT | ||
+ | $IPTABLES -A tcp_packets -p tcp --dport 443 -j ACCEPT | ||
+ | $IPTABLES -A tcp_packets -p tcp -s $LAN --dport 445 -j ACCEPT | ||
+ | #20090929 acces openVPN | ||
+ | $IPTABLES -A tcp_packets -p tcp -s $VPN --dport 445 -j ACCEPT | ||
+ | #20101018 test acces swat | ||
+ | #$IPTABLES -A tcp_packets -p tcp -s $LAN --dport 901 -j ACCEPT | ||
+ | #2011.11.16 temp pour MAJ en oneiric | ||
+ | $IPTABLES -A tcp_packets -p tcp --dport 1022 -j ACCEPT | ||
+ | $IPTABLES -A tcp_packets -p tcp --dport 2121 -j ACCEPT | ||
+ | $IPTABLES -A tcp_packets -p tcp -s $LAN --dport 3129 -j ACCEPT | ||
+ | #2010-12-19 axx munin depuis tyr | ||
+ | #2011-03-05 extension a tout le LAN | ||
+ | $IPTABLES -A tcp_packets -p tcp -s $LAN --dport 4949 -j ACCEPT | ||
+ | #20110220 iperf | ||
+ | $IPTABLES -A tcp_packets -p tcp -s $LAN --dport 5001 -j ACCEPT | ||
+ | #1 2009-02-06 redirection de port anyWAN: | ||
+ | #1 $IPTABLES -A tcp_packets -p tcp --dport 10000 -j ACCEPT | ||
+ | $IPTABLES -A tcp_packets -p tcp --dport 50000:50049 -j ACCEPT | ||
+ | |||
+ | # on laisse passer tous les ICMP type 11 (delais depasse) pour pouvoir faire du mtr | ||
+ | # | ||
+ | $IPTABLES -A icmp_packets -p icmp -s 0/0 --icmp-type time-exceeded -j ACCEPT | ||
+ | |||
+ | $IPTABLES -A icmp_packets -p icmp -s 0/0 --icmp-type echo-request \ | ||
+ | -m limit --limit 5/second --limit-burst 10 -j ACCEPT | ||
+ | $IPTABLES -A icmp_packets -p icmp -s 0/0 --icmp-type echo-reply -j ACCEPT | ||
+ | $IPTABLES -A icmp_packets -p icmp -s 0/0 --icmp-type destination-unreachable -j ACCEPT | ||
+ | |||
+ | # | ||
+ | # Chargement des politiques | ||
+ | # | ||
+ | |||
+ | # politiques par defaut (--policy) | ||
+ | echo " Chargement des politiques par defaut.." | ||
+ | $IPTABLES -P INPUT DROP | ||
+ | $IPTABLES -P OUTPUT ACCEPT | ||
+ | $IPTABLES -P FORWARD DROP | ||
+ | |||
+ | echo " Exceptions.." | ||
+ | # réglages permissifs pour la machine d' | ||
+ | #$IPTABLES -A INPUT -s 192.168.2.23 -j ACCEPT | ||
+ | |||
+ | # table INPUT (--append ou --insert < | ||
+ | echo " Table INPUT.." | ||
+ | $IPTABLES -A INPUT -i lo -j ACCEPT | ||
+ | |||
+ | $IPTABLES -A INPUT -p tcp -j bad_tcp_packets | ||
+ | $IPTABLES -A INPUT -p icmp -j icmp_packets | ||
+ | $IPTABLES -A INPUT -p tcp -j tcp_packets | ||
+ | $IPTABLES -A INPUT -p udp -j udp_packets | ||
+ | |||
+ | # Enregistrement des paquets qui n'ont pas encore été traités | ||
+ | # remplacemt du log level de WARINING a 4 (la syntaxe a changer..) | ||
+ | $IPTABLES -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG \ | ||
+ | --log-level 4 --log-prefix " | ||
+ | |||
+ | # table OUTPUT | ||
+ | echo " Table OUTPUT.." | ||
+ | $IPTABLES -A OUTPUT -p tcp -j bad_tcp_packets | ||
+ | |||
+ | # table FORWARD | ||
+ | echo " Table FORWARD.." | ||
+ | |||
+ | |||
+ | echo "### FIN chargement Netfilter" | ||
+ | } | ||
+ | |||
+ | stop () { | ||
+ | |||
+ | echo " | ||
+ | |||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | echo "### Firewall Désactivé" | ||
+ | } | ||
+ | |||
+ | case " | ||
+ | | ||
+ | start | ||
+ | ;; | ||
+ | stop) | ||
+ | stop | ||
+ | ;; | ||
+ | | ||
+ | stop | ||
+ | sleep 1 | ||
+ | start | ||
+ | ;; | ||
+ | *) | ||
+ | echo "Usage : $0 start|stop|restart" | ||
+ | ;; | ||
+ | esac | ||
+ | |||
+ | exit 0 | ||
+ | # end | ||
+ | </ | ||
=====Divers===== | =====Divers===== | ||
- | ====Table de sessions==== | ||
- | Pour récupérer la table des sessions ouvertes | + | ====Classer les logs iptables dans un seul fichier==== |
- | | + | |
+ | Pour centraliser les logs iptables dans un seul et unique fichier de configuration il faut procéder en plusieurs étapes | ||
+ | | ||
+ | <code bash> | ||
+ | iptables -A INPUT -p tcp -j LOG --log-prefix " | ||
+ | </code> | ||
- | ====conntrack==== | + | * récupérer ces logs avec rsyslog, les mettre dans le fichier / |
+ | <code bash> | ||
+ | : | ||
+ | # ne fonctionne pas avec : | ||
+ | #: | ||
+ | # car les msg commencent par " | ||
+ | & ~ # arrêter de traiter les messages qui ont matché la dernière ligne | ||
+ | </ | ||
- | Conntrack est un logiciel qui permet de récupérer et modifier la table de sessions ouvertes depuis l' | + | Sources : |
+ | * [[http:// | ||
+ | * [[http:// | ||
- | Pour supprimer une session : | + | =====Liens===== |
- | conntrack -D -s 82.134.19.16 -d 192.168.2.1 -p tcp --orig-port-src 22 --orig-port-dst 55098 | + | |
+ | * [[http:// |
informatique/linux/netfilter.txt · Last modified: 2021/03/18 13:16 by pteu