Configurer le pare-feu Iptables

De Wiki Amis SH
Aller à la navigation Aller à la recherche



Le wiki : Accueil - Administrateur - Bureautique - Développeur - Intégrateur - Marketing - Multimédia - Objets numériques - Jeux - We make Hack


Configurer le pare-feu Iptables

Introduction à Netfilter et Iptables

# Iptables est une interface en ligne de commande permettant de configurer Netfilter.
# Netfilter implémente un pare-feu au sein du noyau Linux depuis la version 2.4.
# Netfilter est l'implémentation au niveau du noyau du pare-feu Linux.
# Iptables le manipule.
# IPtables est un des meilleurs pare-feu pour Linux et certainement le plus répandu.
# Iptables est un firewall très performant, installé sur tous les serveurs OVH.
# L'objectif est d'ouvrir certains ports et de fermer tout le reste.
# Netfilter/IpTables est une solution complète de firewall.
Site officiel : https://www.netfilter.org
Licence : https://www.netfilter.org/about.html#license
Télécharger Iptables : https://www.netfilter.org/news.html#2019-05-27b

Connaître la version installée de Iptables

# La première chose à faire est de vérifier la version de Iptables :
/sbin/iptables -V
# Sur GNU/Linux Debian Buster :
/sbin/iptables -V
iptables v1.8.3 (nf_tables)
# Sur GNU/Linux Mint Tina :
iptables v1.6.1

Comprendre le cheminement des paquets dans Iptables


Un paquet à destination du serveur va passer dans l’ordre par les tables suivantes :
PREROUTING – raw
PREROUTING – mangle
PREROUTING – nat
INPUT – mangle
INPUT – filter
Les chains PREROUTING et INPUT sont utilisées pour le filtrage de sécurité d'un serveur web.
Les autres auront un intérêt si vous positionnez votre pare-feu en coupure, sur un routeur par exemple.
Plus un paquet est « dropé » tôt par Iptables et moins il consommera de ressources systèmes puisqu'il sera passé par moins de test de vérifications.
Si ce paquet ne se fait pas droper par une de ces tables, et atteint une règle finissant en ACCEPT, il sera transféré vers le service réseau demandé.
Les règles dans INPUT-filter permettent de définir des règles très complexes, mais consomment également d'avantage de ressources CPU.
Les règles en PREROUTING ne peuvent traiter que des tests simples mais sont plus rapides à traiter.
Il est donc important de remonter autant que possible les règles vers le haut de ce schéma pour droper un maximum de paquets en PREROUTING la où cela consommera le moins de ressources.
Les règles compliquées quant à elles devront être exécutées via INPUT-filter pour bloquer des attaques les plus évoluées.

Arrêter démarrer redémarrer Iptables

# Vérifier si les commandes suivantes fonctionnent correctement :
sudo systemctl stop iptables
sudo systemctl start iptables
sudo systemctl restart iptables
sudo systemctl reload iptables

Désinstaller la version par défaut de Iptables

sudo apt autoremove iptables

Installer la dernière version de Iptables

Paquets prérequis pour l'installation de Iptables

# Paquets prérequis pour l'installation de Iptables :
sudo apt-get install bison libbison-dev flex

Installer Iptables depuis les dépôts de Debian

# Installer Iptables depuis les dépôts de Debian :
sudo apt install iptables
# Les paquets suivants contiennent des dépendances non satisfaites :
# iptables : Dépend: libiptc0 (= 1.8.2-4) mais 1.8.3-2 devra être installé
#            Dépend: libxtables12 (= 1.8.2-4) mais 1.8.3-2 devra être installé
# E: Impossible de corriger les problèmes, des paquets défectueux sont en mode « garder en l'état ».
Détails du paquet Iptables sur Debian Bullseye : https://packages.debian.org/bullseye/i386/iptables

Installer Iptables depuis les sources officielles du projet

# Installer Iptables depuis les sources du projet officiel disponibles sur le site de Netfilter.
# Site officiel du projet Iptables : https://www.netfilter.org
# Identifier la dernière version disponible pour Iptables.
# https://www.netfilter.org/projects/iptables/downloads.html
# La dernière version stable de Iptables a été publiée le 15 janvier 2021 dans sa version 1.8.7.
Utiliser le paquet iptables installé par défaut sur debian Bullseye, et basculer en mode legacy.
Procédure ci-dessous fonctionnelle mais qui ne devrait pas être nécessaire.
# Installer les paquets prérequis pour l'installation et le fonctionnement de Iptables :
sudo apt install bison libbison-dev flex bzip2 curl git build-essential make autoconf autogen pkg-config libgmp3-dev automake libtool pkg-config m4
# Définir ou seront stockées les différentes sources permettant l'installation de Iptables :
sudo bash
mkdir /root/sources-iptables-1.8.7/
# Le paquet libmnl est indispensable pour l'installation de Iptables !
cd /root/sources-iptables-1.8.7/
curl -O https://www.netfilter.org/projects/libmnl/files/libmnl-1.0.4.tar.bz2
tar xvf libmnl-1.0.4.tar.bz2
rm libmnl-1.0.4.tar.bz2
cd libmnl-1.0.4/
./configure && make
# make install
# Commande équivalente à make install mais génère un paquet .deb qui permet l'installation et la désinstallation de l'application compilée à l'aide de dpkg :
checkinstall
# Créer une documentation "y". Écrire une ligne de description. Valider deux fois avec la touche entrée pour sortir de l'édition de la documentation. Appuyer entrée pour finaliser la compilation.
# **********************************************************************
# 
#  Done. The new package has been installed and saved to
# 
#  /root/sources-iptables-1.8.7/libmnl-1.0.4/libmnl_1.0.4-1_amd64.deb
# 
#  You can remove it from your system anytime using: 
# 
#       dpkg -r libmnl
# 
# **********************************************************************
# Le paquet libnftnl est indispensable pour l'installation de Iptables !
# Plus d'informations sont disponibles sur la page : https://git.netfilter.org/libnftnl/
cd /root/sources-iptables-1.8.7/
git clone git://git.netfilter.org/libnftnl
cd libnftnl
sh autogen.sh
./configure
make
# make install
# Commande équivalente à make install mais génère un paquet .deb qui permet l'installation et la désinstallation de l'application compilée à l'aide de dpkg :
checkinstall
# Créer une documentation "y". Écrire une ligne de description. Valider deux fois avec la touche entrée pour sortir de l'édition de la documentation. Appuyer entrée pour finaliser la compilation.
# **********************************************************************
# 
#  Done. The new package has been installed and saved to
# 
#  /root/sources-iptables-1.8.7/libnftnl/libnftnl_1-1_amd64.deb
# 
#  You can remove it from your system anytime using: 
# 
#       dpkg -r libnftnl
# 
# **********************************************************************
# Le même paquet reconfiguré une seconde fois !
cd /root/sources-iptables-1.8.7/libnftnl
# Localiser libmnl :
whereis libmnl
libmnl: /usr/local/lib/libmnl.so /usr/local/lib/libmnl.la
# Lancer :
ldd /usr/local/lib/libmnl.so
# Affiche :
    linux-vdso.so.1 (0x00007fff8fd66000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc7df389000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fc7df55d000)
# Configurer le chemin de l'environnement pkg-config :
PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH
# Lancer le script sh et la configuration puis finaliser l'installation de libnftnl :
sh autogen.sh
./configure
make
# make install
# Commande équivalente à make install mais génère un paquet .deb qui permet l'installation et la désinstallation de l'application compilée à l'aide de dpkg :
checkinstall
# Créer une documentation "y". Écrire une ligne de description. Valider deux fois avec la touche entrée pour sortir de l'édition de la documentation. Appuyer entrée pour finaliser la compilation.
# **********************************************************************
# 
#  Done. The new package has been installed and saved to
# 
#  /root/sources-iptables-1.8.7/libnftnl/libnftnl_1-1_amd64.deb
# 
#  You can remove it from your system anytime using: 
# 
#       dpkg -r libnftnl
# 
# **********************************************************************

# Construction du module connlabel pour Iptables !
# Tutoriel : https://unixia.wordpress.com/2016/03/05/simplest-guide-to-using-connlabel/
# Source de libnfnetlink : https://netfilter.org/projects/libnfnetlink/downloads.html
cd /root/sources-iptables-1.8.7/
curl -O https://netfilter.org/projects/libnfnetlink/files/libnfnetlink-1.0.1.tar.bz2
tar xvf libnfnetlink-1.0.1.tar.bz2
rm libnfnetlink-1.0.1.tar.bz2
cd libnfnetlink-1.0.1/
./configure && make
# make install
# Commande équivalente à make install mais génère un paquet .deb qui permet l'installation et la désinstallation de l'application compilée à l'aide de dpkg :
checkinstall
# Créer une documentation "y". Écrire une ligne de description. Valider deux fois avec la touche entrée pour sortir de l'édition de la documentation. Appuyer entrée pour finaliser la compilation.
# **********************************************************************
# 
#  Done. The new package has been installed and saved to
# 
#  /root/sources-iptables-1.8.7/libnfnetlink-1.0.1/libnfnetlink_1.0.1-1_amd64.deb
# 
#  You can remove it from your system anytime using: 
# 
#       dpkg -r libnfnetlink
# 
# **********************************************************************
# Le paquet libnetfilter_conntrack est indispensable pour l'installation de Iptables !
# Source de libnetfilter_conntrack : https://netfilter.org/projects/libnetfilter_conntrack/downloads.html#libnetfilter_conntrack-1.0.5
cd /root/sources-iptables-1.8.7/
curl -O https://netfilter.org/projects/libnetfilter_conntrack/files/libnetfilter_conntrack-1.0.7.tar.bz2
tar xvf libnetfilter_conntrack-1.0.7.tar.bz2
rm libnetfilter_conntrack-1.0.7.tar.bz2
cd libnetfilter_conntrack-1.0.7/
./configure && make
# make install
# Commande équivalente à make install mais génère un paquet .deb qui permet l'installation et la désinstallation de l'application compilée à l'aide de dpkg :
checkinstall
# Créer une documentation "y". Écrire une ligne de description. Valider deux fois avec la touche entrée pour sortir de l'édition de la documentation. Appuyer entrée pour finaliser la compilation.
# **********************************************************************
# 
#  Done. The new package has been installed and saved to
# 
#  /root/sources-iptables-1.8.7/libnetfilter_conntrack-1.0.7/libnetfilter-conntrack_1.0.7-1_amd64.deb
# 
#  You can remove it from your system anytime using: 
# 
#       dpkg -r libnetfilter-conntrack
# 
# **********************************************************************
# Version 1.8.7 de Iptables depuis le site officiel !
# Adapter le lien avec le numéro de la dernière version de Iptables disponible.
cd /root/sources-iptables-1.8.7/
wget https://netfilter.org/projects/iptables/files/iptables-1.8.7.tar.bz2
# Décompresser le fichier :
tar xvfj iptables-1.8.7.tar.bz2
rm iptables-1.8.7.tar.bz2
# Lancer la configuration de Iptables :
cd iptables-1.8.7
./configure
make KERNEL_DIR=/usr/src/linux
make install KERNEL_DIR=/usr/src/linux
# Ici, le paramètre de make install, "KERNEL_DIR=/usr/src/linux", ne peut pas être ajouté derrière checkinstall.
# La commande checkinstall est lancée par la suite pour créer le .deb de la dernière compilation.
# Commande équivalente à make install mais génère un paquet .deb qui permet l'installation et la désinstallation de l'application compilée à l'aide de dpkg :
checkinstall
# Créer une documentation "y". Écrire une ligne de description. Valider deux fois avec la touche entrée pour sortir de l'édition de la documentation. Appuyer entrée pour finaliser la compilation.
# **********************************************************************
# 
#  Done. The new package has been installed and saved to
# 
#  /root/sources-iptables-1.8.7/iptables-1.8.7/iptables_1.8.7-1_amd64.deb
# 
#  You can remove it from your system anytime using: 
# 
#       dpkg -r iptables
# 
# **********************************************************************
cd /sbin
# Renommer les 3 fichiers suivants si ils existent :
mv iptables iptables.old
mv iptables-restore iptables-restore.old
mv iptables-save iptables-save.old
# Créer les raccourcis vers la nouvelle version de Iptables :
ln -s /usr/local/sbin/iptables iptables
ln -s /usr/local/sbin/iptables-restore iptables-restore
ln -s /usr/local/sbin/iptables-save iptables-save
/sbin/iptables -V
iptables v1.8.7 (legacy)
# Redémarrer le serveur pour appliquer les modifications :
shutdown -r now
# La mise à jour des paquets va rebasculer iptables dans sa version nftables :
sudo apt update
# Les NOUVEAUX paquets suivants seront installés :
 libip6tc2 libjansson4 libnftables1 nftables
# Les paquets suivants seront mis à jour :
 iptables
/sbin/iptables -V
iptables v1.8.7 (nf_tables)
# Sur Debian Bullseye, nf_tables est la version par défaut du pare-feu.
# Passer Iptables en version legacy pour continuer d'utiliser les configurations Iptables.
# Sinon, il sera nécessaire de migrer les anciennes règles iptables vers de nouvelles règles nftables.
Supprimer Iptables suite à une installation avec make
# Lors de ma première compilation de Iptables, j'ai omis d'intégrer les deux paquets de connlabel .
# Comment désinstaller la version de Iptables créée avec make, pour pouvoir la réinstaller avec connlabel ?
# Dans mon cas, j'ai utilisé la même méthode d'installation, sans supprimer Iptables, ce qui m'a permis de fixer l'absence de connlabel.
Utiliser la commande standardisée make uninstall
# La commande make uninstall lancée depuis le répertoire contenant les sources devrait permettre de désinstaller le paquet Iptables.
# C'est aux auteurs de la bibliothèque de fournir cette option, cependant, certains auteurs ne fournissent pas de cible pour uninstall.
# La commande make clean nettoie généralement le répertoire source en supprimant les fichiers qui ont été générés / compilés mais ne sert pas à désinstaller le programme.
# Lancer la commande make -n install peut être utile car elle affiche les étapes que le logiciel prendrait pour s'installer, sans pour autant installer le logiciel.
# Si la commande make uninstall ne fonctionne pas, les étapes de l'installation devront être inversées manuellement. 
Utiliser checkinstall suite à une compilation avec make pour créer un .deb qui pourra être utilisé pour supprimer le programme compilé
Avec Debian, si sudo make uninstall n'est pas disponible, au lieu de faire make install ou après avoir fait make install, lancer sudo checkinstall pour créer un .deb qui sera automatiquement installé.
Vous pouvez ensuite le supprimer en utilisant le gestionnaire de paquets système, par exemple apt / synaptic / aptitude / dpkg. Checkinstall supporte également la création d'autres types de paquet comme par exemple RPM.
Installer checkinstall :
sudo apt -y install checkinstall
Se positionner dans le dossier source : cd iptables-1.8.7/
Lancer checkinstall : checkinstall

Done. The new package has been installed and saved to
/root/iptables-1.8.7/iptables_1.8.7-1_amd64.deb
You can remove it from your system anytime using: 
dpkg -r iptables
Je n'ai pas vu l'étape de choix pour le nom, j'ai pu ajouter un commentaire pour le paquet à créer (Iptables 1.8.7) mais pas de demande de choix pour le nom du paquet.

Une fois terminé, vous pouvez installer et finalement désinstaller:
sudo dpkg -i $PACKAGE_NAME_YOU_ENTERED 
sudo dpkg -r $PACKAGE_NAME_YOU_ENTERED
Utiliser le fichier manifest.txt
Si vous avez un fichier manifest.txt qui liste tous les fichiers qui ont été installés avec make install :
Consulter d'abord la liste des fichiers et leurs mod-temps :
cd $SOURCE_DIR 
sudo xargs -I{} stat -c "%z %n" "{}" < install_manifest.txt
Vous devriez obtenir zéro erreur et les mod-times des fichiers énumérés devraient être sur ou après le temps d'installation.
Si tout est OK, vous pouvez les supprimer en une seule fois :
cd $SOURCE_DIR
mkdir deleted-by-uninstall
sudo xargs -I{} mv -t deleted-by-uninstall "{}" < install_manifest.txt

L'utilisateur Merlyn Morgan-Graham a cependant un avis sérieux concernant cette méthode que vous devez garder à l'esprit : "Faites attention aux fichiers qui pourraient aussi avoir été installés par d'autres paquets. Il suffit de supprimer ces fichiers [...] pourrait briser les autres paquets.". C'est la raison pour laquelle le répertoire dir deleted-by-uninstall a été créé pour y déplacer des fichiers au lieu de les supprimer.
Utiliser l'utilitaire stow
L'utilitaire "stow" a été conçu pour résoudre ce problème: http://www.gnu.org/software/stow/
Mettre à jour Iptables suite à une installation avec make
sudo apt update
sudo apt list --upgradable
En train de lister... Fait
iptables/buster-backports 1.8.3-2~bpo10+1 amd64 [pouvant être mis à jour depuis : 1.8.3-1]
N: Il y a des versions supplémentaires 2. Veuillez utiliser l'opérande « -a » pour les voir.
# Pour voir les paquets candidats pour iptables sur Debian Buster :
sudo apt policy iptables
iptables:
  Installé : 1.8.3-1
  Candidat : 1.8.3-2~bpo10+1
 Table de version :
     1.8.3-2~bpo10+1 100
        100 http://ftp.debian.org/debian buster-backports/main amd64 Packages
 *** 1.8.3-1 100
        100 /var/lib/dpkg/status
     1.8.2-4 500
        500 http://deb.debian.org/debian stable/main amd64 Packages
