Synproxy – DDOS II

Netfilter bietet die Möglichkeit lokal DDOS Attacken abzuwehren, oder zumindest zu mindern. Eine Beschreibung dazu kann hier nachgelesen werden. Eine Möglichkeit, die ich nur erwähnt habe ist die Verwendung eines SYNPROXY. Synproxy ist seit Kernel 3.12 und iptables Version 1.4.21 verfügbar. Aus heutiger Sicht schon lange her.

Was macht nun so ein SYNPROXY und wie kann der einen Schutz bieten. Der SYNPROXY überwacht, ob der Client nur ein SYN Packet zum Verbindungsaufbau schickt, oder eine vollständige TCP Verbindung aufbaut. Der Client sendet ein SYN Packet und der SYNPROXY antwortet mit einem SYN+ACK Packet. Antwortet der Client und baut die Kommunikation weiter auf, dann leitet SYNPROXY die Daten weiter. Antwortet der Client aber nicht wird die Verbindung verworfen und kann auch in weiterer Folge dauerhaft, oder zeitlich begrenzt, blockiert werden.

synproxy
synproxy

Damit die Leistung nicht in der Keller geht und SYNPROXY funktioniert wird die Verbindungsüberwachung (vgl.: conntrack) benötigt. Damit kann man sich aber auch wieder ein Problem einkaufen. Nämlich dass durch einen SYN+ACK & ACK Angriff dem Server auch die Ressourcen ausgehen. Der Grund ist, dass Netfilter standardmäßig erlaubt durch ein ACK Packet eine neue Verbindung und somit auch Socket aufzubauen. Damit wird der Verbindungsaufbau beschleunigt. Dieses Verhalten kann aber deaktiviert werden.

sysctl -w net/netfilter/mf_conntrack_tcp_loose=0

Damit ist es möglich Pakete, bevor sie den LISTEN Socket erreichen, verworfen werden.

iptables -m state --state INVALID -j DROP

SYNPROXY funktioniert auch mit unversorgten CONNTRACK. Hier gilt das für alle Netzwerkschnittstellen und alle Anschlüsse (vgl. Ports). Es ist aber auch möglich auf eine IP Adresse und einen Anschluß zu begrenzen, wie zum Beispiel die offizielle IP Adresse des Webservers.

iptables -t raw -I PREROUTING -i $DEV -p tcp -m tcp --syn --dport \ $PORT -j CT --notrack

Jetzt kann man auch noch die Stati UNTRACKED (vgl.: SYN Packet) und INVALID (vgl.: ACK Packet) abgreifen am Ziel des SYNPROXY. Dort schlagen die Packte ja auf.

iptables -A INPUT -i $DEV -p tcp -m tcp --dport $PORT -m state \
--state INVALID,UNTRACKED -j SYNPROXY --sack-perm --timestamp \
--wscale 7 --mss 1460

Was jetzt noch fehlt ist den SYN+ACK Angriff zu erwischen. Dazu wird der Rest mit Status INVALID, der SYN+ACK Verbindung, verworfen.

iptables -A INPUT -i $DEV -p tcp -m tcp --dport $PORT -m state \
--state INVALID -j DROP

Die SYN Cookies verwenden einen Zeitstempel. Diese Option sollte auch via sysctl aktiviert werden.

/sbin/sysctl -w net/ipv4/tcp_timestamp=1

Die Anzahl der Einträge in der Verbindungstabelle kann festgelegt werden und auch die dazugehörige Hashtabelle.

systcl -w net/netfilter/nf_conntrack=XXXXXXXXXX
echo XXXXXXXXXX > /sys/module/nf_conntrack/parameters/hashsize

Um zu kontrollieren, ob der SYNPROXY auch funktioniert kann man auf der Konsole den Zähler für die TCP Verbindungen anschauen mit:

watch -n1 cat /proc/net/stat/synproxy
Share on:

Schreibe einen Kommentar