GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie man iptables oder tc verwendet, um Pakete pro Client zu begrenzen.

Ich habe dies mit einer Kombination aus TC und iptables hashlimit gemacht. Ich habe einen ausgehenden TC-Bandbreitenbegrenzer auf der LAN-Schnittstelle erstellt (um den Download-Verkehr zu zielen), der auf 5 Mbit/s eingestellt ist. Ich verwende dann das iptables hashlimit-Modul in der Output-Mangle-Kette der Schnittstelle, sodass, wenn die Paketrate einen bestimmten Schwellenwert überschreitet, zwischen zwei beliebigen Quell- und Ziel-IP-Adressen diese Pakete in die TC 5 Mbit/s-Traffic-Shaping-Klasse eingeordnet werden .

Sie müssen den Paketschwellenwert jedoch korrekt einstellen, und ich habe meinen auf der Tatsache basiert, dass meine MTU 1500 Byte beträgt, also habe ich dies verwendet, um zu berechnen, wie viele Pakete pro Sekunde das wären, um einen Schwellenwert von 1,5 Mbit pro Sekunde (1000 Pakete/Sekunde) zu erstellen ). In Verbindung mit der Einstellung des höchstmöglichen Burst-Werts auf dem hashlimit iptables-Modul (der in meinem Setup 10.000 zu sein scheint) führt all dies dazu, dass kurze Downloads mit voller Geschwindigkeit ausgeführt werden, längere jedoch langsamer werden, da einige Pakete sind in die TC-Bandbreitenbegrenzungsklasse übergegangen, was dann offensichtlich die Paketrate senkt usw. usw. Es ist ein bisschen wie ein Hack, aber erstaunlicherweise funktioniert es, und es funktioniert gut. Und da TC verwendet wird, werden niemals Pakete verworfen – einfach verzögert und verlangsamt, da sie in die TC-Klasse geschoben werden, sobald die Paketrate erreicht ist.

Dies ist auf einer CentOS 6-Box. Ich denke, das modernere Zeug ermöglicht es dem Hashlimit-Modul, Bytes pro Sekunde zu unterstützen, nicht nur Pakete pro Sekunde, was sogar noch besser ist, aber ich habe dies bei meinem Setup ausprobiert und es kehrt einfach zur Verwendung von Paketen pro Sekunde zurück.

Ich bin gerade auf einem Mobiltelefon, kann also keine Konfiguration einfügen, aber wenn Sie einige Beispiele wünschen, lassen Sie es mich wissen und ich werde diese Antwort bearbeiten. Ich mag diese Lösung wirklich, weil die Begrenzung, für die ich mich entschieden habe, auf Quell- und Ziel-IP basiert. Das System sieht also jede unterschiedliche src+dst-IP-Kombination als seinen eigenen Paketstrom zum Begrenzen. Das Hashlimit-Modul unterstützt auch Quell- und Zielports (im Grunde jede Kombination aus Quell-IP, Quellport, Ziel-IP, Zielport), sodass Sie sogar die Begrenzung pro Sitzung zwischen Quell-IP+Port und Ziel-IP+Port vornehmen können .

AKTUALISIEREN

Unten ist also ungefähr, wie Sie es tun; Experimente sind erforderlich.

tc:

/sbin/tc qdisc add dev eth0 root handle 1: htb
/sbin/tc class add dev eth0 parent 1: classid 1:1 htb rate 5Mbit

iptables:

#!/bin/bash

[[ "$1" =~ ^[ADI]$ ]] || exit 1

for IPT in /sbin/ip{,6}tables
do
  $IPT -t mangle -$1 POSTROUTING -o eth0 -m hashlimit --hashlimit-above 1000/second --hashlimit-burst 10000 --hashlimit-mode srcip,dstip --hashlimit-name limiter -j CLASSIFY --set-class 1:1
done

Sie können dieses Problem auf einfache Weise lösen, versuchen Sie, das aktuelle Modul mit iptables zu verwenden, und behalten Sie die Quelladresse im Auge:

iptables -m recent -h
recent match options:
[!] --set                       Add source address to list, always matches.
[!] --rcheck                    Match if source address in list.
[!] --update                    Match if source address in list, also update last-seen time.
[!] --remove                    Match if source address in list, also removes that address from list.
    --seconds seconds           For check and update commands above.
                                Specifies that the match will only occur if source address last seen within
                                the last 'seconds' seconds.
    --reap                      Purge entries older then 'seconds'.
                                Can only be used in conjunction with the seconds option.
    --hitcount hits             For check and update commands above.
                                Specifies that the match will only occur if source address seen hits times.
                                May be used in conjunction with the seconds option.
    --rttl                      For check and update commands above.
                                Specifies that the match will only occur if the source address and the TTL
                                match between this packet and the one which was set.
                                Useful if you have problems with people spoofing their source address in order
                                to DoS you via this module.
    --name name                 Name of the recent list to be used.  DEFAULT used if none given.
    --rsource                   Match/Save the source address of each packet in the recent list table (default).
    --rdest                     Match/Save the destination address of each packet in the recent list table.
    --mask netmask              Netmask that will be applied to this recent list.

Beispiel für das Blockieren von ssh Brute Force:

iptables -A INPUT -i eth0 -p tcp --syn --dport 22 -m recent --name ssh --set
iptables -A INPUT -i eth0 -p tcp --syn --dport 22 -m recent --name ssh --rcheck --seconds  30 --hitcount 2 -j DROP

Linux
  1. So blockieren Sie die IP-Adresse auf einem Linux-Server

  2. So verwenden Sie den IP-Blocker in cPanel

  3. Wie drosselt man E/A pro Prozess auf ein maximales Limit?

  4. Leiten Sie HTTP-Datenverkehr mit iptables an eine andere IP-Adresse weiter

  5. Beschränken Sie den SSH-Zugriff auf bestimmte Clients nach IP-Adresse

So richten Sie den Nylas N1 E-Mail-Client unter Linux ein und verwenden ihn

Verwendung von Wireshark zum Erfassen und Analysieren von Netzwerkpaketen

So installieren und verwenden Sie Wireshark unter Ubuntu 21.04

Was ist BusyBox unter Linux? Wie benutzt man es?

So verwenden Sie IPTables anstelle von Firewalld für Fedora 30-31-32

So verwenden Sie SSH, um eine Verbindung zu einem Remote-Server unter Linux oder Windows herzustellen