Avec un pinning de 100 pour la branche backport on pourrait forcer l'installation de iptables dans sa dernière version avec la commande :
sudo apt install iptables/buster-backports
sudo apt install iptables/buster-backports
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances       
Lecture des informations d'état... Fait
Version choisie « 1.8.3-2~bpo10+1 » (Debian Backports:buster-backports [amd64]) pour « iptables »
Version choisie « 1.8.3-2~bpo10+1 » (Debian Backports:buster-backports [amd64]) pour « libip4tc2 » à cause de « iptables »
Version choisie « 1.8.3-2~bpo10+1 » (Debian Backports:buster-backports [amd64]) pour « libip6tc2 » à cause de « iptables »
Version choisie « 1.8.3-2~bpo10+1 » (Debian Backports:buster-backports [amd64]) pour « libiptc0 » à cause de « iptables »
Version choisie « 1.8.3-2~bpo10+1 » (Debian Backports:buster-backports [amd64]) pour « libxtables12 » à cause de « iptables »
Version choisie « 1.1.4-1~bpo10+1 » (Debian Backports:buster-backports [amd64]) pour « libnftnl11 » à cause de « iptables »
Les paquets supplémentaires suivants seront installés : 
  libip4tc2 libip6tc2 libiptc0 libnftnl11 libxtables12
Paquets recommandés :
  nftables
Les NOUVEAUX paquets suivants seront installés :
  libnftnl11
Les paquets suivants seront mis à jour :
  iptables
Les paquets suivants seront mis à une VERSION INFÉRIEURE :
  libip4tc2 libip6tc2 libiptc0 libxtables12
1 mis à jour, 1 nouvellement installés, 4 remis à une version inférieure, 0 à enlever et 0 non mis à jour.
Il est nécessaire de prendre 758 ko dans les archives.
Après cette opération, 120 ko d'espace disque seront libérés.
Souhaitez-vous continuer ? [O/n] 
O
sudo apt update
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances       
Lecture des informations d'état... Fait
Tous les paquets sont à jour.

La syntaxe de Iptables

