Gestion du firewall iptables
Au risque de passer pour un vieux barbu, je ne me suis jamais fait à firewalld qui est embarqué de base dans les CentOs 7.X, du coup je vous propose de revenir à iptables.
[cyklodev_summary]
Pre requis :
- Un accès root sur le serveur
Installation
On commence par arrêter firewalld
systemctl stop firewalld
systemctl disable firewalld
Puis on installe les services iptables
yum install iptables-services
Ensuite on démarre et on active iptables
systemctl start iptables
systemctl enable iptables
Utilisation
Listing des règles
J’utilise ici l’option line-numbers qui va permettre plus tard de supprimer une règle en donnant simplement son numéro.
iptables -n -L --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
2 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
3 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:443
4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
5 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
6 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
2 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
4 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
Ajout d’une règle
On rajoute en position 3 des INPUT une autorisation pour le pour 80 du http.
iptables -I INPUT 3 -p tcp -m tcp --dport 80 -j ACCEPT
Suppression d’une règle
On supprime la ligne 6 de la chaine des INPUT.
iptables -D INPUT 6
Bloquer le ping
On bloque le ping en entrée et en sortie.
iptables -A OUTPUT -p icmp --icmp-type 8 -j DROP
iptables -I INPUT -p icmp --icmp-type 8 -j DROP
Bloquer le DDOS
Plus intéressant, on va pouvoir mettre des seuils de nombre de connexion sur un port. Dans le cas ci dessous, on autorise 20 connexion à la minutes et on stocke 100 connexions. Toutes celles qui arriveront après (mais dans la même minute) ne seront pas acceptées et arriveront à la fin de la chaine (donc en REJECT).
iptables -A INPUT -p tcp --dport 80 -m limit --limit 20/minute --limit-burst 100 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -m limit --limit 20/minute --limit-burst 100 -j ACCEPT
Pensez donc à adapter ces paramètres en fonction de votre traffic.
Bloquer le scan de port
Pour bloquer les scan de ports d’outils comme nmap, on va créer une nouvelle chaine (block-scan) et lui définir une limite de un hit par seconde. Tout ce qui suit sera DROP.
iptables -N block-scan
iptables -A block-scan -p tcp —tcp-flags SYN,ACK,FIN,RST RST -m limit —limit 1/s -j RETURN
iptables -A block-scan -j DROP
Permanence des règles
Sauvegarde
La sauvegarde peut se faire n’importe où, mais le fichier qui est lu au demarrage de CentOS est celui ci. Donc autant l’utilisé.
iptables-save > /etc/sysconfig/iptables
J’en profite pour faire une petite mise en garde si vous utilisez docker, car la communication des conteneurs passe aussi par iptables.
Nettoyage des règles
Si vous voulez repartir de zéro, rien de plus simple.
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
Restauration
Vous pouvez également restaurer votre configuration de démarrage.
iptables-restore < /etc/sysconfig/iptables