Le firewall va être configuré ainsi :
Notes concernant la signification des futures commandes
Commande | Signification |
---|---|
-t ou --table table | nom de la table à utiliser. Par défaut c'est filter qui contient les chaînes input, output et forward, mais cela peut être nat, mangle, raw |
-A pour --append | Append to chain. -A ajoute une règle à une chaine cad INPUT, OUTPUT, FORWARD. Un append ajoute la règle à la suite des autres cad en bas de liste. |
-I | insère une règle. Par défaut elle est insérée en première ligne, en position 1 cad en début de liste. On peut préciser le numéro de la ligne. |
-s ou --source | réseau ou ip source |
-d ou --destination | réseau ou ip cible |
-p ou --protocol | on indique le protocol. Cela peut être tcp, udp, icmp, all etc |
--sport ou --source-port | c'est le port source |
--dport ou --destination-port | c'est le port cible |
-i pour --in-interface | dire le nom de l'interface d'entrée. Quand il n'y a qu'une carte réseau il n'est pas toujours nécessaire de le préciser. lo correspond à l'interface de loopback. |
-o pour --out-interface | présicer le nom de l'interface de sortie. |
-j (ou --jump ?) | on indique ce qu'on fait du paquet avec par exemple ACCEPT, DROP, LOG etc |
-P chaîne (chain) | cible, cad INPUT, OUTPUT, FORWARD etc |
Voici les commandes qui vont être exécutées par le script qui va paramétrer iptables.
Les lignes qui débutent pas un # sont des lignes commentées qui servent d'information
#Reinitialiser iptables
#-F pour -flush : Delete all rules in chain or all chains
#-X pour a priori --delete-chain : Delete a user-defined chain
sudo iptables -F
sudo iptables -X
sudo ip6tables -F
#permettre à une connexion déjà ouverte de recevoir du trafic :
# notez que pour les nouvelles versions la commande peut être :
# iptables -A INPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
#Authoriser l'interface locale (loopback).
iptables -t filter -A INPUT -i lo -j ACCEPT
iptables -t filter -A OUTPUT -o lo -j ACCEPT
echo "traffic sur l interface locale ok"
#Création d'une new user-defined chain pour pouvoir autoriser ET logger un flux avec le préfixe iptables
iptables -N LOGACCEPT
iptables -A LOGACCEPT -j LOG --log-prefix 'iptables:' -m limit --limit 2/min
iptables -A LOGACCEPT -j ACCEPT
#Création d'une new user-defined chain pour pouvoir explicitement bloquer et logger un flux avec le préfixe iptables
iptables -N LOGDROP
iptables -A LOGDROP -j LOG --log-prefix 'iptables:' -m limit --limit 2/min
iptables -A LOGDROP -j DROP
#On aurait pu préciser dans chaque règle de rejet qu'elle interface était concernée, comme par exemple eth0 en specifiant -i eth0, mais avouez que c'est nettement plus compliqué.
#Si vous n'avez pas authorisé le traffic de loopback dans les première règles et donc que vous le faites après coup, il faut s'assurer que cette règle soit dans les premières. Pour cela on va faire un Insert en seconde position avec cette commande
#iptables -t filter -I INPUT 2 -i lo -j ACCEPT
#iptables -t filter -I OUTPUT 2 -i lo -j ACCEPT
#Permettre le trafic entrant et sortant pour le port SSH, cad le port 22
iptables -t filter -A INPUT -p tcp --dport 22 -j LOGACCEPT #-i eth0
iptables -t filter -A OUTPUT -p tcp --dport 22 -j ACCEPT
echo "ssh ok"
#Permettre le trafic entrant pour un éventuel serveur openVpn, cad le port 1194
iptables -t filter -A INPUT -p udp --dport 1194 -j LOGACCEPT
echo "OpenVpn ok"
#Pour éventuellement autoriser les ping en entrée, dé-commentez ces lignes
#iptables -t filter -A INPUT -p icmp -j LOGACCEPT
#Autoriser le ping en sortie
iptables -t filter -A OUTPUT -p icmp -j ACCEPT
echo "ping en sortie ok"
#Autoriser les requètes DNS en sortie
iptables -t filter -A OUTPUT -p tcp --dport 53 -j ACCEPT
iptables -t filter -A OUTPUT -p udp --dport 53 -j ACCEPT
echo "dns ok"
#Pour éventuellement autoriser les requêtes DNS en entrée, dé-commentez ces lignes
#iptables -t filter -A INPUT -p tcp --dport 53 -j ACCEPT
#iptables -t filter -A INPUT -p udp --dport 53 -j ACCEPT
#Autoriser les requêtes NTP en sortie pour pouvoir se synchroniser ai niveau temps
iptables -t filter -A OUTPUT -p udp --dport 123 -j ACCEPT
echo "ntp ok"
#Autoriser tout le trafic en entrée depuis le réseau local qui commencera ici par une ip en 192.168
iptables -t filter -A INPUT -s 192.168.0.0/16 -j ACCEPT
echo "reseau local ok"
#Changer la politique par défaut sur les paquets entrants pour que, sans règle appliquée, le paquet soit rejeté. Attention donc à avoir au préalable autoriser le SSH par exemple.
#On aurait pu laisser la politique par défaut à ACCEPT et avoir placé en toute dernière règle une qui refuse tout. Les paquets autorisés par les règles précédentes n'atteindraient pas celle-ci.
#Modification de la politique par défaut pour iptables de ipV6. On bloque en entrée et en transfert
ip6tables -P INPUT DROP
ip6tables -P FORWARD DROP
#Modification pour ipv4
#iptables -A INPUT -j DROP
iptables -P INPUT DROP
#Modification de la politique par défaut sur les paquets transférés afin que par défaut ils soient bloqués
iptables -P FORWARD DROP
#On peut modifier la politique par défaut pour bloquer de base les paquets sortants mais je ne le fais pas car je trouve cela trop violent
#iptables -P OUTPUT DROP
echo "Script de configuration de iptables terminé"
Lien vers le fichier : cliquez ici
Notez qu'à priori pour avoir un log des paquets en entrée et des paquets forward on peut utiliser ces commandes :
iptables -A INPUT -j LOG
iptables -A FORWARD -j LOG
Lien vers le fichier : cliquez ici
J'ai aussi vu sur
http://www.cyberciti.biz/tips/linux-iptables-10-how-to-block-common-attack.html
que l'on pouvait bloquer des attaques basiques avec ces commandes :
#Force SYN packets check : S'assurer que les nouveaux paquets sont des paquets SYN, sinon les shooter
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
#Force Fragments packets check : forcer la vérification des paquets fragmentés. A priori cela évite que Linux panique pour des pertes de données
iptables -A INPUT -f -j DROP
#Shooter les paquets XMAS mal formés
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
#Shooter les paquets NULL
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
Lien vers le fichier : cliquez ici
Toutes ces commandes seront placées dans un fichier script nommé ici firewall.sh
firewall.sh sera créé dans /etc/init.d
Ce script devra commencer par une entête qui sera :
#!/bin/sh
## BEGIN INIT INFO
# Provides: Firewall maison
# Required-Start: $local_fs $remote_fs $network $syslog
# Required-Stop: $local_fs $remote_fs $network $syslog
# Default-Start:
# Default-Stop:
# X-Interactive: false
# Short-Description: Firewall maison
### END INIT INFO
Lien vers le fichier : cliquez ici
Pour créer le fichier de script firewall.sh dans dans /etc/init.d on va entrer ces commandes :
cd /etc/init.d
nano firewall.sh
Lien vers le fichier : cliquez ici
Ce qui donne :
On placera alors ce contenu dans firewall.sh et on sauvegardera le fichier :
#!/bin/sh
## BEGIN INIT INFO
# Provides: Firewall maison
# Required-Start: $local_fs $remote_fs $network $syslog
# Required-Stop: $local_fs $remote_fs $network $syslog
# Default-Start:
# Default-Stop:
# X-Interactive: false
# Short-Description: Firewall maison
### END INIT INFO
#Réinitialiser iptables
#-F pour -flush : Delete all rules in chain or all chains
#-X pour à priori --delete-chain : Delete a user-defined chain
sudo iptables -F
sudo iptables -X
sudo ip6tables -F
#permettre à une connexion déjà ouverte de recevoir du trafic :
# notez que pour les nouvelles versions la commande peut être :
# iptables -A INPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
#Authoriser l'interface locale (loopback).
iptables -t filter -A INPUT -i lo -j ACCEPT
iptables -t filter -A OUTPUT -o lo -j ACCEPT
echo "traffic sur l interface locale ok"
#Création d'une new user-defined chain pour pouvoir autoriser ET logger un flux avec le préfixe iptables
iptables -N LOGACCEPT
iptables -A LOGACCEPT -j LOG --log-prefix 'iptables:' -m limit --limit 2/min
iptables -A LOGACCEPT -j ACCEPT
#Création d'une new user-defined chain pour pouvoir explicitement bloquer et logger un flux avec le préfixe iptables
iptables -N LOGDROP
iptables -A LOGDROP -j LOG --log-prefix 'iptables:' -m limit --limit 2/min
iptables -A LOGDROP -j DROP
#On aurait pu préciser dans chaque règle de rejet qu'elle interface était concernée, comme par exemple eth0 en spécifiant -i eth0, mais avouez que c'est nettement plus compliqué.
#Si vous n'avez pas authorisé le traffic de loopback dans les première règles et donc que vous le faites après coup, il faut s'assurer que cette règle soit dans les premières. Pour cela on va faire un Insert en seconde position avec cette commande
#iptables -t filter -I INPUT 2 -i lo -j ACCEPT
#iptables -t filter -I OUTPUT 2 -i lo -j ACCEPT
#Permettre le trafic entrant et sortant pour le port SSH, cad le port 22
iptables -t filter -A INPUT -p tcp --dport 22 -j LOGACCEPT #-i eth0
iptables -t filter -A OUTPUT -p tcp --dport 22 -j ACCEPT
echo "ssh ok"
#Permettre le trafic entrant pour un éventuel serveur openVpn, cad le port 1194
iptables -t filter -A INPUT -p udp --dport 1194 -j LOGACCEPT
echo "OpenVpn ok"
#Pour éventuellement autoriser les ping en entrée, dé-commentez ces lignes
#iptables -t filter -A INPUT -p icmp -j LOGACCEPT
#Autoriser le ping en sortie
iptables -t filter -A OUTPUT -p icmp -j ACCEPT
echo "ping en sortie ok"
#Autoriser les requêtes DNS en sortie
iptables -t filter -A OUTPUT -p tcp --dport 53 -j ACCEPT
iptables -t filter -A OUTPUT -p udp --dport 53 -j ACCEPT
echo "dns ok"
#Pour éventuellement autoriser les requêtes DNS en entrée
#iptables -t filter -A INPUT -p tcp --dport 53 -j ACCEPT
#iptables -t filter -A INPUT -p udp --dport 53 -j ACCEPT
#Autoriser les requêtes NTP en sortie pour pouvoir se synchroniser ai niveau temps
iptables -t filter -A OUTPUT -p udp --dport 123 -j ACCEPT
echo "ntp ok"
#Autoriser tout le trafic en entrée depuis le réseau local qui commencera ici par une ip en 192.168
iptables -t filter -A INPUT -s 192.168.0.0/16 -j ACCEPT
echo "reseau local 192.168.0.0 ok"
#Changer la politique par défaut sur les paquets entrants pour que, sans règle appliquée, le paquet soit rejeté. Attention donc à avoir au préalable autoriser le SSH par exemple.
#On aurait pu laisser la politique par défaut à ACCEPT et avoir placé en toute dernière règle une qui refuse tout. Les paquets autorisés par les règles précédentes n'atteindraient pas celle-ci.
#Modification de la politique par défaut pour iptables de ipV6. On bloque en entrée et en transfert
ip6tables -P INPUT DROP
ip6tables -P FORWARD DROP
#Modification pour ipv4
#iptables -A INPUT -j DROP
iptables -P INPUT DROP
#Modification de la politique par défaut sur les paquets transférés afin que par défaut ils soient bloqués
iptables -P FORWARD DROP
#On peut modifier la politique par défaut pour bloquer de base les paquets sortants mais personnellement je ne le fais pas car je trouve cela trop violent
#iptables -P OUTPUT DROP
echo "Script de configuration de iptables terminé"
Lien vers le fichier : cliquez ici
Une fois que l'on a sauvegardé et quitté le fichier avec ctrl -X
on va donner les droits d'exécution au fichier firewall.sh avec la commande
chmod +x ./firewall.sh
Lien vers le fichier : cliquez ici
Pour que votre script de configuration soit lancé automatiquement au boot de la machine, regarder l'article
Par défaut, les droits du fichiers sont du type :
tous les droits pour le propriétaire, lecture et exécution pour les autres.
On peut remettre ces droits ainsi :
chmod 755 firewall.sh
Lien vers le fichier : cliquez ici
A la vue de cette configuration, si vous voulez voir en temps réel les flux qui sont autorisés, tapez (sous Ubuntu) :
tail -f /var/log/syslog | grep 'IPTABLES: '
Lien vers le fichier : cliquez ici
Exemple
Pages Web
Site Web | Description |
---|---|
doc.ubuntu-fr.org/iptables | Documentation de prise en main de iptables du site Ubuntu |
dd-wrt.com/wiki | Wiki de la distrib dd-wrt qui donne la signification des options de base d'iptables |
Ariege360.fr | Explique comment créer le fichier firewall.sh, le rendre exécutable et le lancer automatiquement au boot du serveur. Explique aussi fail2ban |
Cyberciti.biz | How to: Linux Iptables block common attacks |
Linux.die.net | Aide de Iptables sur Linux.die.net |
Linux.com | How to Write iptables Rules for IPv6 |
Article(s) suivant(s)
Article(s) précédent(s)
Article(s) en relation(s)
Voir les règles en place dans Iptables
Ajouter une règle dans iptables
Voir le journal des blocages d'un firewall IpTables
Accepter tout le traffic au niveau d'un firewall linux avec Iptables
Mettre en place la redirection de port sur un DD WRT
Lancer automatiquement un programme via un script au démarrage de Linux