# Les règles doivent absolument être adaptées à votre configuration réseau.
# Un mauvais choix peut entraîner une indisponibilité de votre serveur ou une perte de contrôle sur celui-ci avec le blocage de votre connexion SSH.
# Les règles portent sur 3 chaînes :
INPUT (En entrée.)
FORWARD (Dans le cas d'un routage réseau.)
OUPUT (En sortie.)
# Les actions à entreprendre :
ACCEPT (Accepter le paquet.)
DROP (Le jeter.)
QUEUE
RETURN
# Arguments utilisés pour gérer les règles :
i : interface d'entrée (input)
i : interface de sortie (output)
t : table (par défaut filter contenant les chaînes INPUT, FORWARD, OUTPUT)
j : règle à appliquer (Jump)
A : ajoute la règle à la fin de la chaîne (Append)
I : insère la règle au début de la chaîne (Insert)
R : remplace une règle dans la chaîne (Replace)
D : efface une règle (Delete)
F : efface toutes les règles (Flush)
X : efface la chaîne
P : règle par défaut (Policy)
lo : localhost (ou 127.0.0.1, machine locale)
Lancer les commandes avec sudo iptables ou sudo /sbin/iptables.

Consulter le manuel

man iptables
man iptables-extensions
# Parcourir le man iptables-extensions pour prendre connaissance des possibilités offerte par iptables : http://manpages.ubuntu.com/manpages/xenial/man8/iptables-extensions.8.html

Lister les règles en place

# Utiliser une des commandes suivantes pour lister les règles en place.
# Affiche les règles proprement.
sudo iptables -S
# Affiche les règles et des informations.
sudo iptables -L
# Affiche les règles et des informations plus complètes.
sudo iptables -L -v
# Afficher une table particulière, par exemple filter ou mangle :
sudo iptables -t mangle -L

Sauvegarder les règles existantes

# Toutes les règles écrites correctement pour Iptables peuvent être sauvegardées dans un fichier texte pour être réimportées par la suite.
# Afficher les règles à sauvegarder :
sudo iptables-save
# Exporter les règles vers un fichier :
sudo iptables-save > iptables.rules

Restaurer une règle précédemment sauvegardée

# Les règles précédentes sont au format fichier de sauvegarde iptables provenant du iptables-save.
# Cette méthode d'intégration écrase toutes les règles iptables existantes :
sudo iptables-restore < $HOME/PATH/iptables-firewall-vide-tout-accepter.rules
# Si les règles ne sont pas importées dans les mêmes tables, elles ne sont pas écrasées.
# Les règles qui sont ajoutées à la table raw :
sudo iptables-restore < iptables-firewall-raw.rules
# Les règles qui sont ajoutées à la table mangle :
sudo iptables-restore < iptables-firewall-mangle.rules
# Les règles qui sont ajoutées à la table filter :
sudo iptables-restore < iptables-firewall-filter.rules
# Vérifier que les nouvelles règles soient bien prises en compte :
# Pour la table filter :
sudo iptables -L
# Pour la table mangle :
sudo iptables -t mangle -L

Appliquer les règles au démarrage du serveur en activant le service iptables-persistent

# Après avoir vérifié que nos règles fonctionnent comme prévu, nous pouvons rendre nos règles de pare-feu persistantes.
sudo apt-get install iptables-persistent
# Nos règles peuvent être appliquées au démarrage du serveur en activant le service "iptables-persistent".
sudo service iptables-persistent start
# Charger une règle personnalisée après le redémarrage du serveur
Source : https://askubuntu.com/questions/91413/reloading-iptables#243180

Lister les différents niveaux de log-level pour Iptables

# Sûrement les mêmes que pour Rsyslog.
debug(1)
info(3)
notice(5) (default 5)
error(7)
fatal(8)

Configurer le noyau du système pour mettre en place certaines règles de protection

# Modifier le fichier /etc/sysctl.conf sur votre serveur et ajouter les règles suivantes :
sudo nano /etc/sysctl.conf
# Décommenter les valeurs suivantes :
# Enable Spoof protection (reverse-path filter) Turn on Source Address Verification in all interfaces to prevent some spoofing attacks
net.ipv4.conf.default.rp_filter=1
net.ipv4.conf.all.rp_filter=1
# Enable SYN Cookie
net.ipv4.tcp_syncookies=1
# Do not accept ICMP redirects (prevent some MITM attacks)
net.ipv4.conf.all.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
# Accept ICMP redirects only for gateways listed in our default gateway list (enabled by default)
net.ipv4.conf.all.secure_redirects = 1
# Do not send ICMP redirects (we are not a router)
net.ipv4.conf.all.send_redirects = 0
# Do not accept IP source route packets (we are not a router)
net.ipv4.conf.all.accept_source_route = 0
net.ipv6.conf.all.accept_source_route = 0
# Ajouter les lignes suivantes anti-DDOS.
# Désactiver le mode "loose" du kernel qui autorise par défaut un paquet ACK a ouvrir une connexion sur le serveur qui permet de sauter les deux premières étapes du 3WHS.
# Le principe d'un DDOS est de saturer le serveur de requêtes jusqu'a ce qu'il s'effondre par manque de ressources.
# La défense locale au serveur consiste à droper le plus efficacement possible toutes les demandes de connexions anormales.
# Il existe différents type de DDOS, certains se contenteront de spammer des SYN vers votre serveur en espérant ouvrir plein de connexions en attente et saturer le serveur de connexions en attentes.
# En allant un peu plus loin dans le 3-way handshake TCP (3WHS), l'objectif de l’attaquant sera de faire de nombreuses opérations peu coûteuses pour établir des connexions TCP avec le serveur et ne pas les suivre, ce qui sera coûteux en ressources pour votre machine pour garder ouvertes les connexions en attentes ou inactive.
# Passer l'option nf_conntrack_tcp_loose à 0 dans le kernel.
## net.netfilter.nf_conntrack_tcp_loose=0
#####
# Le serveur ne retrouve pas les deux lignes de configuration suivantes, que je commente. A SUIVRE !
# sysctl: cannot stat /proc/sys/net/netfilter/nf_conntrack_tcp_loose: Aucun fichier ou dossier de ce type
# sysctl: cannot stat /proc/sys/net/netfilter/nf_conntrack_max: Aucun fichier ou dossier de ce type
# J'ajoute simplement la ligne laissée décommentée.
# do not allow ACK pkts to create new connection (normal behavior SYN->, <-SYN,ACK, ACK->)
## net.netfilter.nf_conntrack_tcp_loose=0
# enable TCP timestamps as SYN cookies utilize this TCP
net.ipv4.tcp_timestamps=1
# Conntrack Entry Tuning (Calculate your own values ! depending on your hardware)
## net.netfilter.nf_conntrack_max=200000
# Ajouter également :
echo 'options nf_conntrack hashsize=500000' > /etc/modprobe.d/nf_conntrack.conf # (Calculate your own values ! depending on your hardware)
# Un reboot est nécessaire pour appliquer cette configuration.
# Ajouter directement la valeur dans le fichier hashsize, mais à nouveau je ne retrouve pas ce dossier dans /sys/module/ de mon serveur Debian, je n'applique pas cette configuration ci-dessous.
# echo 500000 > /sys/module/nf_conntrack/parameters/hashsize
# Appliquer les modifications sans redémarrer :
sysctl -p
# La table du module « recent » est limitée a 100 entrées par défaut.
# Elle sera rapidement pleine lorsque utilisée pour interdire l'accès à des adresses IP récente pour un serveur exposé sur Internet ce qui limite son intérêt.
# Augmenter la taille de cette table en créant un fichier « modprod.conf » pour régler une option de ce module kernel pour augmenter cette limite.
# Ajuster la valeur en fonction de la capacité du serveur.
# Il faut redémarrer pour appliquer cette valeur.
su -
echo "options xt_recent ip_list_tot=512" > /etc/modprobe.d/xt_recent.conf

Désactiver les paramétrages par défaut pour les helpers

Préciser les helpers utilisés pour les règles RELATED et les paramètres de ceux-ci, et ainsi limiter le spoofing d’addresse.
Désactiver les paramétrages par défaut.
Depuis Linux 3.5, il est possible (et fortement conseillé pour les serveurs en frontal d’internet) de désactiver l’assignement automatique des helpers :
sudo modprobe nf_conntrack nf_conntrack_helper=0
Le paramètre peut être modifier après chargement :
echo 0 > /proc/sys/net/netfilter/nf_conntrack_helper
Source : https://gist.github.com/azlux/6a70bd38bb7c525ab26efe7e3a7ea8ac

Le module CPU

Le module CPU pour mettre en oeuvre une répartition de charge de l’établissement des connexions TCP sur les différents CPU de votre serveur.

Le module TIME

Le module time qui permet par exemple de fermer un service automatiquement le weekend ou à certaines heures.

Configurer Iptables sur un serveur distant

Vider les tables pour supprimer toutes les règles existantes

# Créer le fichier iptables-firewall-vide-tout-accepter.rules et ajouter les règles suivantes.
# sudo nano iptables-firewall-vide-tout-accepter.rules
# Vider les tables pour supprimer toutes les règles. Le pare-feu sera alors complètement ouvert.
# Flush toutes les règles correctement :
sudo iptables -F
# Équivalent :
# sudo iptables --flush
# Pour vider uniquement les règles de la rubrique INPUT :
# sudo iptables -F INPUT
# Pour vider uniquement les règles personnalisées :
# sudo iptables -t filter -X
sudo iptables -X
sudo iptables -t nat        -F
sudo iptables -t nat        -X
sudo iptables -t mangle     -F
sudo iptables -t mangle     -X

# On réaffirme que les règles par défaut dans une table vide sont de tout accepter.
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT
sudo iptables -t nat -P OUTPUT ACCEPT
sudo iptables -t mangle -P INPUT ACCEPT
sudo iptables -t mangle -P OUTPUT ACCEPT 
# On sauvegarde les règles inactives du pare-feu :
sudo iptables-save > iptables-firewall-vide-tout-accepter.rules
# On peut alors importer le script dans Iptables qui va écraser toutes les règles existantes pour remettre Iptables par défaut :
sudo sudo iptables-restore < iptables-firewall-vide-tout-accepter.rules

Ne pas casser les connexions établies

####
# Ne pas couper la connexion actuelle qui est utilisée pour configurer le serveur.
####
# Fermer tous les ports entrants avec IPtables revient a fermer le port SSH et notre accès administrateur actuel !
# Il faut impérativement autoriser les connexions déjà établies avant de fermer les ports !
# Autoriser RELATED sans restriction est une mauvaise habitude de nombreuses documentations en ligne et la source de problèmes de sécurité importants
# Depuis la version 4.7 du kernel les helpers ne sont plus activés par défaut pour éviter ce problème.
# -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# Permettre à une connexion ouverte de recevoir du trafic en entrée.
-A INPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT
# Il est préférable de laisser RELATED autorisé pour l'ICMP.
-A INPUT -p icmp -m conntrack --ctstate RELATED -j ACCEPT

# Permettre à une connexion ouverte d'émettre du trafic en sortie.
# -A OUTPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -m conntrack ! --ctstate INVALID -j ACCEPT 
# Utiliser une règle avec le module state si le module conntrack n'est pas mis à disposition :
# -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

Interdire les connexions entrantes et sortantes

# DROP tous les ports pour protéger le serveur.
# Les trois commandes suivantes sont radicales et de ce fait dangereuses !
# En cas de mauvaise configuration il sera impossible d'accéder au serveur distant !
# Ajouter auparavant les règles qui permettront de ne pas couper les connexions établies !
# Si le port SSH n'est pas autorisé, la connexion distante au serveur sera alors impossible !
# Il est indispensable de conserver le premier terminal ouvert connecté au serveur lors des tests !
# En cas de mauvaise configuration la connexion avec le serveur distant pourrait être coupée immédiatement !
# Un ensemble de règles complémentaires doivent être ajoutées pour accepter la consultation des services web et la connexion au service SSH pour toujours être en capacité d'administrer le serveur !
# Une fois les règles mises en place ajoutées, il est indispensable de tester la connexion au serveur SSH depuis un deuxième terminal pour s'assurer que le serveur distant est toujours bien accessible !
# Alors seulement le premier terminal pourra être fermé.
# sudo iptables -P INPUT DROP
# sudo iptables -P FORWARD DROP
# sudo iptables -P OUTPUT DROP
# Voir les règles proposées par la suite pour autoriser les services nécessaires au bon fonctionnement du serveur web.

Créer un script de règles pour protéger un serveur distant avec Iptables

Règle personnalisée pour configurer Iptables raw

# Créer le fichier iptables-firewall-raw.rules et ajouter les règles suivantes.
# sudo nano iptables-firewall-raw.rules
# Début de la règle raw.
*raw

## Anti DDOS.
## Les paquets TCP avec le flag SYN à destination des ports 22,80 ou 443 ne seront pas suivi par le connexion tracker et donc traités plus rapidement.
## Les pages ne chargent plus avec cette règle de décommentée tout comme la connexion SSH devient impossible !
## Ce blocage semble apparaître quand j'active les règles de la table raw et filter.
## -A PREROUTING -p tcp -m multiport --dports 22,80,443 -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j CT --notrack
# 
## J'enlève la valeur SYN et l'accès web et terminal fonctionne correctement.
## Cette règle n'a aucune chance de s'appliquer puisque la combinaison masque/drapeaux est impossible.
## Cette commande test un drapeau qui n'est pas dans le masque, ça ne peut pas marcher. 
## -A PREROUTING -p tcp -m multiport --dports 22,80,443 -m tcp --tcp-flags FIN,RST,ACK SYN -j CT --notrack

# Maîtrise de charge.
# Regrouper les adresses IP sources par bloc de 256 sous réseaux en /24 et n’autoriser qu'un nombre maximum de demandes de connexions SYN par seconde pour chaque sous réseau.
# Utiliser le module hashlimit. Permet de mettre un plafond de connexion par seconde vers le serveur par groupe de 256 IP.
-A PREROUTING -p tcp -m tcp --syn -m multiport --dports 22,80,443 -m hashlimit --hashlimit-above 200/sec --hashlimit-burst 1000 --hashlimit-mode srcip --hashlimit-name syn --hashlimit-htable-size 2097152 --hashlimit-srcmask 24 -j DROP

## On pourrait interdire le ping avec l'interdiction de ICMP directement en PREROUTING.
## Je vais l'interdire par défaut depuis la table *filter et autoriser le ping aux services OVH.
## ICMP, ce n'est pas seulement le ping mais aussi des messages d'erreur qu'il vaut mieux ne pas bloquer si on veut que les communications puissent fonctionner correctement.
## -A PREROUTING -p icmp -j DROP 

# Fin de la règle.
COMMIT
# Importer le script dans Iptables.
# sudo iptables-restore < iptables-firewall-raw.rules
# Vérifier que les règles aient bien été ajoutées dans la table raw :
# sudo iptables -t raw -L

Règle personnalisée pour configurer Iptables mangle

# Créer le fichier iptables-firewall-mangle.rules et ajouter les règles suivantes.
# sudo nano iptables-firewall-mangle.rules
# Début de la règle mangle.
*mangle

# Bloquer la fragmentation TCP :
-A PREROUTING -f -j DROP

# Paquet avec SYN et FIN à la fois :
-A PREROUTING -p tcp -m tcp --tcp-flags FIN,SYN FIN,SYN -j DROP
# Paquet avec SYN et RST à la fois
-A PREROUTING -p tcp -m tcp --tcp-flags SYN,RST SYN,RST -j DROP
# Paquet avec FIN et RST à la fois
-A PREROUTING -p tcp -m tcp --tcp-flags FIN,RST FIN,RST -j DROP
# Paquet avec FIN mais sans ACK
-A PREROUTING -p tcp -m tcp --tcp-flags FIN,ACK FIN -j DROP
# Paquet avec URG mais sans ACK
-A PREROUTING -p tcp -m tcp --tcp-flags ACK,URG URG -j DROP
# Paquet avec PSH mais sans ACK
-A PREROUTING -p tcp -m tcp --tcp-flags PSH,ACK PSH -j DROP
# Paquet avec tous les flags à 1 <=> XMAS scan dans Nmap
-A PREROUTING -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j DROP
# Paquet avec tous les flags à 0 <=> Null scan dans Nmap
-A PREROUTING -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
# Paquet avec FIN,PSH, et URG mais sans SYN, RST ou ACK
-A PREROUTING -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,PSH,URG -j DROP
# Paquet avec FIN,SYN,PSH,URG mais sans ACK ou RST
-A PREROUTING -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,PSH,URG -j DROP
# Paquet avec FIN,SYN,RST,ACK,URG à 1 mais pas PSH
-A PREROUTING -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,ACK,URG -j DROP

# Spoofing d'adresses IP source.
# Peu probable pour un serveur avec uniquement une IP publique sur Internet.
# DROP tout ce qui arrive d’un réseau privé/réservé :
-A PREROUTING -s 224.0.0.0/8 -j DROP
-A PREROUTING -s 169.254.0.0/16 -j DROP
-A PREROUTING -s 172.16.0.0/12 -j DROP
-A PREROUTING -s 192.0.2.0/24 -j DROP
-A PREROUTING -s 192.168.0.0/16 -j DROP
-A PREROUTING -s 10.0.0.0/8 -j DROP
-A PREROUTING -s 0.0.0.0/8 -j DROP
-A PREROUTING -s 240.0.0.0/5 -j DROP
-A PREROUTING -s 127.0.0.0/8 ! -i lo -j DROP

# On pourrait interdire le ping avec icmp directement en PREROUTING.
# Pour le moment je vais l'interdire par défaut depuis *filter et autoriser le ping aux services OVH.
# -A PREROUTING -p icmp -j DROP

# Fin de la règle.
COMMIT
# Importer le script dans Iptables.
# sudo iptables-restore < iptables-firewall-mangle.rules
# Vérifier que les règles aient bien été ajoutées dans la table mangle :
# sudo iptables -t mangle -L

Règle personnalisée pour configurer Iptables filter

# Créer le fichier iptables-firewall-filter.rules et ajouter les règles suivantes.
# sudo nano iptables-firewall-filter.rules
####
# Début de la règle iptables *filter.
####
*filter

# Créer trois chaînes pour la journalisation :
-N LOG_ACCEPT
-A LOG_ACCEPT -j LOG --log-prefix "INPUT:ACCEPT:" --log-level 2
-A LOG_ACCEPT -j ACCEPT
-N LOG_REJECT
-A LOG_REJECT -j LOG --log-prefix "INPUT:REJECT: " --log-level 4
-A LOG_REJECT -j REJECT
-N LOG_DROP
-A LOG_DROP -j LOG --log-prefix "INPUT:DROP: " --log-level 4
-A LOG_DROP -j DROP
# Effectuer toutes les actions en une seule fois en passant (-j) à vos chaînes personnalisées au lieu des valeurs par défaut LOG / ACCEPT / REJECT / DROP.
# iptables -A <your_chain_here> <your_conditions_here> -j LOG_ACCEPT
# iptables -A <your_chain_here> <your_conditions_here> -j LOG_REJECT
# iptables -A <your_chain_here> <your_conditions_here> -j LOG_DROP

####
# Liste blanche
####
# Les protections "flood" pourraient entraîner un ban de l'adresse IP via fail2ban.
# Ajouter son adresse IP en liste blanche. Je test le script avant de passer en liste blanche.
# -A INPUT -s Addresse-IP-en-liste-blanche -j ACCEPT

####
# Pas de filtrage sur l'interface de loopback.
####
# Le serveur ne doit pas avoir de soucis à communiquer avec lui-même au niveau des services internes.
# Accepter toutes les connexions de la machine locale pour permettre aux services de communiquer entre eux.
# Tout paquet envoyé sur l'interface de loopback passe successivement par les chaînes OUTPUT, POSTROUTING, PREROUTING et INPUT et doit être accepté dans toutes pour arriver à destination.
-A OUTPUT -o lo -j ACCEPT
-A INPUT -i lo -j ACCEPT

####
# Ne pas couper la connexion actuelle qui est utilisée pour configurer le serveur.
####
# Fermer tous les ports entrants avec IPtables revient a fermer le port SSH et notre accès administrateur actuel !
# Il faut impérativement autoriser les connexions déjà établies avant de fermer les ports !
# Autoriser RELATED sans restriction est une mauvaise habitude de nombreuses documentations en ligne et la source de problèmes de sécurité importants
# Depuis la version 4.7 du kernel les helpers ne sont plus activés par défaut pour éviter ce problème.
# -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# Permettre à une connexion ouverte de recevoir du trafic en entrée.
-A INPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT
# Il est préférable de laisser RELATED autorisé pour l'ICMP.
-A INPUT -p icmp -m conntrack --ctstate RELATED -j ACCEPT

# Permettre à une connexion ouverte d'émettre du trafic en sortie.
# -A OUTPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -m conntrack ! --ctstate INVALID -j ACCEPT 

####
# Bloquer tous les ports par défaut pour toutes les connexions entrantes et sortantes.
####
# Les connexions entrantes seront bloquées par défaut.
-P INPUT DROP
# Les connexions destinées à être forwardées seront bloquées par défaut.
-P FORWARD DROP
# Les connexions sortantes seront bloquées par défaut.
-P OUTPUT DROP
# REJECT les paquets est plus propre mais DROP est plus sécurisé !
# Avec DROP, un paquet non solicité qui n'est pas accepté est effacé. Le client attendra de son côté une réponse en vain jusqu'au timeout.
# Avec REJECT, un paquet non solicité qui n'est pas accepté va être suivi d'un message d'erreur pour le client.
# En cas d'envoi de paquets à répétition sur un mauvais port, le serveur ne traitera pas les requêtes avec DROP, alors qu'avec REJECT le serveur prendra le temps de répondre.

####
# Autoriser le port SSH par défaut.
####
# Cette règle est à conserver sauf en cas de configuration du Port Knocking.
-A INPUT -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
# Autoriser SSH entrant uniquement à partir d'un réseau spécifique, par exemple, 192.168.100.x.
### -A INPUT -p tcp -s 192.168.100.0/24 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
### -A OUTPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
### -A OUTPUT -p tcp -d 192.168.100.0/24 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

####
# DROP les paquets entrants contenant des fragments.
####
# Une attaque par fragments aboutit à la panique des serveurs Linux causant une perte de données.
-A INPUT -f -j LOG_DROP

####
# DROP les connexions dans un état invalide et empêche les paquets ACK d’établir des connexions au serveur.
####
-A INPUT -m state --state INVALID -j LOG_DROP

####
# Autoriser uniquement les paquets TCP SYN.
####
# DROP les connexions TCP entrantes qui ne sont pas des paquets SYN.
-A INPUT -p tcp ! --syn -m state --state NEW -j LOG_DROP
# Faire suivre à SYNPROXY les paquets TCP à destination des ports 22,80 ou 443 avec le flag SYN non suivi (UNTRACKED ou INVALID).
# SYNPROXY répond le SYN-ACK à l'émeteur du SYN et crée une connexion à l'état ESTABLISHED dans conntrack seulement si l'émetteur retourne un ACK valide.
# Les paquets avec un tcp-cookie invalides sont dropés, mais pas ceux avec des flags non-standard, il faudra les filtrer par ailleurs. 
-A INPUT -p tcp -m multiport --dports 22,80,443 -m tcp -m state --state INVALID,UNTRACKED -j SYNPROXY --sack-perm --timestamp --wscale 7 --mss 1460
# La règles SYNPROXY doit être suivi de celle-ci pour rejeter les paquets restant en état INVALID.
-A INPUT -p tcp -m multiport --dports 22,80,443 -m tcp -m state --state INVALID -j LOG_DROP

####
# Autoriser les services web.
####
# Autoriser les connexions DNS.
-A INPUT -p tcp --dport 53 -j ACCEPT
-A OUTPUT -p tcp --dport 53 -j ACCEPT
# Cette règle est une faille de sécurité en plus d'être inutile.
# -A INPUT -p udp --sport 53 -j ACCEPT
-A OUTPUT -p udp --dport 53 -j ACCEPT
#
# Autoriser les connexions au serveur FTP sur le port 21.
# Une connexion FTP passive est recommandée ! Depuis le client FileZilla Edition/Paramètres/Connexion/FTP/ décocher :
# Autoriser un retour sur un autre mode de transfert en cas d'échec
-A INPUT -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
# Configurer Iptables pour utiliser la plage de ports passifs proposés par IANA entre 49152-65534.
# La récupération au dossier racine ne se fait pas, depuis FileZilla, si la plage de port suivante n'est pas autorisée.
-A INPUT -p tcp --dport 49152:65534 -m state --state ESTABLISHED,NEW -j ACCEPT
# Ajout de RELATED et helper. Appliqué en complément de la connexion FTP ? Revérifier la syntaxe et l'utilité des deux lignes suivantes.
-A OUTPUT -m conntrack --ctstate RELATED -m helper --helper ftp -p tcp --dport 49152:65534 -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED -m helper --helper ftp -p tcp --dport 49152:65534 -j ACCEPT
#
##### La connexion sFTP n'est pas configurée actuellement. A faire !
#
# Autoriser les connexions un serveur de mail SMTP, POP3, IMAP.
# Combiner plusieurs ports dans la même règle avec multiport.
# Mail SMTP:25
# Mail POP3:110
# Mail IMAP:143
# Mail IMAP:993
# Mail POP3S:995
-A INPUT -p tcp -m multiport --dports 25,110,143,993,995 -m state --state NEW,ESTABLISHED -j ACCEPT
# Ajout de "NEW," devant "ESTABLISHED" supposé nécessaire pour la lecture de mails lorsque Redmine interoge un serveur IMAP distant.
# -A OUTPUT -p tcp -m multiport --dports 25,110,143,993,995 -m state --state ESTABLISHED -j LOG_ACCEPT
-A OUTPUT -p tcp -m multiport --dports 25,110,993,995 -m state --state ESTABLISHED -j LOG_ACCEPT
-A OUTPUT -p tcp -m multiport --dports 143 -m state --state NEW,ESTABLISHED -j LOG_ACCEPT
#
# Autoriser les connexions au serveur web Apache2.
-A INPUT -p tcp --dport 80 -j ACCEPT
-A OUTPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT
-A OUTPUT -p tcp --dport 443 -j ACCEPT

# Si la synchronisation avec DropBox est installée :
# DropBox utilise le port 17500 TCP et UDP pour la synchronisation réseau par défaut.
# Il utilise également les ports TCP 17600 et TCP 17603 pour le bouton Web «Ouvrir».
# Il semblerait qu'il soit inutile d'ouvrir les ports, puisque le serveur va effectuer sa demande de connexion vers l'extérieur. La connexion devrait alors s'établir.
-A INPUT -p tcp --dport 17500 -j ACCEPT
-A INPUT -p udp --dport 17500 -j ACCEPT
-A INPUT -p tcp --dport 17600 -j ACCEPT
-A INPUT -p tcp --dport 17603 -j ACCEPT

####
# Il faut remonter les restrictions du serveur avant l'ouverture des services ?
# Optimiser le serveur.
####
########
# Blacklister le scann de ports.
########
# Un attaquant qui cherche à découvrir les services ouverts sur votre serveur va tenter d'établir une connexion TCP sur tous les ports.
# Il attendra la réponse du serveur pour détecter les ports ouverts.
# Une première technique consiste à limiter le nombre de paquets typique d'un scan.
# A faire : http://blog.sevagas.com/?Iptables-firewall-versus-nmap-and,31
# On peut également DROP les paquets indésirables avec les règles mangle.
# Les règles présentes dans mangle forcent l'attaquant à faire un 3WHS dans les règles pour voir ce qui se passe la ou c’est ouvert.
# La policy DROP en INPUT jettera tout le reste.
# On peut alors utiliser par exemple un mécanisme de ports piégés qui ne sont pas utilisés sur la machine.
# On blackliste un certain temps les machines qui vont tenter de se connecter aux ports piégés.
-A INPUT -m recent --rcheck --seconds 86400 --name portscan --mask 255.255.255.255 --rsource -j LOG_DROP
-A INPUT -m recent --remove --name portscan --mask 255.255.255.255 --rsource
-A INPUT -p tcp -m multiport --dports 445,1433,3389,10000 -m recent --set --name portscan --mask 255.255.255.255 --rsource -j LOG_DROP
# ATTENTION !
# Un attaquant qui s'en rendrait compte pourrait forger des paquets TCP vers un de ces ports mais avec de fausses adresses IP.
# Le projet Scapy permet de forger des paquets TCP : https://scapy.net
# Le serveur se mettrait à blacklister tout internet pour 24h si l'attaquant décidait de parcourir la plage IPv4 complète.
# Cette règle fonctionne bien sur un petit serveur mais il n'est pas conseillé de la mettre en production pour une grande entreprise.

########
# Limiter le nombre de connexions simultanées établies à partir d'une adresse IP unique sur un port donné.
########
# Le service Apache2 a été autorisé avant, donc, cette règle ne s'applique plus.
# Il faudrait la remonter avant la règle qui autorise Apache2.
-A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 4 -j LOG_REJECT
-A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 4 -j LOG_REJECT
-A INPUT -p tcp --syn --dport 443 -m connlimit --connlimit-above 15 -j LOG_REJECT

########
# Faire face au flood.
########
-A FORWARD -p tcp --syn -m limit --limit 1/second -j ACCEPT
-A FORWARD -p udp -m limit --limit 1/second -j ACCEPT
-A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/second -j ACCEPT

# Limiter à 3 demandes de connexion par seconde pour une IP sur le protocole SSH.
-A INPUT -p tcp --syn --dport ssh -m connlimit --connlimit-above 3 -j LOG_DROP
# Autoriser uniquement 3 connexions en SSH sur un intervalle de 60 secondes (1 minute).
-A INPUT -p tcp --dport ssh -m state --state NEW -m recent --update --seconds 60 --hitcount 10 -j LOG_DROP

# Prévenir les attaques de Deni de Service (DoS).
# Limiter le nombre de connexions entrantes par minute sur le port 80 et 443 à 75 et définir une rafale limite de 120.
# La limite / minute sera appliquée lorsque le nombre total de connexions aura atteint le niveau limite de rafale.
-A INPUT -p tcp --dport 80 -m limit --limit 75/minute --limit-burst 120 -j ACCEPT
-A INPUT -p tcp --dport 443 -m limit --limit 75/minute --limit-burst 120 -j ACCEPT

########
# Bloquer ICMP pour interdire les réponses du serveur suite à une requête PING.
########
# Déjà bloqué par défaut du fait de la politique de DROP au début.
# -A INPUT -p icmp --icmp-type echo-request -j DROP
# -A OUTPUT -p icmp --icmp-type echo-reply -j DROP
# Autoriser le serveur a lancer une requête PING de l'intérieur vers un serveur externe :
-A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
-A INPUT -p icmp --icmp-type echo-reply -j ACCEPT

# Autoriser ICMP pour OVH et le monitoring :
# Autoriser le monitoring du serveur par OVH pour avertir OVH en cas de panne.
# Adresses à autoriser d'après la documentation OVH : https://docs.ovh.com/fr/dedicated/monitoring-ip-ovh/
# Mise en application : https://community.centminmod.com/threads/ovh-icmp-ping-whitelist-for-csf-firewall.11427/
# Autoriser les adresses suivantes de OVH a PING :
# ping.ovh.net, proxy.p19.ovh.net, proxy.rbx.ovh.net, proxy.ovh.net, proxy-rbx2.ovh.net, proxy.sbg.ovh.net, proxy.bhs.ovh.net
#
# Il est conseillé de laisser cache.ovh.net pour permettre à OVH d'intervenir sur le serveur.
# Si vous fermez le port 22 pour les techniciens ils ne pourront pas intervenir.
-A INPUT -p tcp --dport 22 --source cache.ovh.net -j ACCEPT
-A INPUT -p icmp --source proxy.ovh.net -j ACCEPT
-A INPUT -p icmp --source proxy.p19.ovh.net -j ACCEPT
-A INPUT -p icmp --source proxy.rbx.ovh.net -j ACCEPT
-A INPUT -p icmp --source proxy.sbg.ovh.net -j ACCEPT
-A INPUT -p icmp --source proxy.bhs.ovh.net -j ACCEPT
-A INPUT -p icmp --source ping.ovh.net -j ACCEPT
# Start Monitoring
-A INPUT -p icmp --source 151.80.231.244 -j ACCEPT
-A INPUT -p icmp --source 151.80.231.245 -j ACCEPT
-A INPUT -p icmp --source 151.80.231.246 -j ACCEPT
-A INPUT -p icmp --source 151.80.231.247 -j ACCEPT
-A INPUT -p icmp --source 37.187.231.251 -j ACCEPT
# End Monitoring
-A INPUT -p icmp --source a2.ovh.net -j ACCEPT
-A INPUT -p icmp --source 92.222.184.0/24 -j ACCEPT
-A INPUT -p icmp --source 92.222.185.0/24 -j ACCEPT
-A INPUT -p icmp --source 92.222.186.0/24 -j ACCEPT
-A INPUT -p icmp --source 167.114.37.0/24 -j ACCEPT
-A INPUT -p tcp --source 192.168.0.0/16 -j ACCEPT
-A INPUT -p udp --source 192.168.0.0/16 -j ACCEPT
#
# L'adresse IP de votre serveur, 139.99.173.195 pour visionduweb, doit laisser passer :
# 139.99.173.249 si vous êtes sur un serveur HG.                    
# 139.99.173.250 pour le serveur SLA.
# 139.99.173.251 pour le serveur MRTG pour pouvoir bénéficier de RTM.
#
# Uniquement pour un serveur HG :
# -A INPUT -p icmp --source 139.99.173.249 -j ACCEPT
# -A OUTPUT -p udp --dport 6100:6200 -j ACCEPT # OVH RTM
#
# Serveur SLA et MRTG :
-A INPUT -p icmp --source 139.99.173.250 -j ACCEPT
-A INPUT -p icmp --source 139.99.173.251 -j ACCEPT
#
# A suivre !
# Vérifier les paquets ICMP bloqués depuis le fichier de journalisation /var/log/messages :
# grep -i 'ICMP_IN Blocked' /var/log/messages| tail -5| awk '{print $1,$2,$3,$5,$6,$7,$8,$9,$12,$13,$19,$20}'; date
# Vérifier les informations des adresses IP bloquées pour s'assurer que ce n'est pas un service de OVH :
# Utiliser par exemple la lacommande suivante :
# curl ipinfo.io/92.222.185.1

# La politique par défaut étant à DROP, les règles suivantes sont t'elles réellement nécessaires ?
# DROP des paquets XMAS :
-A INPUT -p tcp --tcp-flags FIN,URG,PSH FIN,URG,PSH -j LOG_DROP
-A INPUT -p tcp --tcp-flags ALL ALL -j LOG_DROP
# DROP des paquets NULL :
-A INPUT -p tcp --tcp-flags ALL NONE -j LOG_DROP
-A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j LOG_DROP
# DROP silencieusement les paquets broadcastés.
-A INPUT -m pkttype --pkt-type broadcast -j LOG_DROP

####
# Fin de la règle *filter
####
COMMIT
# Importer le script dans Iptables.
# sudo iptables-restore < iptables-firewall-filter.rules
# Vérifier que les règles aient bien été ajoutées dans la table *filter :
# sudo iptables -t filter -L

Mise en place du Port Knocking

# Créer le fichier iptables-firewall-port-knocking.rules et ajouter les règles suivantes.
# sudo nano iptables-firewall-port-knocking.rules
# Attention, la règle ci-dessous est une règle avec *filter
# Importer uniquement cette règle va bien mettre en place le Port Knocking mais va écraser les règles *filter précédentes.
# De ce fait, les services qui avaient été autorisés, comme Apache2 ou MySQL, ne seront plus accessibles depuis l'extérieur.
# Début de la règle pour le Port Knocking.
*filter
# Récapitulatif d'après le tutoriel : https://wiki.visionduweb.fr/index.php?title=Port_Knocking

# Créer les chaînes qui seront utilisées lors de la connexion autorisée vers le serveur.
-N KNOCKING
-N GATE1
-N GATE2
-N GATE3
-N PASSED

# Accepter toutes les connexions de la machine locale pour permettre aux services de communiquer entre eux.
-A INPUT -i lo -j ACCEPT

# Fermer tous les ports entrants avec IPtables revient a fermer le port SSH et donc notre accès administrateur actuel.
# Il faut impérativement autoriser les connexions déjà établies avant de fermer les ports !
# Autoriser RELATED sans restriction est une mauvaise habitude de nombreuses documentations en ligne et la source de problèmes de sécurité importants
# Depuis la version 4.7 du kernel les helpers ne sont plus activés par défaut pour éviter ce problème.
# -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# Permettre à une connexion ouverte de recevoir du trafic en entrée.
-A INPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT
# Il est préférable de laisser RELATED autorisé pour l'ICMP.
-A INPUT -p icmp -m conntrack --ctstate RELATED -j ACCEPT

# Permettre à une connexion ouverte d'émettre du trafic en sortie.
# -A OUTPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -m conntrack ! --ctstate INVALID -j ACCEPT

# On transfère tout le trafic qui n'a pas été traité dans les règles ci-dessus vers la chaîne KNOCKING pour réaliser la logique de cognement.
# Inutile d'interdire le port de SSH depuis Iptables directement. Les règles suivantes vont gérer l'autorisation ou le refus de connexion au port de SSH.
-A INPUT -j KNOCKING

# Configurer la première porte GATE1
-A GATE1 -p tcp --dport 1111 -m recent --name AUTH1 --set -j DROP
-A GATE1 -j DROP

# Configurer la deuxième porte GATE2
-A GATE2 -m recent --name AUTH1 --remove
-A GATE2 -p tcp --dport 2222 -m recent --name AUTH2 --set -j DROP
-A GATE2 -j GATE1

# Configurer la troisième porte GATE3
-A GATE3 -m recent --name AUTH2 --remove
-A GATE3 -p tcp --dport 3333 -m recent --name AUTH3 --set -j DROP
-A GATE3 -j GATE1

# Configurer la chaîne PASSED
-A PASSED -m recent --name AUTH3 --remove
-A PASSED -p tcp --dport 22 -j ACCEPT
-A PASSED -j GATE1

# Configurer la chaîne KNOCKING
-A KNOCKING -m recent --rcheck --seconds 30 --name AUTH3 -j PASSED
-A KNOCKING -m recent --rcheck --seconds 10 --name AUTH2 -j GATE3
-A KNOCKING -m recent --rcheck --seconds 10 --name AUTH1 -j GATE2
-A KNOCKING -j GATE1

# Fin de la règle pour le Port Knocking.
COMMIT
# Importer le script dans Iptables.
# sudo iptables-restore < iptables-firewall-port-knocking.rules
# Vérifier que les règles aient bien été ajoutées dans la table *filter :
# sudo iptables -t filter -L

Règle personnalisée pour configurer Iptables filter avec le Port Knocking

# Créer le fichier iptables-firewall-filter.rules et ajouter les règles suivantes.
# sudo nano iptables-firewall-filter.rules

####
# Début de la règle iptables *filter.
####
# Récapitulatif d'après le tutoriel : https://wiki.visionduweb.fr/index.php?title=Port_Knocking
*filter

# Créer trois chaînes pour la journalisation :
-N LOG_ACCEPT
-A LOG_ACCEPT -j LOG --log-prefix "INPUT:ACCEPT:" --log-level 2
-A LOG_ACCEPT -j ACCEPT
-N LOG_REJECT
-A LOG_REJECT -j LOG --log-prefix "INPUT:REJECT: " --log-level 4
-A LOG_REJECT -j REJECT
-N LOG_DROP
-A LOG_DROP -j LOG --log-prefix "INPUT:DROP: " --log-level 4
-A LOG_DROP -j DROP
# Effectuer toutes les actions en une seule fois en passant (-j) à vos chaînes personnalisées au lieu des valeurs par défaut LOG / ACCEPT / REJECT / DROP.
# iptables -A <your_chain_here> <your_conditions_here> -j LOG_ACCEPT
# iptables -A <your_chain_here> <your_conditions_here> -j LOG_REJECT
# iptables -A <your_chain_here> <your_conditions_here> -j LOG_DROP

####
# Liste blanche
####
# Les protections "flood" pourraient entraîner un ban de l'adresse IP via fail2ban.
# Ajouter son adresse IP en liste blanche. Je test le script avant de passer en liste blanche.
# -A INPUT -s Addresse-IP-en-liste-blanche -j ACCEPT

####
# Pas de filtrage sur l'interface de loopback.
####
# Le serveur ne doit pas avoir de soucis à communiquer avec lui-même au niveau des services internes.
# Accepter toutes les connexions de la machine locale pour permettre aux services de communiquer entre eux.
# Tout paquet envoyé sur l'interface de loopback passe successivement par les chaînes OUTPUT, POSTROUTING, PREROUTING et INPUT et doit être accepté dans toutes pour arriver à destination.
-A OUTPUT -o lo -j ACCEPT
-A INPUT -i lo -j ACCEPT

####
# Ne pas couper la connexion actuelle qui est utilisée pour configurer le serveur.
####
# Fermer tous les ports entrants avec IPtables revient a fermer le port SSH et notre accès administrateur actuel !
# Il faut impérativement autoriser les connexions déjà établies avant de fermer les ports !
# Autoriser RELATED sans restriction est une mauvaise habitude de nombreuses documentations en ligne et la source de problèmes de sécurité importants
# Depuis la version 4.7 du kernel les helpers ne sont plus activés par défaut pour éviter ce problème.
# -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# Permettre à une connexion ouverte de recevoir du trafic en entrée.
-A INPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT
# Il est préférable de laisser RELATED autorisé pour l'ICMP.
-A INPUT -p icmp -m conntrack --ctstate RELATED -j ACCEPT

# Permettre à une connexion ouverte d'émettre du trafic en sortie.
# -A OUTPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -m conntrack ! --ctstate INVALID -j ACCEPT 

####
# Bloquer tous les ports par défaut pour toutes les connexions entrantes et sortantes.
####
# Les connexions entrantes seront bloquées par défaut.
-P INPUT DROP
# Les connexions destinées à être forwardées seront bloquées par défaut.
-P FORWARD DROP
# Les connexions sortantes seront bloquées par défaut.
-P OUTPUT DROP
# REJECT les paquets est plus propre mais DROP est plus sécurisé !
# Avec DROP, un paquet non solicité qui n'est pas accepté est effacé. Le client attendra de son côté une réponse en vain jusqu'au timeout.
# Avec REJECT, un paquet non solicité qui n'est pas accepté va être suivi d'un message d'erreur pour le client.
# En cas d'envoi de paquets à répétition sur un mauvais port, le serveur ne traitera pas les requêtes avec DROP, alors qu'avec REJECT le serveur prendra le temps de répondre.

####
# Autoriser le port SSH par défaut.
####
# Cette règle est à conserver sauf en cas de configuration du Port Knocking.
###-A INPUT -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
###-A OUTPUT -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
# Autoriser SSH entrant uniquement à partir d'un réseau spécifique, par exemple, 192.168.100.x.
### -A INPUT -p tcp -s 192.168.100.0/24 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
### -A OUTPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
### -A OUTPUT -p tcp -d 192.168.100.0/24 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

####
# Début du Port Knocking
####
# Créer les chaînes qui seront utilisées lors de la demande de connexion par frappe de ports.
# Ajouter alors l'ensemble des règles qui doivent s'appliquer.
-N KNOCKING
-N GATE1
-N GATE2
-N GATE3
-N PASSED

####
# DROP les paquets entrants contenant des fragments.
####
# Une attaque par fragments aboutit à la panique des serveurs Linux causant une perte de données.
-A INPUT -f -j LOG_DROP

####
# DROP les connexions dans un état invalide et empêche les paquets ACK d’établir des connexions au serveur.
####
-A INPUT -m state --state INVALID -j LOG_DROP

####
# Autoriser uniquement les paquets TCP SYN.
####
# DROP les connexions TCP entrantes qui ne sont pas des paquets SYN.
-A INPUT -p tcp ! --syn -m state --state NEW -j LOG_DROP
# Faire suivre à SYNPROXY les paquets TCP à destination des ports 22,80 ou 443 avec le flag SYN non suivi (UNTRACKED ou INVALID).
# SYNPROXY répond le SYN-ACK à l'émeteur du SYN et crée une connexion à l'état ESTABLISHED dans conntrack seulement si l'émetteur retourne un ACK valide.
# Les paquets avec un tcp-cookie invalides sont dropés, mais pas ceux avec des flags non-standard, il faudra les filtrer par ailleurs. 
-A INPUT -p tcp -m multiport --dports 22,80,443 -m tcp -m state --state INVALID,UNTRACKED -j SYNPROXY --sack-perm --timestamp --wscale 7 --mss 1460
# La règles SYNPROXY doit être suivi de celle-ci pour rejeter les paquets restant en état INVALID.
-A INPUT -p tcp -m multiport --dports 22,80,443 -m tcp -m state --state INVALID -j LOG_DROP

####
# Autoriser les services web.
####
# Autoriser les connexions DNS.
-A INPUT -p tcp --dport 53 -j ACCEPT
-A OUTPUT -p tcp --dport 53 -j ACCEPT
# Cette règle est une faille de sécurité en plus d'être inutile.
# -A INPUT -p udp --sport 53 -j ACCEPT
-A OUTPUT -p udp --dport 53 -j ACCEPT
#
# Autoriser les connexions au serveur FTP sur le port 21.
# Une connexion FTP passive est recommandée ! Depuis le client FileZilla Edition/Paramètres/Connexion/FTP/ décocher :
# Autoriser un retour sur un autre mode de transfert en cas d'échec
-A INPUT -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
# Configurer Iptables pour utiliser la plage de ports passifs proposés par IANA entre 49152-65534.
# La récupération au dossier racine ne se fait pas, depuis FileZilla, si la plage de port suivante n'est pas autorisée.
-A INPUT -p tcp --dport 49152:65534 -m state --state ESTABLISHED,NEW -j ACCEPT
# Ajout de RELATED et helper. Appliqué en complément de la connexion FTP ? Revérifier la syntaxe et l'utilité des deux lignes suivantes.
-A OUTPUT -m conntrack --ctstate RELATED -m helper --helper ftp -p tcp --dport 49152:65534 -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED -m helper --helper ftp -p tcp --dport 49152:65534 -j ACCEPT
#
##### La connexion sFTP n'est pas configurée actuellement. A faire !
#
# Autoriser les connexions un serveur de mail SMTP, POP3, IMAP.
# Combiner plusieurs ports dans la même règle avec multiport.
# Mail SMTP:25
# Mail POP3:110
# Mail IMAP:143
# Mail IMAP:993
# Mail POP3S:995
-A INPUT -p tcp -m multiport --dports 25,110,143,993,995 -m state --state NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -p tcp -m multiport --dports 25,110,143,993,995 -m state --state ESTABLISHED -j LOG_ACCEPT
#
# Autoriser les connexions au serveur web Apache2.
-A INPUT -p tcp --dport 80 -j ACCEPT
-A OUTPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT
-A OUTPUT -p tcp --dport 443 -j ACCEPT

# Si la synchronisation avec DropBox est installée :
# DropBox utilise le port 17500 TCP et UDP pour la synchronisation réseau par défaut.
# Il utilise également les ports TCP 17600 et TCP 17603 pour le bouton Web «Ouvrir».
# Il semblerait qu'il soit inutile d'ouvrir les ports, puisque le serveur va effectuer sa demande de connexion vers l'extérieur. La connexion devrait alors s'établir.
-A INPUT -p tcp --dport 17500 -j ACCEPT
-A INPUT -p udp --dport 17500 -j ACCEPT
-A INPUT -p tcp --dport 17600 -j ACCEPT
-A INPUT -p tcp --dport 17603 -j ACCEPT

####
# Il faut remonter les restrictions du serveur avant l'ouverture des services ?
# Optimiser le serveur.
####
########
# Blacklister le scann de ports.
########
# Un attaquant qui cherche à découvrir les services ouverts sur votre serveur va tenter d'établir une connexion TCP sur tous les ports.
# Il attendra la réponse du serveur pour détecter les ports ouverts.
# Une première technique consiste à limiter le nombre de paquets typique d'un scan.
# A faire : http://blog.sevagas.com/?Iptables-firewall-versus-nmap-and,31
# On peut également DROP les paquets indésirables avec les règles mangle.
# Les règles présentes dans mangle forcent l'attaquant à faire un 3WHS dans les règles pour voir ce qui se passe la ou c’est ouvert.
# La policy DROP en INPUT jettera tout le reste.
# On peut alors utiliser par exemple un mécanisme de ports piégés qui ne sont pas utilisés sur la machine.
# On blackliste un certain temps les machines qui vont tenter de se connecter aux ports piégés.
-A INPUT -m recent --rcheck --seconds 86400 --name portscan --mask 255.255.255.255 --rsource -j LOG_DROP
-A INPUT -m recent --remove --name portscan --mask 255.255.255.255 --rsource
-A INPUT -p tcp -m multiport --dports 445,1433,3389,10000 -m recent --set --name portscan --mask 255.255.255.255 --rsource -j LOG_DROP
# ATTENTION !
# Un attaquant qui s'en rendrait compte pourrait forger des paquets TCP vers un de ces ports mais avec de fausses adresses IP.
# Le projet Scapy permet de forger des paquets TCP : https://scapy.net
# Le serveur se mettrait à blacklister tout internet pour 24h si l'attaquant décidait de parcourir la plage IPv4 complète.
# Cette règle fonctionne bien sur un petit serveur mais il n'est pas conseillé de la mettre en production pour une grande entreprise.

########
# Limiter le nombre de connexions simultanées établies à partir d'une adresse IP unique sur un port donné.
########
# Le service Apache2 a été autorisé avant, donc, cette règle ne s'applique plus.
# Il faudrait la remonter avant la règle qui autorise Apache2.
-A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 4 -j LOG_REJECT
-A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 4 -j LOG_REJECT
-A INPUT -p tcp --syn --dport 443 -m connlimit --connlimit-above 15 -j LOG_REJECT

########
# Faire face au flood.
########
-A FORWARD -p tcp --syn -m limit --limit 1/second -j ACCEPT
-A FORWARD -p udp -m limit --limit 1/second -j ACCEPT
-A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/second -j ACCEPT

# Limiter à 3 demandes de connexion par seconde pour une IP sur le protocole SSH.
-A INPUT -p tcp --syn --dport ssh -m connlimit --connlimit-above 3 -j LOG_DROP
# Autoriser uniquement 3 connexions en SSH sur un intervalle de 60 secondes (1 minute).
-A INPUT -p tcp --dport ssh -m state --state NEW -m recent --update --seconds 60 --hitcount 10 -j LOG_DROP

# Prévenir les attaques de Deni de Service (DoS).
# Limiter le nombre de connexions entrantes par minute sur le port 80 et 443 à 75 et définir une rafale limite de 120.
# La limite / minute sera appliquée lorsque le nombre total de connexions aura atteint le niveau limite de rafale.
-A INPUT -p tcp --dport 80 -m limit --limit 75/minute --limit-burst 120 -j ACCEPT
-A INPUT -p tcp --dport 443 -m limit --limit 75/minute --limit-burst 120 -j ACCEPT

########
# Bloquer ICMP pour interdire les réponses du serveur suite à une requête PING.
########
# Déjà bloqué par défaut du fait de la politique de DROP au début.
# -A INPUT -p icmp --icmp-type echo-request -j DROP
# -A OUTPUT -p icmp --icmp-type echo-reply -j DROP
# Autoriser le serveur a lancer une requête PING de l'intérieur vers un serveur externe :
-A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
-A INPUT -p icmp --icmp-type echo-reply -j ACCEPT

# Autoriser ICMP pour OVH et le monitoring :
# Autoriser le monitoring du serveur par OVH pour avertir OVH en cas de panne.
# Adresses à autoriser d'après la documentation OVH : https://docs.ovh.com/fr/dedicated/monitoring-ip-ovh/
# Mise en application : https://community.centminmod.com/threads/ovh-icmp-ping-whitelist-for-csf-firewall.11427/
# Autoriser les adresses suivantes de OVH a PING :
# ping.ovh.net, proxy.p19.ovh.net, proxy.rbx.ovh.net, proxy.ovh.net, proxy-rbx2.ovh.net, proxy.sbg.ovh.net, proxy.bhs.ovh.net
#
# Il est conseillé de laisser cache.ovh.net pour permettre à OVH d'intervenir sur le serveur.
# Si vous fermez le port 22 pour les techniciens ils ne pourront pas intervenir.
-A INPUT -p tcp --dport 22 --source cache.ovh.net -j ACCEPT
-A INPUT -p icmp --source proxy.ovh.net -j ACCEPT
-A INPUT -p icmp --source proxy.p19.ovh.net -j ACCEPT
-A INPUT -p icmp --source proxy.rbx.ovh.net -j ACCEPT
-A INPUT -p icmp --source proxy.sbg.ovh.net -j ACCEPT
-A INPUT -p icmp --source proxy.bhs.ovh.net -j ACCEPT
-A INPUT -p icmp --source ping.ovh.net -j ACCEPT
# Start Monitoring
-A INPUT -p icmp --source 151.80.231.244 -j ACCEPT
-A INPUT -p icmp --source 151.80.231.245 -j ACCEPT
-A INPUT -p icmp --source 151.80.231.246 -j ACCEPT
-A INPUT -p icmp --source 151.80.231.247 -j ACCEPT
-A INPUT -p icmp --source 37.187.231.251 -j ACCEPT
# End Monitoring
-A INPUT -p icmp --source a2.ovh.net -j ACCEPT
-A INPUT -p icmp --source 92.222.184.0/24 -j ACCEPT
-A INPUT -p icmp --source 92.222.185.0/24 -j ACCEPT
-A INPUT -p icmp --source 92.222.186.0/24 -j ACCEPT
-A INPUT -p icmp --source 167.114.37.0/24 -j ACCEPT
-A INPUT -p tcp --source 192.168.0.0/16 -j ACCEPT
-A INPUT -p udp --source 192.168.0.0/16 -j ACCEPT
#
# L'adresse IP de votre serveur, 139.99.173.195 pour visionduweb, doit laisser passer :
# 139.99.173.249 si vous êtes sur un serveur HG.                    
# 139.99.173.250 pour le serveur SLA.
# 139.99.173.251 pour le serveur MRTG pour pouvoir bénéficier de RTM.
#
# Uniquement pour un serveur HG :
# -A INPUT -p icmp --source 139.99.173.249 -j ACCEPT
# -A OUTPUT -p udp --dport 6100:6200 -j ACCEPT # OVH RTM
#
# Serveur SLA et MRTG :
-A INPUT -p icmp --source 139.99.173.250 -j ACCEPT
-A INPUT -p icmp --source 139.99.173.251 -j ACCEPT
#
# A suivre !
# Vérifier les paquets ICMP bloqués depuis le fichier de journalisation /var/log/messages :
# grep -i 'ICMP_IN Blocked' /var/log/messages| tail -5| awk '{print $1,$2,$3,$5,$6,$7,$8,$9,$12,$13,$19,$20}'; date
# Vérifier les informations des adresses IP bloquées pour s'assurer que ce n'est pas un service de OVH :
# Utiliser par exemple la lacommande suivante :
# curl ipinfo.io/92.222.185.1

# La politique par défaut étant à DROP, les règles suivantes sont t'elles réellement nécessaires ?
# DROP des paquets XMAS :
-A INPUT -p tcp --tcp-flags FIN,URG,PSH FIN,URG,PSH -j LOG_DROP
-A INPUT -p tcp --tcp-flags ALL ALL -j LOG_DROP
# DROP des paquets NULL :
-A INPUT -p tcp --tcp-flags ALL NONE -j LOG_DROP
-A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j LOG_DROP
# DROP silencieusement les paquets broadcastés.
-A INPUT -m pkttype --pkt-type broadcast -j LOG_DROP

####
# Transfèrer le trafic non traité précédemment vers la chaîne KNOCKING pour réaliser la logique de frappe de ports.
####
# Les règles suivantes vont gérer l'autorisation ou le refus de connexion au port de SSH.
-A INPUT -j KNOCKING

# Configurer la première porte GATE1
-A GATE1 -p tcp --dport 1111 -m recent --name AUTH1 --set -j LOG_DROP
-A GATE1 -j LOG_DROP

# Configurer la deuxième porte GATE2
-A GATE2 -m recent --name AUTH1 --remove
-A GATE2 -p tcp --dport 2222 -m recent --name AUTH2 --set -j LOG_DROP
-A GATE2 -j GATE1 

# Configurer la troisième porte GATE3
-A GATE3 -m recent --name AUTH2 --remove
-A GATE3 -p tcp --dport 3333 -m recent --name AUTH3 --set -j LOG_DROP
-A GATE3 -j GATE1  

# Configurer la chaîne PASSED
-A PASSED -m recent --name AUTH3 --remove
-A PASSED -p tcp --dport 22 -j ACCEPT
-A PASSED -j GATE1

# Configurer la chaîne KNOCKING
-A KNOCKING -m recent --rcheck --seconds 30 --name AUTH3 -j PASSED
-A KNOCKING -m recent --rcheck --seconds 10 --name AUTH2 -j GATE3
-A KNOCKING -m recent --rcheck --seconds 10 --name AUTH1 -j GATE2
-A KNOCKING -j GATE1
####
# Fin de la règle pour le Port Knocking.
####

####
# Fin de la règle *filter
####
COMMIT
# Importer le script dans Iptables.
# sudo iptables-restore < iptables-firewall-filter.rules
# Vérifier que les règles aient bien été ajoutées dans la table *filter :
# sudo iptables -t filter -L

Autres configurations

# Les configurations suivantes n'ont pas été intégrées par défaut dans mon script.
# Il faut faire des recherches complémentaires pour voir comment les intégrer en fonction des besoins.

Partage de connexion

# Décommenter la ligne suivante pour que le système fasse office de
# "serveur NAT" et remplaçez "eth0" par le nom de l'interface connectée à Internet.
# -t nat -A POSTROUTING -o eth0 -j MASQUERADE

# Si la connexion que vous partagez est une connexion ADSL, vous
# serez probablement confronté au fameux problème du MTU. En résumé,
# le problème vient du fait que le MTU de la liaison entre votre
# fournisseur d'accès et le serveur NAT est un petit peu inférieur au
# MTU de la liaison Ethernet qui relie le serveur NAT aux machines qui
# sont derrière le NAT. Pour résoudre ce problème, décommentez la ligne
# suivante et remplaçez "eth0" par le nom de l'interface connectée à Internet.
# -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS -o eth0 --clamp-mss-to-pmtu
# Allow Internal Network to External network.
# On the firewall server where one ethernet card is connected to the external,
# and another ethernet card connected to the internal servers,
# use the following rules to allow internal network talk to external network.
#
# In this example, eth1 is connected to external network (internet),
# and eth0 is connected to internal network (For example: 192.168.1.x).
# -A FORWARD -i eth0 -o eth1 -j ACCEPT
# Si ce serveur fait routeur et est passerelle pour le réseau,
# alors les machines du lan continueront à accéder à Internet
# et/ou à tout autre réseau derrière cette passerelle,
# lorsque les règles du pare-feu sont désactivées.
-t nat -A POSTROUTING -j MASQUERADE

Port forwarding

# Exemples de règles de redirection de ports (Port forwarding).
# Les requêtes TCP reçues sur le port 80 de l'interface eth0 sont forwardées à la machine dont l'adresse IP est 192.168.0.3 sur son port 80.
# La réponse à la requête sera forwardée au client.
# -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.3:80
# Acheminer tout le trafic arrivant sur les ports 442 à 22. Cela signifie que la connexion SSH entrante peut provenir des ports 22 et 422.
# -t nat -A PREROUTING -p tcp -d 192.168.102.37 --dport 422 -j DNAT --to 192.168.102.37:22
# Si vous procédez comme indiqué, vous devez également autoriser explicitement la connexion entrante sur le port 422.
# -A INPUT -i eth0 -p tcp --dport 422 -m state --state NEW,ESTABLISHED -j ACCEPT
# -A OUTPUT -o eth0 -p tcp --sport 422 -m state --state ESTABLISHED -j ACCEPT

Autres services pouvant être autorisés

# Si NIS est utilisé pour gérer les comptes utilisateurs, authoriser les connexions NIS.
# If you don’t allow the NIS related ypbind connections, users will not be able to login.
# The NIS ports are dynamic. When the ypbind starts it allocates the ports.
# First do a rpcinfo -p as shown below and get the port numbers. In this example, it was using port 853 and 850.
# rpcinfo -p | grep ypbind
# Now allow incoming connection to the port 111, and the ports that were used by ypbind.
# -A INPUT -p tcp --dport 111 -j ACCEPT
# -A INPUT -p udp --dport 111 -j ACCEPT
# -A INPUT -p tcp --dport 853 -j ACCEPT
# -A INPUT -p udp --dport 853 -j ACCEPT
# -A INPUT -p tcp --dport 850 -j ACCEPT
# -A INPUT -p udp --dport 850 -j ACCEPT
#
# Si un serveur Samba est installé :
# Vérifier si il faut une règle INPUT et vérifier la règle OUTPUT :
# -A OUTPUT -p udp -m udp --dport 137 -j CT --helper netbios-ns
#
# Permettre la connexion au serveur par XDMCP :
# -A INPUT -p udp --dport 177 -j ACCEPT
# Permettre à la machine client de se connecter par XDMCP à une machine distante :
# -A INPUT -p tcp --dport 6001 -j ACCEPT
#
# Si un serveur CUPS éventuel doit être joignable de l'extérieur :
# -A INPUT -p udp -m udp --dport 631 -j ACCEPT
#
# Décommenter les lignes suivantes pour autoriser rsync depuis un réseau spécifique :
# -A INPUT -p tcp -s 192.168.101.0/24 --dport 873 -m state --state NEW,ESTABLISHED -j ACCEPT
# -A OUTPUT -p tcp --sport 873 -m state --state ESTABLISHED -j ACCEPT
#
# Décommenter les lignes suivantes si OpenVPN Server est installé et tourne sur le port 913 en UDP :
# -A INPUT -p udp --dport 913 -j ACCEPT
#
# Si un serveur webmin est installé, il fonctionne en localhost, on y accède en export display, inutile de l'ouvrir :
# -A INPUT -p tcp --dport 1000 -j ACCEPT
# -A OUTPUT -p tcp --dport 1000 -j ACCEPT
#
# Décommenter la ligne suivante pour pouvoir reçevoir des flux UDP VideoLAN.
# -A INPUT -p udp --dport 1234 -j ACCEPT
#
# Si l'outil de monitoring Monit est utilisé, privilégier le transfert de port depuis la configuration de Monit vers le port proxy 8080 pour ne pas avoir à ouvrir le port 1337.
# Autoriser le port 1337. Le port dépend de la configuration de Monit. Il fonctionne en localhost
# -A INPUT -p tcp --dport 1337 -j ACCEPT
#
# Décommenter les 3 lignes suivantes pour pouvoir utiliser GnomeMeeting :
# -A INPUT -p tcp --dport 1720 -j ACCEPT
# -A INPUT -p tcp --dport 30000:33000 -j ACCEPT
# -A INPUT -p udp --dport 5000:5006 -j ACCEPT
#
# Rendre le serveur CVS joignable depuis l'extérieur via "pserver".
# Si les utilisateurs accèdent au serveur CVS exclusivement via SSH,
# seule la ligne concernant le serveur SSH doit être décommentée.
# -A INPUT -p tcp --dport 2401 -j ACCEPT
#
# Si un serveur de base de données MariaDB est installé, autoriser le trafic loopback en interne pour localhost.
# Ne pas ouvrir le port 3306 sauf pour faire communiquer des serveurs en interne.
# -A INPUT -p tcp --dport 3306 -j ACCEPT
# -A OUTPUT -p tcp --dport 3306 -j ACCEPT
# Autoriser la connexion MySQL uniquement à partir d'un réseau spécifique :
# -A INPUT -p tcp -s 192.168.100.0/24 --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
# -A OUTPUT -p tcp --sport 3306 -m state --state ESTABLISHED -j ACCEPT
#
# Si le serveur de partage d'écran Teamviewer est installé :
# C'est le port 5938 TCP et UDP qui sera utilisé, puis, le port 443 ou 80 en dernier recours.
# Il semblerait qu'il soit inutile d'ouvrir les ports, puisque le serveur va effectuer sa demande de connexion vers l'extérieur. La connexion devrait alors s'établir.
# Préférer Anydesk et identifier les ports pour anydesk.
# -A INPUT -p tcp --dport 5938 -j ACCEPT
# -A INPUT -p udp --dport 5938 -j ACCEPT
#
# Si SickRage est installé, autoriser le trafic en interne pour localhost, ce qui a été fait plus haut. Ne pas ouvrir le port 8081. Je n'utilise pas SickRage, tester en situation :
# -A INPUT -p tcp --dport 8081 -j ACCEPT
#
# DROP le Multicast :
# On DROP par défaut et ensuite on accepte ce qui es nécessaire.
# On ne s'occupe pas du multicast sauf si on souhaite l'ouvrir.
# Ce système est plus efficace que l'unicast pour diffuser des contenus simultanément vers une large audience. (Audio, Vidéo.)
# -A INPUT -m pkttype --pkt-type multicast -j ACCEPT
# -A FORWARD -m pkttype --pkt-type multicast -j ACCEPT
# -A OUTPUT -m pkttype --pkt-type multicast -j ACCEPT
# L'IGMP est un protocole utilisé par TCP/IP pour la multidiffusion dynamique, le multicast.
# L'IGMP permet à une machine de s'abonner à un flux multicast routé. Si pas de multicast, pas besoin d'IGMP 
# -A INPUT -p igmp -j ACCEPT
# -A FORWARD -p igmp -j ACCEPT
# -A OUTPUT -p igmp -j ACCEPT
# Reçevoir des annonces SAP de session multicast :
# L'adresse IP doit sûrement être celle de votre serveur finissant par 254.
# Si je ne configure rien, les dernières lignes du script Iptables devraient rejeter ce genre de requêtes.
# -A INPUT -p udp -d 224.2.127.254 --dport 9875 -j ACCEPT

Lister les "Invalid User" suite à une identification par clé publique erronée

# Bloquer les adresses qui tentent de Brute Force SSHD.
# Voir plus bas : Bloquer plusieurs adresses IP dans un fichier de liste noire.

Exemples de règles Iptables

Ajouter son adresse IP et PTR en liste blanche

# Pour ne pas se retrouver bloqué par le serveur, ajouter son adresse en liste blanche.
# Autoriser une adresse IP spécifique n'est pas adapté en cas d'adressage IP dynamique.
# Ajouter une adresse IP en liste blanche :
-A INPUT -s Addresse-IP-En-Liste-Blanche -j ACCEPT
# Connaître son adresse PTR à l'aide de son adresse IP :
http://monip.fr/xx.xx.xxx.xx
# Ajouter une adresse PTR en liste blanche :
-A INPUT -s laubervilliers-xxx-x-xx-xx.wyy-yy.le.serveur.ext -j ACCEPT

Bloquer une adresse IP avec Iptables

Bloquer une adresse IP

# Bloquer directement une adresse IP avec Iptables.
sudo iptables -A INPUT -s 11.22.33.44 -j DROP
# Lister les adresses IP bannies.
sudo iptables -L INPUT -v -n | grep DROP
# Les adresses IP bannies sont classées dans un ordre numéroté, ligne par ligne.
# Pour supprimer une règle, indiquer le numéro de la ligne de la règle à supprimer.
sudo iptables -D INPUT numero-de-la-regle
sudo iptables -D INPUT 7
# La règle peut également être supprimée si elle est saisie entièrement :
sudo iptables -D "La totalité de la règle"

Vérifier si une adresse IP est bloquée par Iptables

# Vérifier si une adresse IP est bloquée par Iptables :
sudo iptables -S | grep 'Mon IP'

Débloquer une adresse IP

# Débloquer une adresse IP depuis Iptables :
sudo iptables -D INPUT -s 'Mon IP'/32 -j DROP
# Débloquer une adresse IP bloquée par Fail2ban depuis Iptables :
# La règle ajoutée par Fail2ban pour bloquer un accès à l'administration de Joomla :
# -A f2b-joomla-auth -s 'Mon IP'/32 -j REJECT --reject-with icmp-port-unreachable
# La règle pour retirer cette précédente règle de blocage :
sudo iptables -D f2b-joomla-auth -s 'Mon IP'/32 -j REJECT --reject-with icmp-port-unreachable

# Pour connaître les noms des règles de blocage de Fail2ban ainsi que leurs actions :
ls
/etc/fail2ban/jail.d

Bloquer plusieurs adresses IP dans un fichier de liste noire

# Lister les "Invalid User" suite à une identification par clé publique erronée, quand la passe phrase est mal renseignée.
# ATTENTION ! Mon adresse IP peut se retrouver dans les réponses !
# Placer toute la liste directement dans Iptables et dans hosts.deny :
# for i in $(journalctl --since "7 days ago" --until "1 minutes ago" |grep sshd |grep "Invalid user" |awk '{print $10}' |sort -u |xargs ) ;do iptables -t filter -I INPUT -p tcp --dport ssh -s "$i" -j DROP echo -e "sshd: $i" >>/etc/hosts.deny  ;done
# Cette solution est très efficace mais pas forcément pratique à gérer pour un débutant si l'on souhaite garder une bonne compréhension de ce qui a été bloqué, quand, et pourquoi.
# Ajouter les adresses IP retournées par le script dans le fichier ploutos.ips qui va être utilisé pour bloquer les adresses IP. :
sudo journalctl --since "7 days ago" --until "1 minutes ago" |grep sshd |grep "Invalid user" |awk '{print $10}' |sort -u |xargs > /$HOME/ploutos.ips
# Vérifier si son adresse IP est présente dans la liste des adresses nuisibles :
# nano ploutos.ips
# CTRL w pour rechercher son adresse IP personnelle pour vérifier si elle est présente.
# Consulter les résultats de la requête :
# La requête affiche de nombreuses adresses IP qui tentent de se connecter automatiquement au serveur.
journalctl --since "7 days ago" --until "1 minutes ago" |grep sshd |grep "Invalid user" |awk '{print $10}' |sort -u |xargs
101.207.113.73 101.255.52.171 101.89.92.180 101.96.113.54 103.111.86.242 103.16.202.174 103.202.132.175 103.207.2.204 103.242.13.70 103.253.112.18 103.36.30.154 103.50.254.211 103.52.16.35 103.65.195.107 103.91.54.100 104.211.214.36 104.236.125.73 104.236.142.89 104.236.42.113 104.248.136.207 104.248.156.114 104.248.175.98 104.248.18.26 104.250.105.214 104.7.206.3 106.12.100.179 106.12.10.119 106.12.127.211 106.12.128.24 106.12.14.189 106.12.192.131 106.12.196.28 106.12.196.48 106.12.202.180 106.12.205.132 106.12.211.134 106.12.216.170 106.13.45.241 106.13.54.79 106.13.76.209 106.51.127.214 106.51.66.214 107.170.63.221 108.255.193.163 109.161.57.125 109.205.116.237 109.237.111.51 110.185.184.149 110.35.173.104 110.36.217.42 110.45.158.88 111.125.67.180 111.172.101.209 111.177.18.202 111.230.209.21 111.231.142.17 111.231.54.248 113.108.96.203 113.141.70.199 113.204.194.84 114.118.91.64 114.242.34.93 114.251.196.3 114.67.22.130 114.94.48.61 115.132.113.151 115.159.111.193 115.159.114.249 115.159.201.60 115.159.30.108 115.248.178.245 115.47.146.216 115.68.74.184 115.79.38.170 115.88.201.58 116.203.127.113 116.90.81.14 117.0.35.153 117.102.68.188 117.135.113.30 117.146.60.115 117.239.236.162 117.247.186.101 117.50.34.236 118.126.108.129 118.163.149.163 118.24.101.182 118.24.108.205 118.24.121.65 118.24.122.36 118.24.125.75 118.24.151.195 118.24.153.230 118.24.173.104 118.24.33.65 118.25.3.34 118.25.96.30 118.36.108.202 118.89.60.84 118.97.188.105 119.27.170.144 119.29.151.104 119.29.152.124 119.29.186.101 119.29.247.225 119.29.87.153 119.29.98.253 121.12.151.250 121.166.254.65 121.176.5.221 121.227.153.126 1.214.89.168 122.114.15.40 122.114.158.196 122.114.234.37 122.152.202.144 122.152.221.72 122.152.227.201 122.152.50.6 122.199.152.114 122.42.151.245 1.22.91.179 123.125.196.210 123.206.219.211 123.206.81.59 123.207.86.118 123.59.142.109 123.59.63.140 124.173.71.245 124.204.41.17 124.43.17.69 125.19.153.156 125.74.53.229 125.99.46.46 128.199.67.84 128.77.28.199 129.150.86.200 129.158.74.141 129.204.209.240 129.213.63.120 132.232.104.39 132.232.54.102 132.248.181.75 1.32.50.44 134.175.120.102 134.175.28.156 137.116.202.126 137.135.95.64 137.74.176.208 137.74.233.229 138.197.162.28 138.197.166.233 138.68.52.165 139.198.123.39 139.199.155.62 139.199.166.104 13.92.139.189 139.217.224.144 139.59.181.7 139.59.3.151 139.59.74.157 139.59.77.167 139.59.96.172 140.143.228.75 14.116.251.199 14.116.254.127 142.44.211.229 142.44.216.180 14.29.116.243 142.93.122.3 142.93.160.178 142.93.164.215 142.93.218.84 142.93.245.81 142.93.253.120 142.93.31.198 142.93.47.125 14.41.77.225 144.217.165.224 145.239.6.160 145.239.91.88 146.185.149.245 148.255.137.104 148.70.11.98 148.70.23.121 148.70.77.22 148.72.65.10 149.202.51.131 149.202.65.173 149.56.129.68 150.107.148.155 151.80.140.166 151.80.144.255 151.80.61.93 153.37.97.183 154.120.242.70 154.124.83.92 155.94.146.111 158.69.124.9 159.203.101.80 159.65.111.89 159.65.135.55 159.65.142.100 159.65.155.215 159.65.242.16 159.89.197.135 159.89.199.216 159.89.205.213 159.89.54.241 162.241.183.17 162.243.10.64 164.132.114.155 165.227.11.173 165.227.165.98 165.227.171.60 165.227.25.45 166.111.7.104 167.99.152.180 167.99.4.112 170.210.68.163 1.71.129.108 172.254.107.118 172.81.238.222 173.183.120.250 173.23.187.5 173.249.0.119 174.61.104.176 175.25.50.3 176.106.65.238 176.140.169.6 176.140.81.35 176.32.35.55 176.58.134.244 177.1.103.140 177.135.100.210 177.191.249.167 177.221.167.35 177.47.115.67 177.73.140.62 177.98.185.3 178.128.158.153 178.128.195.6 178.128.217.40 178.128.218.255 178.128.242.233 178.128.62.134 178.128.76.6 178.128.86.127 178.33.233.54 178.62.204.176 178.62.239.228 178.89.186.226 179.185.79.83 179.33.137.117 180.124.50.119 180.165.38.137 180.167.112.162 180.76.108.110 180.76.134.150 180.76.238.70 180.76.54.167 181.166.64.141 181.28.191.54 181.31.155.191 181.49.219.114 181.52.249.26 182.162.96.185 182.16.75.58 182.23.64.177 182.48.93.226 182.61.37.35 183.111.227.201 183.157.174.184 183.195.114.70 184.82.11.65 185.184.25.130 185.207.232.232 185.238.137.93 185.87.121.19 185.88.196.30 186.151.170.222 186.170.28.46 186.31.116.78 186.84.172.62 187.122.102.4 187.167.186.134 187.174.123.121 187.18.187.46 187.36.105.211 187.7.215.154 188.118.245.53 188.131.140.115 188.131.170.119 188.165.250.228 188.165.44.214 188.166.216.84 188.166.226.209 188.166.229.205 188.166.47.181 188.226.149.166 188.254.0.160 189.41.108.14 189.45.37.254 189.6.45.130 189.7.121.28 190.114.47.94 190.144.135.118 190.147.159.33 190.151.19.3 190.217.71.15 192.144.155.63 192.144.174.50 192.144.203.121 192.210.137.125 192.99.216.228 193.112.161.178 193.112.90.84 193.112.97.157 193.192.193.117 194.182.86.133 195.22.112.21 195.222.163.54 195.25.27.89 196.204.234.29 197.96.136.91 198.100.146.43 198.199.105.235 198.245.50.81 198.245.60.56 198.27.67.173 198.27.67.225 200.127.33.2 200.201.187.178 200.207.220.128 200.48.27.147 200.87.199.130 201.16.247.140 201.16.247.149 201.163.91.164 201.17.24.195 201.48.54.81 201.62.87.4 202.106.93.46 202.120.62.138 202.150.217.187 202.155.234.28 202.195.225.7 202.28.16.8 202.51.110.214 202.69.66.130 202.88.237.110 202.96.50.229 203.121.116.11 203.223.189.214 206.189.239.156 206.19.238.177 206.81.10.230 209.97.177.213 210.14.77.102 210.186.108.211 211.21.129.4 211.253.10.96 212.159.18.107 212.237.52.4 212.34.244.62 212.64.24.89 213.190.194.227 213.26.2.162 216.144.251.86 216.7.159.250 217.182.252.63 218.199.68.132 218.236.21.146 218.2.44.42 218.60.136.204 219.65.95.214 220.123.184.123 220.77.29.179 221.126.225.184 221.131.68.210 221.166.248.46 221.225.81.216 221.8.63.26 222.143.242.69 222.91.160.69 23.95.113.42 23.96.117.243 27.254.206.238 31.27.21.137 31.46.16.95 34.85.42.198 35.137.156.46 35.187.239.64 35.200.154.33 35.201.183.224 35.204.47.208 35.220.211.69 35.224.199.230 36.67.135.42 36.89.85.33 37.114.171.142 37.139.0.226 37.153.196.186 37.187.195.209 37.187.62.31 37.211.48.51 37.252.185.51 37.252.190.224 37.59.119.206 40.118.87.26 40.121.164.112 40.121.194.247 41.67.236.40 41.75.113.170 41.76.149.212 43.229.12.86 45.160.171.149 45.40.204.113 45.55.20.128 45.55.222.162 45.55.35.40 46.101.142.99 46.101.148.248 46.101.192.190 46.101.204.20 46.101.230.131 46.101.72.145 46.105.112.107 46.105.117.4 46.128.34.234 46.148.192.41 46.218.116.106 47.22.80.98 47.40.20.138 49.247.206.212 49.248.209.206 51.144.119.108 51.15.37.113 51.254.123.127 51.254.143.166 51.254.39.23 51.255.173.160 51.255.194.249 51.255.35.41 51.38.38.56 51.38.51.113 51.68.122.216 51.68.189.69 51.77.141.158 51.77.228.36 5.196.179.75 5.196.225.45 5.196.70.107 5.196.88.110 52.177.171.38 52.80.231.16 5.39.88.4 54.36.165.49 54.37.138.135 54.37.158.40 54.37.19.206 58.59.2.26 58.64.144.109 59.100.246.170 59.124.228.54 59.125.247.227 59.42.10.173 59.63.225.99 60.12.172.21 60.31.197.218 61.0.172.182 61.150.84.238 61.49.68.18 61.51.111.65 61.93.201.198 62.138.1.244 62.234.128.155 62.234.133.230 62.234.8.213 62.94.18.186 64.76.6.126 65.36.95.243 66.155.42.113 66.70.130.148 66.70.130.151 67.171.17.78 68.183.124.72 68.183.68.143 68.183.89.80 69.90.223.232 71.226.208.185 71.38.162.72 72.203.15.181 73.55.47.103 74.95.83.153 76.107.235.74 77.221.25.147 77.232.128.87 77.43.115.103 77.70.96.167 77.82.91.124 78.94.238.49 80.211.151.73 80.229.253.212 80.52.199.93 80.87.23.52 80.92.226.126 81.149.211.134 81.174.227.27 81.218.92.106 82.131.209.179 82.150.82.146 82.213.223.114 83.18.146.226 83.54.131.57 84.91.128.47 85.113.39.134 86.105.55.160 87.110.153.32 87.135.175.69 88.19.183.233 89.36.216.142 89.74.137.165 91.199.144.23 92.170.37.229 92.222.66.234 92.222.70.130 93.23.6.66 93.39.254.140 93.85.82.88 94.177.224.127 94.23.204.136 94.23.254.125 94.23.55.228 94.23.62.187 95.85.60.197 95.90.114.198
# Iptables ne garde pas les adresses IP en mémoire en cas de redémarrage.
# Créer le script qui rechargera au redémarrage du serveur les adresses IP qui ont été bannies après avoir tentées de se connecter à SSHD.
cd /etc/init.d/
sudo touch ploutos.sh
sudo chmod 0755 /etc/init.d/ploutos.sh
sudo chown root:root /etc/init.d/ploutos.sh
# Prendre en compte ce script à chaque redémarrage :
sudo update-rc.d ploutos.sh defaults
# Pour le retirer :
sudo update-rc.d -f ploutos.sh remove
# On peut également rendre ses règles persistantes sous GNU/Debian avec iptable-persistent qui va sauvegarder toute la configuration actuelle.
http://romain.therrat.fr/iptables-rendre-ses-regles-persistantes-sous-gnudebian-avec-iptable-persistent/
# Ajouter le code suivant dans le fichier /etc/init.d/ploutos.sh :
# Ce script va intégrer la liste dans Iptables qui signalera dans votre fichier de log /var/log/messages le passage des utilisateurs listés dans ploutos.ips.
# Pour ne pas suivre les logs, supprimer la ligne : $IPT -A $SPAMLIST -s $ipblock -j LOG –log-prefix « $SPAMDROPMSG »
#!/bin/bash
# Simple iptables IP/subnet block script
# -------------------------------------------------------------------------
# Copyright (c) 2004 nixCraft project
# This script is licensed under GNU GPL version 2.0 or above
# -------------------------------------------------------------------------
# This script is part of nixCraft shell script collection (NSSC)
# Visit http://bash.cyberciti.biz/ for more information.
# ----------------------------------------------------------------------
IPT=/sbin/iptables
SPAMLIST="sshdbruteforce"
SPAMDROPMSG="SSHD BRUTE FORCE"
BADIPS=$(egrep -v -e "^#|^$" /$HOME/ploutos.ips)

# Créer une nouvelle liste Iptables.
$IPT -N $SPAMLIST

for ipblock in $BADIPS
do
$IPT -A $SPAMLIST -s $ipblock -j LOG --log-prefix "$SPAMDROPMSG"
$IPT -A $SPAMLIST -s $ipblock -j DROP
done

$IPT -I INPUT -j $SPAMLIST
$IPT -I OUTPUT -j $SPAMLIST
$IPT -I FORWARD -j $SPAMLIST
# Rendre le script exécutable :
sudo chmod +x /etc/init.d/ploutos.sh
# Lancer le script :
sudo sh ploutos.sh
# Vérifier que les adresses IP aient bien été bloquées.
sudo iptables -L -v
# Vérifier si cette règle "sshdbruteforce" est chargée après un redémarrage :
sudo iptables -t filter -N sshdbruteforce
iptables v1.8.2 (nf_tables): Chain already exists
# Chercher une seule adresse IP dans cette liste
sudo iptables --list | grep 92.62.131.113
# Retournera l'adresse IP qui a été blacklistée.
# Retirer toutes les règles ajoutées dans Iptables avec la chaîne "sshdbruteforce" qui a été créée par le script /etc/init.d/ploutos.sh qui a chargé les adresses IP à bloquer depuis /$HOME/ploutos.ips :
# Sauvegarder la règle Iptables, retirer les éléments de notre règle "sshdbruteforce", réimporter la règle Iptables mise à jour.
# Sauvegarder les règles existantes.
sudo iptables-save > /tmp/iptables.txt
# Supprimer les lignes qui contiennent sshdbruteforce.
sudo sed -i '/sshdbruteforce/d' /tmp/iptables.txt
# Restaurer la règle Iptables.
sudo iptables-restore < /tmp/iptables.txt && rm /tmp/iptables.txt
# Vérifier le résultat.
sudo iptables -L -v
# Remettre à jour les adresses IP à bloquer par le Firewall dans le fichier ploutos.ips.
sudo journalctl --since "7 days ago" --until "1 minutes ago" |grep sshd |grep "Invalid user" |awk '{print $10}' |sort -u |xargs > /$HOME/ploutos.ips
# Réimporter les adresses IP à bloquer depuis le fichier ploutos.ips dans le Firewall.
sudo sh /etc/init.d/ploutos.sh

Script pour bloquer débloquer et lister les adresses IP bloquées

# Créer le fichier du script.
nano banip
# Ajouter le code suivant dans le fichier du script banip.
#!/bin/bash
# Nom du script : Bloquer/Débloquer une adresse IP avec Iptables.

# La fonction d'aide.
function help {
	echo " Syntax: $0 -[L][u] IP"
	echo " Les paramètres viennent en premier. IP est une adresse IP."
	echo " Ne pas ajouter de paramètre pour bloquer une adresse IP."
	echo " Le paramètre -L permet de lister les adresses IP bloquées."
	echo " Le paramètre -u permet de débloquer une adresse IP (Ou plusieurs?)."
	exit 1
}

# Si aucun argument n'est passé, appeler la fonction help.
if [ -z "$1" ]; then
	help
fi

# Définition des variables.
ACTION="-A"
txtred=$(tput setaf 1)
txtyel=$(tput setaf 3)
txtcya=$(tput setaf 6)
txtrst=$(tput sgr0)

while getopts "huL" OPTION
do
	case $OPTION in
		h)
			help
			;;
		u)
			ACTION="-D"
			shift $(($OPTIND - 1))
			;;
		L)
			ACTION="-L"
			shift $(($OPTIND - 1))
			;;
		\?)
			help
			;;
	esac
