Hello,
Je souhaite attribuer à mes VMs des règles firewall attribuées par défaut. Ensuite, en fonction des services que je mettrai derrière, je les modifierai sensiblement (du DNS, MAIL, FTP, HTTPS à venir, mais logiquement même en l’état, ça ne devrait pas bloquer).
N’étant pas très à l’aise avec iptables, je souhaiterais votre avis là-dessus, pour voir si quelque-chose m’a échappé, si il y a des incohérences ou si il est possible de le simplifier.
Je l’ai voulu assez ouvert, mais bloquant les attaques les plus basiques. Pour tout ce qui est bruteforce et autres lourdeurs, je laisse la main à Fail2ban, dont j’activerai les règles progressivement.
Petite précision : debian 10 + utilisation de fail2ban (avec les règles SSH légèrement modifiées)
#!/bin/sh
# Internet
IFACE_INET=ens3
# Tout accepter
iptables -t filter -P INPUT ACCEPT
iptables -t filter -P FORWARD ACCEPT
iptables -t filter -P OUTPUT ACCEPT
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT
iptables -t mangle -P PREROUTING ACCEPT
iptables -t mangle -P INPUT ACCEPT
iptables -t mangle -P FORWARD ACCEPT
iptables -t mangle -P OUTPUT ACCEPT
iptables -t mangle -P POSTROUTING ACCEPT
# Remettre les compteurs à zéro
iptables -t filter -Z
iptables -t nat -Z
iptables -t mangle -Z
# Supprimer toutes les règles actives et les chaînes personnalisées
iptables -t filter -F
iptables -t filter -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
# Politique par défaut
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# Faire confiance à nous-mêmes
iptables -A INPUT -i lo -j ACCEPT
# Connexions établies
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
# SSH illimité
iptables -A INPUT -p tcp --dport 2278 -s ip1,ip2 -j ACCEPT
iptables -A INPUT -p tcp --dport 2278 -j DROP
# Blocage de paquets invalides
iptables -t mangle -A PREROUTING -m conntrack --ctstate INVALID -j DROP
# Bloque tous les nouveaux paquets n'ayant pas le SYN Flag
iptables -t mangle -A PREROUTING -p tcp ! --syn -m conntrack --ctstate NEW -j DROP
# TCP MSS mal formé
iptables -t mangle -A PREROUTING -p tcp -m conntrack --ctstate NEW -m tcpmss ! --mss 536:65535 -j DROP
# Bloque tous les paquets TCP avec un flag inhabituel
iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,SYN FIN,SYN -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,RST FIN,RST -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,ACK FIN -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,URG URG -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,FIN FIN -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,PSH PSH -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL ALL -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL NONE -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL FIN,PSH,URG -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL SYN,FIN,PSH,URG -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
# Bloque les paquets des subnets privés
iptables -t mangle -A PREROUTING -s 224.0.0.0/3 -j DROP
iptables -t mangle -A PREROUTING -s 169.254.0.0/16 -j DROP
iptables -t mangle -A PREROUTING -s 172.16.0.0/12 -j DROP
iptables -t mangle -A PREROUTING -s 192.0.2.0/24 -j DROP
iptables -t mangle -A PREROUTING -s 192.168.0.0/16 -j DROP
iptables -t mangle -A PREROUTING -s 10.0.0.0/8 -j DROP
iptables -t mangle -A PREROUTING -s 0.0.0.0/8 -j DROP
iptables -t mangle -A PREROUTING -s 240.0.0.0/5 -j DROP
iptables -t mangle -A PREROUTING -s 127.0.0.0/8 ! -i lo -j DROP
# Rejet du ping
iptables -t mangle -A PREROUTING -p icmp -j DROP
# Trop de connexions pour une même hote
iptables -A INPUT -p tcp -m connlimit --connlimit-above 80 -j REJECT --reject-with tcp-reset
# Nombre de connexion TCP max/s pour une hote
iptables -A INPUT -p tcp -m conntrack --ctstate NEW -m limit --limit 60/s --limit-burst 20 -j ACCEPT
iptables -A INPUT -p tcp -m conntrack --ctstate NEW -j DROP
# Anti scan de port
iptables -N port-scanning
iptables -A port-scanning -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s --limit-burst 2 -j RETURN
iptables -A port-scanning -j DROP
# Enregistrer les connexions refusées
iptables -A INPUT -m limit --limit 2/min -j LOG \
--log-prefix "Packets DROP"
iptables -A INPUT -j DROP
# On relance Fail2ban
/usr/sbin/service fail2ban restart
Je virerai peut-être la règle port-scanning, je pense qu’avec des clients mails un peu bogués ou mal configurés, cela pourra peut-être poser problème avec un serveur de mail.
Idem pour le rejet du ping, dans certains cas c’est plutôt utile.