# Syn flood Une attaque **SYN flood** (attaque semi-ouverte) est un type d’attaque par [déni de service (DDoS)](https://www.cloudflare.com/fr-fr/learning/ddos/what-is-a-ddos-attack) qui vise à rendre un serveur indisponible pour le trafic légitime en consommant toutes les ressources serveur disponibles.
![Progression of a SYN flood.](https://www.imperva.com/learn/wp-content/uploads/sites/13/2019/01/syn-flood.jpg)
--- # **Three-way handshake** L’attaque **SYN Flood** exploite le principe du **three-way handshake** du protocole **TCP**. Lors d’une connexion classique entre un **client** et un **serveur** il y a 3 étapes : Le client envoie un paquet **SYN**. Le serveur répond ensuite avec un paquet **SYN-ACK** accusant la réception. Le client envoie un paquet **ACK** et la connexion **TCP** est donc établie.
![](https://docs.aws.amazon.com/whitepapers/latest/aws-best-practices-ddos-resiliency/images/image5.png)
--- ## Déroulement de l’attaque En envoyant à plusieurs reprises des paquets de demande de connexion initiale (**SYN**), l’attaquant est en mesure de submerger tous les ports disponibles sur une machine serveur ciblée, ce qui oblige l’appareil ciblé à répondre lentement au trafic légitime, ou l’empêche totalement de répondre.
![SYN flood — Wikipédia](https://upload.wikimedia.org/wikipedia/commons/thumb/c/c6/Tcp_syn_flood.png/400px-Tcp_syn_flood.png)
Les **SYN Flood** sont fréquemment effectuées par des bots se connectant à partir d’**adresses IP usurpées** afin de rendre l’attaque plus difficile à identifier et à atténuer. Les **botnets** peuvent lancer des **SYN Flood** en tant qu’[attaques par déni de service distribué (DDoS)](https://www.f5.com/fr_fr/services/resources/glossary/distributed-denial-of-service-ddos-attack). --- Voilà un exemple d’attaque **SYN Flood** & **DNS Flood**:
![Imperva mitigates a 38 day-long SYN flood and DNS flood multi-vector DDoS attack.](https://www.imperva.com/learn/wp-content/uploads/sites/13/2019/01/syn-flood-ddos-attack.png)
*Imperva mitigates a 38 day-long SYN flood and DNS flood* [multi-vector DDoS attack.](https://www.imperva.com/blog/funded-persistent-multi-vector-ddos-attack/)
--- ## Protéger votre serveur contre le SYN Flood Dans cet exemple, nous avons **deux machines** en local : Une machine attaquante : **192.168.1.27** Une machine victime : **192.168.1.23** --- Avant de vouloir protéger notre machine, nous allons voir un filtre **wireshark** nous permettant de détecter une attaque **SYN Flood**.
1
`tcp.flags.syn == 1 and tcp.flags.ack == 0`
![](https://mikadmin.fr/blog/wp-content/uploads/2021/03/image-3-1024x726.png)
![](https://mikadmin.fr/blog/wp-content/uploads/2021/03/image-4.png)
Comme nous pouvons le voir, nous avons un très grand nombre de **paquets SYN** en destination de notre victime qui est **192.168.1.23** et en provenance d’**adresse IP usurpées**. --- Nous pouvons aussi détecter une attaque **SYN Flood** à l’aide de la commande suivante qui va nous renvoyer le nombre de connexion dans l’état **SYN\_RECV** :
1
`netstat -npt | awk '{print $6}' | sort | uniq -c | sort -nr | head`
--- Il est temps d’ajouter des paramètres nous permettant de **limiter** ce type d’attaque. Dans un premier temps, nous allons travailler avec le fichier **/etc/sysctl.conf** puis changer les variables suivantes :
1
2
3
4
`net.ipv4.tcp_syncookies = 1`
`net.ipv4.tcp_max_syn_backlog = 2048`
`net.ipv4.tcp_synack_retries = 3`
`net.ipv4.conf.all.rp_filter = 1`
Pour plus d’informations sur ces dernières je vous recommande cet [article](https://linoxide.com/firewall/snapshot-syn-flood-attack/#:~:text=If%20you%20suspect%20a%20SYN,are%20in%20%E2%80%9CSYN_RECEIVED%E2%80%9D%20state.). --- Nous pouvons également mettre en place des règles **iptables** permettant de **limiter** ceci comme par exemple :
1
2
3
4
5
6
7
8
9
10
11
`# Création d'une nouvelle chaîne nommée syn_flood`
`iptables -N syn_flood`
`# Match les segments TCP pour cette dernière`
`iptables -A INPUT -p tcp --syn -j syn_flood`
`# Si la limite match alors on continue à lire les autres règles`
`iptables -A syn_flood -m limit --limit 1/s --limit-burst 3 -j RETURN`
`# Si ça ne match pas on drop le paquet`
`iptables -A syn_flood -j DROP`
Après avoir mis en place ceci on constate que la chaîne **syn\_flood** commence à **DROP** des paquets.
![](https://mikadmin.fr/blog/wp-content/uploads/2021/03/image-5.png)