done

if [ $ACTION === "-L" ]; then
	echo $txtcya"List of Banned IPs:"$txtrst
	iptables -L INPUT -v -n | grep DROP
else
	# ban work loop
	for ZTARGET in "$@"
	do
		echo $txtcya"Applying action $txtred$ACTION$txtcya to $txtyel$ZTARGET"$txtrst
		iptables $ACTION INPUT -s $ZTARGET -j DROP
	done
fi
# Donner les droits d'exécution au fichier :
chmod +x banip
# Fonctionnement du script.
# Pour bannir une adresse IP, lancer le script suivi de l'adresse IP à bannir :
./banip x.x.x.x

# Appeler l'aide du script.
# L'argument -h lance l'aide du script. Il est aussi possible d'invoquer l'aide en ne passant aucun argument :
./banip
./banip -h

# L'argument -L affiche la liste des adresses IP bloquées :
./banip -L

# L'argument -u pour unban débloque une adresse IP donnée :
./banip -u x.x.x.x

Bloquer un domaine

host -t a www.facebook.com

Supprimer une règle spécifique

Copier l'intégralité de la règle .......
Par exemple INPUT .......
iptables -D .......

Quand utiliser dport ou sport

# Quand utiliser dport ou sport :
# --sport est l'abréviation de --source-port
# --dport est l'abréviation de --destination-port
# Ici on suppose que l'on voudrait bloquer les requêtes HTTP. Il faut bloquer le port 80 sur la chaîne sortante pour bloquer toutes les requêtes HTTP sortantes.
sudo iptables -A OUTPUT -p tcp --dport 80 -j DROP

