Per Zufall habe ich bemerkt, dass auf meinem vServer netstat -tuna viele TCP-Verbindungen im Status SYN_RECV zeigte. Eine Überprüfung mit `tcpdump` zeigte, dass mein Server viele TCP-SYN-Pakete empfing. Mein Server war Ziel einer SYN-Attacke.
Bei der SYN-Attacke werden Verbindungsaufbaupakete (SYN) gesendet, die Bestätigung vom Server (SYN+ACK) wird allerdings nicht beantwortet. Linux wartet normalerweise 60 Sekunden, bis der Verbindungswunsch abgebrochen wird, solange wird sie mit dem Status SYN_RECV in der Tabelle der Netzwerkverbindungen geführt.
Es ergeben sich 2 Angriff-Szenarien:
- Linux verwaltet normalerweise max. 1024 Verbindungen, so dass schon 17 (1024/60) SYN-Pakete/sec einen Linux-Rechner lahmlegen können.
- Linux schickt nicht nur ein SYN+ACK, sondern pro SYN-Paket werden im Laufe der 60 sec Wartezeit 5 SYN+ACK-Pakete geschickt. Damit fungieren die Server als Verstärker bei einem DDoS-Angriff.
Bei meiner Recherche bin ich auf das folgende Webseite gestoßen. Sie beschriebt, wie man DDoS-Angriffe auf Linux-Server abwehren kann.
https://javapipe.com/blog/iptables-ddos-protection/
Ich habe mich auf die Abwehr von SYN-Angriff beschränkt und meinen Server entsprechend konfiguriert. Einerseits kommt der Server nun mit erheblich mehr SYN-Paketen/sec klar, andererseits findet kein Verstärkungseffekt mehr statt. Der Server schickt nur noch ein SYN+ACK-Paket pro SYN-Paket.
Damit wurde mein Server anscheinend uninteressant für die Angreifer, nach 2 Wochen war wieder Ruhe.
Es folgt nun die Konfiguration von meinem Debian 9 (Stretch) Server.
Vorweg eine wichtige Warnung:
Nutzung auf eigene Gefahr.
Solche tiefgreifenden Änderungen im System können leicht fatale Folgen haben. Ihr müsst sehr gut verstehen, was die Konfigurationsänderungen bewirken und wie ihr etwaige Probleme selber löst. Weder netcup noch ich können euch da groß unterstützen.
Das Modul nf_conntrack_ipv4 muss frühzeitig geladen werden, damit die Kernel-Parameter für die Firewall gesetzt werden können.
Ich habe mich dazu entschieden, die Kernel-Parameter und die Firewall-Einträge in /etc/rc.local einzutragen.
Die Ports, die von außen erreichbar sein sollen, müssen angepaßt werden. Bei mir sind 22(SSH), 80(HTTP) und 443(HTTPS) erlaubt.
# Allow only SSH/HTTP/HTTPS from the outside
iptables -t mangle -I PREROUTING 1 -i lo -j ACCEPT
iptables -t mangle -I PREROUTING 2 -p tcp -m multiport \! --dports 22,80,443 -j DROP
# Kernel settings for SYNPROXY
sysctl -q -w net.ipv4.tcp_synack_retries=1
sysctl -q -w net.ipv4.tcp_syncookies=1
sysctl -q -w net.ipv4.tcp_timestamps=1
sysctl -q -w net.netfilter.nf_conntrack_max=10000000
sysctl -q -w net.netfilter.nf_conntrack_tcp_loose=0
# iptables rules for SYNPROXY
iptables -t raw -A PREROUTING -p tcp -m tcp --syn -j CT --notrack
iptables -A INPUT -p tcp -m tcp -m conntrack --ctstate INVALID,UNTRACKED -j SYNPROXY --sack-perm --timestamp --wscale 7 --mss 1460
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
Display More