Vorweg der Hinweis, dass der Support für Debian9 im Juni nächsten Jahres auslaufen wird. Ein Update auf Debian 10 (Buster) wäre bis dahin anzuraten.
Im Vorfeld entsorge ich pauschal mal Pakete, die ohnehin unbrauchbar oder unmöglich sind (spoofing z.B.) sind und ich tue das nicht in der INPUT, sondern bereits vorher im PREROUTING. Kann ab ein paar Millionen Pakete pro Sekunde schon einen Unterschied machen.
-A PREROUTING -m conntrack --ctstate INVALID -j DROP
-A PREROUTING -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j DROP
-A PREROUTING -p tcp -m conntrack --ctstate NEW -m tcpmss ! --mss 536:65535 -j DROP
-A PREROUTING -s 224.0.0.0/3 -j DROP
-A PREROUTING -s 169.254.0.0/16 -j DROP
-A PREROUTING -s 172.16.0.0/12 -j DROP
-A PREROUTING -s 192.0.2.0/24 -j DROP
-A PREROUTING -s 192.168.0.0/16 -j DROP
-A PREROUTING -s 10.0.0.0/8 -j DROP
-A PREROUTING -s 0.0.0.0/8 -j DROP
-A PREROUTING -s 240.0.0.0/5 -j DROP
-A PREROUTING -s 127.0.0.0/8 ! -i lo -j DROP
-A PREROUTING -f -j DROP
Alles anzeigen
Damit ist schon ein Haufen Abfall erschlagen.
-A INPUT -i lo -j ACCEPT # Erlaube Verbindungen von Localhost
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT # Bereits bestehende TCP-Verbindungen müssen nicht weiter untersucht werden
-A INPUT -s 1.2.3.4/24 -j ACCEPT #Erlaube Adressbereich des Hosting-Anbieters falls dieser automatische Überwachung für Dienste anbietet
-A INPUT -p tcp -m tcp --dport 80 -m state --state NEW -m limit --limit 2500/min --limit-burst 5000 -j ACCEPT #für einen kleine Webserver mit wenig traffic erlaube bis zu 5000 neue Verbindungen binnen einer Minute verteilt auf alle Absender und erzwinge bei Überschreitung ein Limit von 2500 Verbindung pro Minute
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT # Erlaube den ganz normalen Ping, kann natürlich auch auf 1/s limitiert werden, aber dann am besten pro Absender
-A INPUT -j DROP # alles was nicht in eine Regel passt wegwerfen
Ggf. macht es Sinn wichtige Ports wie SSH gezielt auf einen bestimmten Adressbereich zu "whitelisten" falls es möglich ist. Dann muss sich der Dienst schon mit weniger geskripteten Versuchen da draussen herumschlagen und das Hintergrundrauschen im auth.log wird signifikant reduziert.
Neben dem Limit für alle Nutzer auf einmal (dieses kann ruhig recht hoch angesetzt werden) kann der Traffic dann noch auf die einzelnen Absender herunter gebrochen werden und dort geprüft ob ein einzelner über die Stränge schlägt:
-A INPUT -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW -j IN_SSH
-A IN_SSH -m recent --rcheck --seconds 60 --hitcount 15 --rttl --name sshbf --mask 255.255.255.255 --rsource -j DROP
-A IN_SSH -m recent --set --name sshbf --mask 255.255.255.255 --rsource -j ACCEPT
Frei übersetzt: Maximal 15 Versuche binnen einer Minute pro Absender eine Verbindung per SSH aufzubauen, sonst war es das.
In deinem konkreten Fall musst du natürlich die Ports sämtlicher Dienste einzeln freigeben:
- Minecraft 25565/tcp
- Teamspeak 9987/udp 10011/tcp 30033/tcp 41144/tcp
- Webdienste 80/tcp 443/tcp
- Plesk läuft ggf. auf einem anderen Port, dann dieser auch /tcp
- MySQL NUR falls von extern Zugriffe auf die Datenbank notwendig sind, ansonsten NICHT freigeben
Den ganzen Spaß darfst du dann noch einmal machen für ip6tables falls IPv6 angeboten/verwendet wird (will ich doch hoffen).
Als Schlusswort: iptables ist deprecated und es sollte nftables an dessen Stelle verwendet werden. Hatte selbst noch keine Gelegenheit mich damit näher zu befassen, es gibt jedoch auch "Übersetzer" welche bestehende Regeln von iptables-sprech in nftables-sprech übersetzen.
Schöne Grüße