Fonctionnement de la numérotation des règles Iptables

Obtenir l'affichage des règles avec un numéro de ligne. Les chaînes habituelles INPUT OUTPUT FORWARD sont affichées, ainsi que les autres chaînes.
sudo iptables -L --line-numbers
# Supprimer la règle numéro 3 :
sudo iptables -D Nom_de_la_chaîne numéro_de_ligne
# Ajouter une règle entre la première et la deuxième :
sudo iptables -I Nom_de_la_chaîne 2 "La suite de la règle"

Gestion du trafic sortant

Tracer les connexions sortantes

# Loguer les connexions que votre serveur établis avec l'extérieur.
# Une seule commande par protocole TCP/UDP suffit.
iptables -I OUTPUT -m state -p tcp --state NEW ! -s 127.0.0.1 ! -d 127.0.0.1 -j LOG --log-prefix "ACTION=OUTPUT-TCP "
iptables -I OUTPUT -m state -p udp -s 127.0.0.1 ! -d 127.0.0.1 -j LOG --log-prefix "ACTION=OUTPUT-UDP "

Restriction sur les connexions sortantes

La gestion du trafic sortant permet notamment d'améliorer la sécurité dans le cas ou :
- on installe soit-même un paquet qui contient un malware.
- quelqu'un installe un trojan sur le serveur.
# Un exemple qui n'a pas été mis en pratique, faire plus de recherches pour cet usage.
/sbin/iptables --new-chain apache_user
/sbin/iptables --append OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
/sbin/iptables --append OUTPUT -m owner --uid-owner apache -j apache_user
# Allow apache user to connec to our smtp server
/sbin/iptables --append apache_user -p tcp --syn -d 192.168.1.100 --dport 25 -j RETURN
# Allow apache user to connec to api server for spam validation
/sbin/iptables --append apache_user -p tcp --syn -d  66.135.58.62 --dport 80 -j RETURN
/sbin/iptables --append apache_user -p tcp --syn -d  66.135.58.61 --dport 80 -j RETURN
/sbin/iptables --append apache_user -p tcp --syn -d  72.233.69.89 --dport 80 -j RETURN
/sbin/iptables --append apache_user -p tcp --syn -d  72.233.69.88 --dport 80 -j RETURN
# Drop everything for apache outgoing connection
/sbin/iptables --append apache_user -j REJECT

