====== Iptables et ipset ====== Préférez nftables sur une installation neuve. Je laisse ça ici pour retrouver les infos sur les vieux coucous. Installer apt install ipset iptable netfilter-persistent ipset-persistent iptables-persistent whois python3-systemd *-persistent permet de charger des règles au démarrage, en principe situées dans ''/etc/iptables/''. ===== Règles de base ===== Actuellement mon routeur me coince en ipv4 (''/etc/iptables/rules.v4'') donc mes règles ne concernent que ça, il faudra adapter pour ipv6. Son contenu actuel : # source https://antoinelounis.com/informatique/securite/configuration-fail2ban-iptables-debian-raspberry/ *filter :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [0:0] # Allow internal traffic on the loopback device -A INPUT -i lo -j ACCEPT # Continue connections that are already established or related to an established connection -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT # Drop non-conforming packets, such as malformed headers, etc. -A INPUT -m conntrack --ctstate INVALID -j DROP # SSH -A INPUT -p tcp --dport 226 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT # HTTP + HTTPS -A INPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT # Email (postfix + dovecot) # 25 = smtp, 587 = submission and 993 = IMAPS, 143 imap, 110 pop -A INPUT -p tcp -m multiport --dports 25,587,993,110,143 -j ACCEPT # NTP -A INPUT -p udp --dport 123 -j ACCEPT # Chain for preventing ping flooding - up to 6 pings per second from a single # source, again with log limiting. Also prevents us from ICMP REPLY flooding # some victim when replying to ICMP ECHO from a spoofed source. -N ICMPFLOOD -A ICMPFLOOD -m recent --name ICMP --set --rsource #-A ICMPFLOOD -m recent --name ICMP --update --seconds 1 --hitcount 6 --rsource --rttl -m limit --limit 1/sec --limit-burst 1 -j LOG --log-prefix "iptables[ICMP-flood]> -A ICMPFLOOD -m recent --name ICMP --update --seconds 1 --hitcount 6 --rsource --rttl -j DROP -A ICMPFLOOD -j ACCEPT # Permit useful IMCP packet types. # Note: RFC 792 states that all hosts MUST respond to ICMP ECHO requests. # Blocking these can make diagnosing of even simple faults much more tricky. # Real security lies in locking down and hardening all services, not by hiding. -A INPUT -p icmp --icmp-type 0 -m conntrack --ctstate NEW -j ACCEPT -A INPUT -p icmp --icmp-type 3 -m conntrack --ctstate NEW -j ACCEPT -A INPUT -p icmp --icmp-type 8 -m conntrack --ctstate NEW -j ICMPFLOOD -A INPUT -p icmp --icmp-type 11 -m conntrack --ctstate NEW -j ACCEPT # Drop all incoming malformed NULL packets -A INPUT -p tcp --tcp-flags ALL NONE -j DROP # Drop syn-flood attack packets -A INPUT -p tcp ! --syn -m conntrack --ctstate NEW -j DROP # Drop incoming malformed XMAS packets -A INPUT -p tcp --tcp-flags ALL ALL -j DROP COMMIT # Usage des tables déclarées avec ipset #-A INPUT -m set --match-set blocklist_ip src -j DROP # Ça, ça ne veut pas... #rejeter tout le reste -A INPUT -j REJECT --reject-with icmp-port-unreachable ===== Commandes Iptables utiles ===== Lister "tout" en vrac : iptables -S Lister tout en format tableau verbeux, avec numéros de ligne iptables -L -n -v --line-numbers Juste dans un des tableaux (ici INPUT) iptables -L INPUT --line-numbers Sauf que ce n'est pas "tout", genre pour lister les règles nat : iptables -t nat -S Enlever une règle d'après son numéro de ligne iptables -D INPUT 14 Restaurer des règles iptables-restore /etc/iptables/rules.v4 ===== Quelques explications ===== ==== Différence entre -I et -A ==== * ''-I'' signifie "insérer la règle à la ligne n° X" ; sans préciser de numéro, la règle se retrouve au début et a donc la priorité sur tout autre. * ''-A'' indique d'ajouter donc ce sera à la suite du reste des règles. Bref, quand on a un fichier qui charge les règles, elles sont forcément les unes après les autres, ''-A'' est indiqué. Si on teste une règle, alors ''-I'' peut être plus pertinent. ==== DROP ou REJECT --reject-with icmp-port-unreachable ==== * ''DROP'' ignore complètement le paquet (comme si le serveur n'existait pas). Il ne renvoie pas de message, ce qui évite les attaques où on force le serveur à envoyer des messages icmp à un autre serveur par exemple. * ''REJECT --reject-with icmp-port-unreachable'' renvoie un message icmp disant que le port est fermé (comme si le service qui écoute sur ce port n'était pas lancé et que le port était inutilisé). ==== Ordre des règles ==== Les règles sont appliquées dans l'ordre. Donc il faut que les commandes d'ipset et fail2ban soient avant celles qui acceptent une connexion : - On regarde si l'un de ces logiciels dit qu'il faut bloquer l'ip - Si oui, elle dégage - Si non, on passe à la règle suivante - La règle suivante étant "on accepte". Sinon, ça serait : - On accepte la connexion - On regarde si fail2ban... ah ben non, forcément, ça ne marche pas, puisque la connexion est acceptée. ===== Ipset ===== Créer une entrée pour toutes les ip qui vont être renvoyées dans les limbes (adapter le nom ''blocklist_ip''): ipset create blocklist_ip hash:ip Faire en sorte qu'iptables utilise cette liste d'ipset (appelée chaine) : iptables -A INPUT -m set --match-set blocklist_ip src -j DROP Et à présent pour alimenter la liste des ip définitivement bannies, ça sera ce genre de commande (remplacer ''$ip'' par l'ip) : ipset add blocklist_ip $ip ==== Commandes ipset ==== Pour lister les ip et "chaînes" : ipset list Pour juste lister les chaînes : ipset list -n Pour enlever une des ip sur notre chaîne "bloclist_ip" : ipset del blocklist_ip X.X.X.X ===== Rendre ça persistant au démarrage ===== C'est netfilter qui gère ça. S'assurer que les règles iptable et ipset sont bonnes, et que netfilter-persistent est démarré et en mode "enable" iptables -L -n -v ipset list systemctl status netfilter-persistent Pour garder les ip bannies dans ipset, il faut aussi faire cette commande (à renouveler quand on ajoute des ip) : ipset save Sauver le tout : netfilter-persistent save ===== Sources ===== * https://antoinelounis.com/informatique/securite/configuration-fail2ban-iptables-debian-raspberry/ * https://www.malekal.com/comment-proteger-ssh-avec-fail2ban-des-attaques-dos-bruteforce/ * https://www.malekal.com/fail2ban-proteger-son-serveur-des-attaques-dos-et-bruteforce * https://www.malekal.com/fail2ban-creer-un-filtre-pour-bloquer-les-attaques-dos-ou-bruteforce/ * https://www.cybernaute.ch/fail2ban-compter-et-classer-les-ip-bannies/ * https://www.cybernaute.ch/bannir-definitivement-ip-bannies-frequemment-fail2ban/ * https://www.skyminds.net/bash-lister-bloquer-debloquer-ip-iptables/ * https://www.malekal.com/comment-utiliser-ipset-sur-linux/ * https://sysreseau.net/iptables-12-commandes/ * http://www.delafond.org/traducmanfr/man/man8/iptables.8.html {{tag>Informatique iptables}} [[https://creativecommons.org/publicdomain/zero/1.0/deed.fr|{{ https://liev.re/imagesweb/licences/cc-zero.png?100 | Ce texte est placé sous licence CC0}}]]