ICMP

# Autoriser ICMP :
# sudo iptables -A INPUT -p icmp -j ACCEPT
# sudo iptables -A OUTPUT -p icmp -j ACCEPT
# Autoriser les PING entrant :
# sudo iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT

# Bloquer ICMP :
# Première méthode pour refuser la réponse aux PING :
# sudo iptables -A OUTPUT -p icmp --icmp-type echo-request -j DROP
# Deuxième méthode pour refuser la réponse aux PING :
# sudo iptables -A OUTPUT -p icmp --icmp-type 8 -j DROP
# On DROP les requêtes entrantes et sortantes pour ICMP :
# La machine ne répondra plus aux requêtes PING.
sudo iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
sudo iptables -A OUTPUT -p icmp --icmp-type echo-reply -j DROP
Connaître les paramètres en ligne de commande :
sudo /sbin/sudo iptables -p icmp -h
Connaître les paramètres et les RFC associées :
Internet Control Message Protocol (ICMP) Parameters : https://www.iana.org/assignments/icmp-parameters/icmp-parameters.xhtml

Multicast

Si on parle d'une machine exposée sur Internet comme un VPS OVH, le multicast est inutile.
Cette technologie n'a jamais pris sur Internet. Si tu reçois du multicast sur l'interface, c'est du bruit de fond local correspondant à des protocoles d'annonces de services mal configurés sur les VPS voisins ou des besoins spécifiques à OVH (FHRP par exemple).

IGMP

L'IGMP est un protocole permettant à une machine de s'abonner à un flux multicast routé. Donc si pas de multicast sur Internet, pas besoin d'IGMP
Autant le bloquer mais sans pour autant créer des règles dédiées. Un DROP par défaut de tout en fin de chaîne, ou en action par défaut, va très bien et évite de surcharger inutilement les règles.

Faire face au flood

Bloquer l'inondation du réseau sur le port Apache avec IPtables

# Limiter le nombre de connexions entrantes par minute à 100 et définit une rafale limite sur 200.
# Vous pouvez modifier la limite et la rafale en fonction de vos besoins spécifiques.
sudo iptables -A INPUT -p tcp --dport 80 -m limit --limit 100/minute --limit-burst 200 -j ACCEPT

Limiter le nombre de connexions simultanées par adresse IP

# Limiter le nombre de connexions simultanées établies à partir d’une adresse IP unique sur un port donné.
sudo iptables -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 5 -j REJECT
sudo iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 40 -j REJECT
sudo iptables -A INPUT -p tcp --syn --dport 443 -m connlimit --connlimit-above 40 -j REJECT

Bloquer les ip qui cherchent à dialoguer avec xmlrpc

# Une solution radicale cas d'attaques multiples à répétition serrait de bloquer les adresses IP directement dans Iptables.
for ip in $(grep xmlrpc /var/log/apache2/access.log | cut -d' ' -f1 | sort | uniq -c | sort -rn | head -n8 | awk '{print $2}'); do \
iptables -A INPUT -s $ip -j DROP; \
done
# Conserver une trace des adresses IP ainsi bloquées :
for ip in $(grep xmlrpc /var/log/apache2/access.log | cut -d' ' -f1 | sort | uniq -c | sort -rn | head -n8 | awk '{print $2}'); do \
echo "iptables -A INPUT -s $ip -j DROP; \" > ip-xmlrpc-stop-avec-iptables.txt
done

Quelques services a protéger avec Iptables

ftp / sftp
phpmyadmin
ssh
webmin

Ouvrir un port dans Iptables

# Exemple pour Mysql et uniquement pour une ip d'un serveur prédéfini.
iptables -A INPUT -s IPserver -p tcp -m tcp --dport 3306 -j ACCEPT
# On vérifie la conf d’iptables
iptables -L
# Si tout est ok, on sauvegarde la modif
iptables-save > /etc/sysconfig/ipables

Gestion des logs pour Iptables

Journalisation et commandes Iptables

# On log les paquets en entrée.
sudo iptables -A INPUT -j LOG --log-level 4

# On log les paquets forward.
sudo iptables -A FORWARD -j LOG --log-level 4
# Définir l'adresse IP source ou la plage pour laquelle la journalisation sera créé.
sudo iptables -A INPUT -s 192.168.10.0/24 -j LOG
# Pour définir le niveau de LOG généré par Iptables, utilisez --log-level suivi du numéro de niveau.
sudo iptables -A INPUT -s 192.168.10.0/24 -j LOG --log-level 4
# Ajouter un préfixe dans les journaux générés pour faciliter la recherche d'erreurs dans un fichier volumineux.
sudo iptables -A INPUT -s 192.168.10.0/24 -j LOG --log-prefix '** SUSPECT **'

Script de journalisation

# Ajouter ce script au début des règles Iptables.
sudo iptables -N LOG_ACCEPT
sudo iptables -A LOG_ACCEPT -j LOG --log-prefix "INPUT:ACCEPT:" --log-level 2
sudo iptables -A LOG_ACCEPT -j ACCEPT
sudo iptables -N LOG_REJECT
sudo iptables -A LOG_REJECT -j LOG --log-prefix "INPUT:REJECT: " --log-level 6
sudo iptables -A LOG_REJECT -j REJECT
sudo iptables -N LOG_DROP
sudo iptables -A LOG_DROP -j LOG --log-prefix "INPUT:DROP: " --log-level 6
sudo iptables -A LOG_DROP -j DROP
# Effectuer toutes les actions en une seule fois en passant (-j) aux chaînes personnalisées au lieu des valeurs par défaut LOG / ACCEPT / REJECT / DROP.
iptables -A <your_chain_here> <your_conditions_here> -j LOG_ACCEPT
iptables -A <your_chain_here> <your_conditions_here> -j LOG_REJECT
iptables -A <your_chain_here> <your_conditions_here> -j LOG_DROP

Utiliser Rsyslog pour journaliser les logs de Iptables dans un fichier de log dédié au pare-feu

# Changer le chemin du fichier de logs depuis syslog, ou, Rsyslog si celui-ci a été installé :
sudo nano /etc/syslog.conf
# Ajouter la ligne :
kern.warning /var/log/iptables.log
# Éditer la configuration de Rsyslog :
sudo nano /etc/rsyslog.conf
# Ajouter les deux lignes suivantes vers le début du fichier de configuration de Rsyslog pour stocker les logs de Iptables dans le fichier "/var/log/iptables.log".
# Rsyslog permet de filtrer les informations de Iptables à l'aide de la valeur contenue dans --log-prefix pour les journaliser vers le fichier souhaité.
# Ainsi, une règle différente pourrait être créée pour chacun des blocages effectué avec Iptables.
:msg,contains,"INPUT:DROP:" /var/log/iptables.log
& stop
# Enregistrer la nouvelle configuration.
# Prendre en compte les modifications :
sudo service rsyslog restart
# Vérifier que les logs soient écrits :
tail -f /var/log/kern.log

Utiliser logrotate pour archiver régulièrement le contenu de /var/log/iptables.log

Exemple pour la rotation du fichier de log iptables.log.

Notes OVH - Firewall

RAID

# Pour un filer RAID, ne pas oublier d'autoriser les connexions NFS.
# Nous pouvons être large en autorisant tout ce qui vient du réseau interne 192.168.0.0/16 :
/sbin/iptables -A INPUT -i eth0 -p tcp --source 192.168.0.0/16 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p udp --source 192.168.0.0/16 -j ACCEPT

Configuration en Cluster

# Autoriser le port 79 pour que OCO puisse communiquer avec le répartiteur de charge.
/sbin/iptables -A INPUT -i eth0 -p tcp --dport 79 -j ACCEPT
Une fois votre firewall parfaitement configuré, il ne vous reste plus qu'à créer un script qui se lancera à chaque démarrage de votre serveur. Voici un exemple à placer dans un fichier nommé par exemple "firewall" dans le répertoire /etc/init.d/ :
#!/bin/sh
IPT=/sbin/iptables
 
case "$1" in
start)
$IPT -F INPUT
$IPT -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A INPUT -i eth0 -p tcp --dport 25 -j ACCEPT
$IPT -A INPUT -i eth0 -p tcp --dport 53 -j ACCEPT
$IPT -A INPUT -i eth0 -p udp --dport 53 -j ACCEPT
$IPT -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
$IPT -A INPUT -i eth0 -p tcp --dport 110 -j ACCEPT
$IPT -A INPUT -i eth0 -p tcp --dport 443 -j ACCEPT
$IPT -A INPUT -i eth0 -p tcp --dport 10000 -j ACCEPT
$IPT -A INPUT -i eth0 -p tcp --dport 21 --source xx.xx.xx.xx -j ACCEPT
$IPT -A INPUT -i eth0 -p tcp --dport 22 --source cache.ovh.net -j ACCEPT
$IPT -A INPUT -i eth0 -p tcp --dport 22 --source xx.xx.xx.xx -j ACCEPT
$IPT -A INPUT -i eth0 -p icmp --source proxy.ovh.net -j ACCEPT
$IPT -A INPUT -i eth0 -p icmp --source proxy-rbx2.ovh.net -j ACCEPT
$IPT -A INPUT -i eth0 -p icmp --source proxy.p19.ovh.net -j ACCEPT
$IPT -A INPUT -i eth0 -p icmp --source proxy.rbx.ovh.net -j ACCEPT
$IPT -A INPUT -i eth0 -p icmp --source proxy.rbx2.ovh.net -j ACCEPT
$IPT -A INPUT -i eth0 -p icmp --source xxx.xxx.xxx.251 -j ACCEPT
$IPT -A INPUT -i eth0 -p icmp --source xxx.xxx.xxx.250 -j ACCEPT
$IPT -A INPUT -i eth0 -p icmp --source ping.ovh.net -j ACCEPT
$IPT -A INPUT -i eth0 -p tcp --source 192.168.0.0/16 -j ACCEPT
$IPT -A INPUT -i eth0 -p udp --source 192.168.0.0/16 -j ACCEPT
$IPT -A INPUT -i eth0 -p tcp --dport 79 -j ACCEPT
$IPT -A INPUT -i eth0 -j REJECT
exit 0
;;
 
stop)
$IPT -F INPUT
exit 0
;;
*)
echo "Usage: /etc/init.d/firewall {start|stop}"
exit 1
;;
esac
Donner les droits 700 et taper "/etc/init.d/firewall start" pour le démarrer et "/etc/init.d/firewall stop" pour l'arrêter.
Pour le lancer automatiquement au démarrage :
/sbin/chkconfig --level 3 firewall on
/sbin/chkconfig --level 06 firewall off
Vérifier avant de mettre le script à chaque démarrage du serveur qu'il soit bon sinon votre serveur sera définitivement bloqué !
La communication entre le service RTM et votre serveur nécessite également que vous autorisez les connexions entrant sortant sur les ports UDP 6100 a 6200.

Tester le Firewall avec nmap ou hping3

# nmap -v -f FIREWALL-IP
# nmap -v -sX FIREWALL-IP
# nmap -v -sN FIREWALL-IP
# hping3 -X FIREWALL-IP
# Exemples :
nmap -v -f 139.99.173.195

Starting Nmap 7.60 ( https://nmap.org ) at 2019-09-21 01:27 CEST
Initiating Ping Scan at 01:27
Scanning 139.99.173.195 [4 ports]
Stats: 0:00:00 elapsed; 0 hosts completed (0 up), 1 undergoing Ping Scan
Ping Scan Timing: About 100.00% done; ETC: 01:27 (0:00:00 remaining)
Completed Ping Scan at 01:27, 0.42s elapsed (1 total hosts)
Initiating SYN Stealth Scan at 01:27
Scanning visionduweb.fr (139.99.173.195) [1000 ports]
Discovered open port 21/tcp on 139.99.173.195
Discovered open port 443/tcp on 139.99.173.195
Discovered open port 80/tcp on 139.99.173.195
Discovered open port 22/tcp on 139.99.173.195
Completed SYN Stealth Scan at 01:28, 22.64s elapsed (1000 total ports)
Nmap scan report for visionduweb.fr (139.99.173.195)
Host is up (0.32s latency).
Not shown: 989 filtered ports
PORT    STATE  SERVICE
20/tcp  closed ftp-data
21/tcp  open   ftp
22/tcp  open   ssh
25/tcp  closed smtp
53/tcp  closed domain
80/tcp  open   http
110/tcp closed pop3
143/tcp closed imap
443/tcp open   https
993/tcp closed imaps
995/tcp closed pop3s

Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 23.27 seconds
           Raw packets sent: 2004 (88.152KB) | Rcvd: 22 (900B)
nmap -v -sX 139.99.173.195

Starting Nmap 7.60 ( https://nmap.org ) at 2019-09-21 01:32 CEST
Initiating Ping Scan at 01:32
Scanning 139.99.173.195 [4 ports]
Completed Ping Scan at 01:32, 0.43s elapsed (1 total hosts)
Initiating XMAS Scan at 01:32
Scanning visionduweb.fr (139.99.173.195) [1000 ports]
Completed XMAS Scan at 01:32, 20.00s elapsed (1000 total ports)
Nmap scan report for visionduweb.fr (139.99.173.195)
Host is up (0.31s latency).
All 1000 scanned ports on visionduweb.fr (139.99.173.195) are open|filtered

Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 20.62 seconds
           Raw packets sent: 2015 (80.636KB) | Rcvd: 12 (528B)
nmap -v -sN 139.99.173.195

Starting Nmap 7.60 ( https://nmap.org ) at 2019-09-21 01:32 CEST
Initiating Ping Scan at 01:32
Scanning 139.99.173.195 [4 ports]
Completed Ping Scan at 01:32, 0.43s elapsed (1 total hosts)
Initiating NULL Scan at 01:32
Scanning visionduweb.fr (139.99.173.195) [1000 ports]
Completed NULL Scan at 01:33, 18.54s elapsed (1000 total ports)
Nmap scan report for visionduweb.fr (139.99.173.195)
Host is up (0.31s latency).
All 1000 scanned ports on visionduweb.fr (139.99.173.195) are open|filtered

Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 19.13 seconds
           Raw packets sent: 2014 (80.592KB) | Rcvd: 29 (2.434KB)
hping3 -X 139.99.173.195

HPING 139.99.173.195 (wlp60s0 139.99.173.195): X set, 40 headers + 0 data bytes
# Le scann est très long, je l'aborde avec CTRL C :
^C
--- 139.99.173.195 hping statistic ---
5366 packets transmitted, 0 packets received, 100% packet loss
round-trip min/avg/max = 0.0/0.0/0.0 ms

Ip6tables pour IPv6

# Les commandes ne sont pas les mêmes pour ipv4 et ipv6.
# La commande iptables est utilisée pour ipv4.
# La commande ip6tables est utilisée pour ipv6.

NDP

# Il faut faire attention à bien autoriser le protocole NDP qui reprend entre autre le rôle d'ARP en IPv4 et qui s'appuie sur de l'ICMPv6.
# Autant en IPv4 on ne peut pas bloquer l'ARP avec Iptables, autant en IPv6 c'est assez facile de se planter en oubliant de l'autoriser.
# NDP repose sur des paquets ICMPv6 échangés localement en multicast.

Analyser et visualiser les logs de Iptables

# Les logs de Iptables sont écrites dans le fichier kern.log de Debian.
# Les logs de Iptables sont verbeuses, et, simplement incompréhensibles à l'œil nu.
# De nombreux outils permettent d'afficher une synthèse des informations fournies par les logs de Iptables.
Afficher les logs de Iptables.

Iptables vs nftables

# Suite à la montée en version de Debian Buster vers Debian Bullseye, je rencontre un message d'erreur avec Iptables.
# Si je tente de sauvegarder les règles de Iptables, le message d'erreur suivant est affiché :
sudo iptables-save > iptables-2021.rules
iptables-save: /usr/local/lib/libnftnl.so.11: version `LIBNFTNL_13' not found (required by iptables-save)
# Après avoir effectué une réinstallation de Iptables, l'erreur n'est plus présente.
# Noter que les règles existantes précédemment configurées ont été perdues, Iptables n'ayant pas été configuré pour utiliser de règles persistantes afin de ne pas se retrouver bloqué en cas de redémarrage.
# Il est recommandé de passer à nftables, nftables étant le pare-feu recommandé actuellement pour Debian Bullseye.

Passer de iptables-nft vers iptables-legacy

# Depuis Debian Buster, le pare-feu utilisé par défaut est nftables.
# Basculer vers le pare-feu nftables :
sudo update-alternatives --set iptables /usr/sbin/iptables-nft
sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-nft
sudo update-alternatives --set arptables /usr/sbin/arptables-nft
sudo update-alternatives --set ebtables /usr/sbin/ebtables-nft
# Basculer vers le pare-feu iptables-legacy :
sudo update-alternatives --set iptables /usr/sbin/iptables-legacy
sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
sudo update-alternatives --set arptables /usr/sbin/arptables-legacy
sudo update-alternatives --set ebtables /usr/sbin/ebtables-legacy
Installer nftables : Configurer le pare-feu nftables

Bibliographie

Tutoriels pour Iptables

Installer Iptables

 Simplest guide to using connlabel : https://unixia.wordpress.com/2016/03/05/simplest-guide-to-using-connlabel/

Documentation pour Iptables

 Documentation Iptables : https://doc.ubuntu-fr.org/iptables
 Source de l'image, le site iptable info qui n'est plus actif, sur la page /en/structure-of-iptables.html#TRAVERSINGGENERAL

Exemples de règles Iptables

 https://crm.vpscheap.net/knowledgebase.php?action=displayarticle&id=29
 https://www.cyberciti.biz/tips/linux-iptables-10-how-to-block-common-attack.html
 https://geekeries.org/2017/12/configuration-avancee-du-firewall-iptables/?cn-reloaded=1
 https://www.cyberciti.biz/tips/linux-iptables-8-how-to-avoid-spoofing-and-bad-addresses-attack.html
 https://www.digitalocean.com/community/tutorials/iptables-essentials-common-firewall-rules-and-commands
 https://www.geek17.com/fr/content/debian-9-stretch-securiser-votre-serveur-avec-le-firewall-iptables-32
 http://www.octetmalin.net/linux/scripts/iptables-demarrer-arret-redemarrage-start-stop-restart-pare-feu-firewall.php
 Linux Iptables allow or block ICMP ping request : https://www.cyberciti.biz/tips/linux-iptables-9-allow-icmp-ping.html
 Règles iptables contre les attaques DDOS : https://www.abyssproject.net/2014/06/regles-iptables-contre-les-attaques-ddos/
 Exemples de règles Iptables : http://web.archive.org/web/20170913213716/http://formation-debian.via.ecp.fr/firewall.html

Gestion des logs pour Iptables

 How to Enable Logging in Iptables on Linux : https://tecadmin.net/enable-logging-in-iptables-on-linux/comment-page-1/
# Ce tutoriel ne fonctionne pas dans le cas d'une politique globale sur DROP :
 How to Log Linux IPTables Firewall Dropped Packets to a Log File : https://www.thegeekstuff.com/2012/08/iptables-log-packets/comment-page-1

Iptables et IPv6

 https://bash.cyberciti.biz/firewall/centos-debian-rhel-ipv6-iptables/

Iptables / Netfilter

Configurer Netfilter avec Shoreline Firewall

Le pare-feu "Shoreline Firewall", plus communément appelé "Shorewall", est un outil pour configurer plus facilement Netfilter.
 Source : https://doc.ubuntu-fr.org/shorewall
 Debian / Ubuntu Linux: Install and Configure Shoreline Firewall (Shorewall) : https://www.cyberciti.biz/faq/debian-ubuntu-linux-shorewall-firewall-configuration/

Configurer Netfilter avec UFW

# UFW est un outil de configuration simplifié en ligne de commande de Netfilter qui apporte une alternative à l'outil Iptables.
# UFW devrait à terme permettre une configuration automatique du pare-feu lors de l'installation de programmes qui en ont besoins.
# UFW, ou pare-feu simple, est un frontal pour Iptables.
# Son objectif principal est de simplifier la gestion de votre pare-feu et de fournir une interface facile à utiliser.
# Il est bien pris en charge et populaire dans la communauté Linux, même installé par défaut dans de nombreuses distributions.
# En tant que tel, c'est un excellent moyen de commencer à sécuriser votre serveur.
# Revérifier les définitions suivantes : Netfilter, Iptables, UFW.
# Il existe une interface graphique pour UFW nommée GUFW.
 How to setup a UFW firewall on Ubuntu 16.04 LTS server : https://www.cyberciti.biz/faq/howto-configure-setup-firewall-with-ufw-on-ubuntu-linux/
 https://www.digitalocean.com/community/tutorials/how-to-setup-a-firewall-with-ufw-on-an-ubuntu-and-debian-cloud-server
 https://linuxize.com/post/how-to-setup-a-firewall-with-ufw-on-ubuntu-18-04/
 https://www.vultr.com/docs/how-to-configure-ufw-firewall-on-ubuntu-14-04
 Documentation : https://doc.ubuntu-fr.org/ufw
Configurer Netfilter avec l'interface graphique GUFW de UFW
# Installer GUFW.
sudo apt install gufw
# Réservé pour les stations de travail.
# Quand on installe GUFW, ça permet de gérer UFW (pré-installé par défaut) en interface graphique.
# Tous les ports sont fermés par défaut à l'installation, sauf ceux strictement nécessaires (Firefox, Thunderbird, ...).
# Connaître le statut de UFW :
sudo ufw status verbose
État : actif
Journalisation : on (low)
Par défaut : deny (incoming), allow (outgoing), disabled (routed)
Nouveaux profils : skip
# Le mode graphique nous permet de changer les droits par défaut pour 3 profils :
Dossier_personnel
Bureau
Public
Pourtant, on peut lire avec la commande précédente : "Nouveaux profils : skip".
A quoi cela correspond t'il ?
# Connaître l'état des règles en place :
Vérifier l'état de UFW : "sudo ufw status verbose"
Lister toutes les règles de UFW : "sudo ufw show raw"
# Si on fait un UFW enable on risque de tout bloquer si on est néophyte :
Activer UFW : "sudo ufw enable"
Le système le plus sécurisé est celui dont sa connexion à Internet est isolée.
Virtualiser un système avec VirtualBox par exemple.
 Site officiel : http://gufw.org
Tutoriels pour Netfilter et Iptables
 Site officiel de Netfilter : https://www.netfilter.org
 Présentation de Netfilter : http://g.urroz.online.fr/doc/ch02.html
 Définition de Netfilter d'après Wikipédia : https://fr.wikipedia.org/wiki/Netfilter
 Netfilter/Iptables introduction : https://wiki.debian-fr.xyz/Netfilter/Iptables_introduction
 Introduction à Netfilter et iptables : https://connect.ed-diamond.com/GNU-Linux-Magazine/GLMFHS-041/Introduction-a-Netfilter-et-iptables

Stratégie psad pour Iptables

# Document original :
psad iptables Policy Configuration : http://www.cipherdyne.org/psad/docs/fwconfig.html
# Traduction :
Configuration de la stratégie psad iptables : http://translate.google.com/translate?hl=fr&sl=auto&tl=fr&u=http%3A%2F%2Fwww.cipherdyne.org%2Fpsad%2Fdocs%2Ffwconfig.html

Migrer un serveur web sans interruption

 Migrer un serveur web sans interruption : https://korben.info/4-etapes-pour-migrer-un-serveur-web-sans-interruption.html

Paquets pour assister à la configuration du Firewall

firehol, firewalld, fwbuilder

Pare-feu et partage de connexion Internet

 https://linux.developpez.com/formation_debian/firewall.html

Alternatives à Iptables

Aternatives EOLE Amon

http://eole.ac-dijon.fr/documentations/2.6/completes/HTML/EOLE/co/00-introduction_2.html

Ipset

# Ipset permet de définir des tables de hashage d'adresses IP ou IP+Port ou préfixe d'adresse IP, autant en IPv4 qu'en IPv6.
# Installer ipset :
sudo apt install ipset
# Consulter le manuel
http://ipset.netfilter.org/ipset.man.html
# Créer une liste pour le rejet :
ipset create port_scanners hash:ip family inet hashsize 32768 maxelem 65536 timeout 600
ipset create scanned_ports hash:ip,port family inet hashsize 32768 maxelem 65536 timeout 60
# Ajouter les règles iptables :
iptables -A INPUT -m state --state INVALID -j REJECT
iptables -A INPUT -m state --state NEW -m set ! --match-set scanned_ports src,dst -m hashlimit --hashlimit-above 1/hour --hashlimit-burst 5 --hashlimit-mode srcip --hashlimit-name portscan --hashlimit-htable-expire 10000 -j SET --add-set port_scanners src --exist
iptables -A INPUT -m state --state NEW -m set --match-set port_scanners src -j REJECT
iptables -A INPUT -m state --state NEW -j SET --add-set scanned_ports src,dst
Ajouter les ports analysés dans scanned_ports.
Si un scanner envoie des paquets vers 5 ports différents cela signifie que c'est probablement un scanner.
La commande "hashlimit-burst 5" permet de l'ajouter à l'ensemble "port_scanners".
Le délai d'expiration de port_scanners correspond au temps de blocage des scanners, 10 minutes dans cet exemple.
Il commencera à compter à partir du début (voir --exist) jusqu'à ce que l'attaquant arrête l'analyse pendant 10 secondes (voir --hashlimit-htable-expire 10000).
Noter que quelqu'un peut bloquer n'importe quelle adresse IP en faisant simplement du scan basé sur une usurpation d'identité.
Ne pas définir de ce fait un délai de ban trop long.
Conclusion :
La méthode semble intéressante mais je n'ai pas réussi à m'exclure du scann lors de mes tests en local.
Attention : C'est une adresse IP distante qui doit être interrogée. Ici la boucle local est autorisée dans les règles de pare-feu. 
# Je supprime les ajouts effectués avec ipset :
ipset list
ipset x port_scanners -exist
ipset x scanned_ports
ipset list
# Je supprime les règles iptables :
iptables -D INPUT -m state --state INVALID -j REJECT
iptables -D INPUT -m state --state NEW -m set ! --match-set scanned_ports src,dst -m hashlimit --hashlimit-above 1/hour --hashlimit-burst 5 --hashlimit-mode srcip --hashlimit-name portscan --hashlimit-htable-expire 10000 -j SET --add-set port_scanners src --exist
iptables -D INPUT -m state --state NEW -m set --match-set port_scanners src -j REJECT
iptables -D INPUT -m state --state NEW -j SET --add-set scanned_ports src,dst

Untangle

Untangle : https://www.untangle.com

Leopard Flower

Leopard Flower est un pare-feu dit "applicatif" qui "filtre" les applications demandant un accès réseau, LAN ou Internet.
Son rôle peut ainsi être comparé à celui que joue ZoneAlarm sous Windows.
Iptables s'apparente plus à un pare-feu matériel : il ne fait « que » filtrer les trames passant sur le réseau sans se préoccuper de l'application générant ces trames.
Un logiciel espion (spyware) peut donc se loger dans le système sans que l'on s'en aperçoive.
Source : https://doc.ubuntu-fr.org/lpfw

Guarddog

http://www.simonzone.com/software/guarddog/

Fwbuilder

# D'autres alternatives existent comme FWBuilder, une alternative au Firewall Iptables.
# A clone of the SourceForge fwbuilder repostiory http ://fwbuilder.sourceforge.net
Dépôt Github : https://github.com/fwbuilder/fwbuilder
# Vous pouvez également l’installer rapidement sur Debian, Ubuntu et dérivés à l’aide de la commande suivante :
sudo apt-get install fwbuilder
# Sur Arch Linux, Manjaro et dérivés depuis les dépôts Community :
sudo pacman -S community/fwbuilder

eBPF

# La technologie eBPF semble aussi très prometteuse.

Ressources complémentaires

Ressources en français

 Bloquer les attaques reçues sur les principaux protocoles (Mails, Web et FTP) : https://www.informatiweb-pro.net/admin-systeme/linux/18--debian-ubuntu-bloquer-les-attaques-recues-sur-les-principaux-protocoles-mails-web-et-ftp.html
 http://www.octetmalin.net/linux/tutoriels/iptables-configurer-gerer-table-nat-dnat-snat-chaine-prerouting-postrouting-output.php
 Source complémentaire : https://blog.infiniclick.fr/articles/tutoriel-installer-serveur-debian-wheezy.html#tuto18
 https://www.digitalocean.com/community/questions/how-to-close-iptables-and-reboot-iptables-on-debian-wheezy
 http://rhelblog.redhat.com/2014/04/11/mitigate-tcp-syn-flood-attacks-with-red-hat-enterprise-linux-7-beta/
 Logs iptables : Configurer votre firewall pour Splunk : https://geekeries.org/2018/04/logs-iptables/
 https://people.netfilter.org/hawk/presentations/nfws2014/iptables-ddos-mitigation_RMLL.pdf
 https://github.com/netoptimizer/network-testing/blob/master/iptables/iptables_synproxy.sh
 Gestion des logs Iptables : https://inetdoc.net/guides/iptables-tutorial/logtarget.html
 https://www.mad-hacking.net/documentation/linux/security/iptables/rate-limiting.xml
 https://netoptimizer.blogspot.fr/2014/04/basic-tuning-for-network-overload.html
 https://serverfault.com/questions/129086/how-to-start-stop-iptables-on-ubuntu
 Les commandes Iptables : https://web.archive.org/web/20151206193432/www.admin-debian.com/securite/commandes-iptables/
 https://debian-facile.org/doc:reseau:iptables-pare-feu-pour-un-client
 https://linux.developpez.com/iptables/?page=correspondances#LXIV-C-8
 https://timetotech.fr/linux/tuto-configuration-dun-firewall-linux/
 https://github.com/firehol/firehol/wiki/Working-with-SYNPROXY
 https://making.pusher.com/per-ip-rate-limiting-with-iptables/
 https://www.cgsecurity.org/Articles/firewall_netfilter.html
 https://javapipe.com/ddos/blog/iptables-ddos-protection/
 http://olivieraj.free.fr/fr/linux/information/firewall/
 Iptables : https://fr.wikipedia.org/wiki/Iptables
 http://irp.nain-t.net/doku.php/130netfilter:start
 https://lea-linux.org/documentations/Iptables
 https://inetdoc.net/guides/iptables-tutorial/
 http://lea-linux.org/documentations/Iptables
 https://web.archive.org/web/20200224075208/https://www.microlinux.fr/iptables/
 ban.leshebergeurs.org/iptables.php
 https://docs.ovh.com/fr/

Ressources en anglais

 http://web.mit.edu/rhel-doc/4/RH-DOCS/rhel-rg-fr-4/s1-iptables-options.html
 https://netfilter.org/documentation/HOWTO/packet-filtering-HOWTO.html
 https://tecadmin.net/enable-logging-in-iptables-on-linux/
 https://www.cyberciti.biz/tips/linux-iptables-examples.html
 https://www.thegeekstuff.com/2011/06/iptables-rules-examples/
 https://www.nbs-system.com/blog/howto-iptables/
 https://help.ubuntu.com/community/IptablesHowTo
 https://www.hostinger.fr/tutoriels/iptables/
 https://netfilter.org/documentation/

NAVIGATION

PARTICIPER ET PARTAGER

Bienvenue sur le wiki de Amis SH.
De nombreuses pages sont partagées sur ce wiki.
Créer un compte utilisateur pour participer sur le wiki.
Les pages présentées sur le wiki évoluent tous les jours.
Certaines recherches sont peu abouties et incluent des erreurs.
Utiliser la recherche interne du wiki pour trouver votre contenu.
La page de discussion de Amis SH vous permet de poser vos questions.
Consulter le site amis-sh.fr pour installer votre propre serveur web.
Améliorer le contenu des pages avec vos retours depuis l'onglet discussion.
Ce contenu ne doit pas servir à nuire à autrui ou à un système informatique.
Protéger votre système Linux ou Windows avec cette page dédiée à la sécurité.

SOUTENIR CE WIKI

Soutenir le wiki avec un don en monnaie numérique :
AEON - Bitcoins - Bitcoins Cash - Bitcoins Gold - Bitcore - Blackcoins - Basic Attention Token - Bytecoins - Clams - Dash - Monero - Dogecoins - Ğ1 - Ethereum - Ethereum Classique - Litecoins - Potcoins - Solarcoins - Zcash

OBTENIR DE LA MONNAIE NUMERIQUE

Obtenir gratuitement de la monnaie numérique :
Miner de la cryptomonnaie.