Ratenbegrenzung ist eine der effektivsten Techniken zur Abwehr von DDoS-Angriffen. Unter seinen Variationen zeichnet sich das Per-IP-Rate-Limiting durch seinen zielgerichteten Ansatz aus: Es erzwingt die Anforderungslimits individuell für jeden Client, basierend auf seiner IP-Adresse. Dadurch wird verhindert, dass ein einzelner Benutzer den Server überlastet, während gleichzeitig ein faires Zugriffsniveau für legitime Benutzer gewährleistet wird.
In diesem Artikel besprechen wir, wie die Ratenbegrenzung pro IP funktioniert, warum sie eine der besten Strategien zum Stoppen von DDoS-Angriffen ist und wie man sie in Go mithilfe des Ratenpakets implementiert.
Warum Ratenbegrenzung
Ratenbegrenzung wird häufig verwendet, weil sie Sicherheit und Benutzerfreundlichkeit in Einklang bringt. Hier erfahren Sie, warum dies ein bevorzugter Ansatz ist:
- Effizientes Ressourcenmanagement: Durch die Begrenzung der Anzahl der Anfragen von jedem Client können Server selbst bei einem Angriff eine Überlastung vermeiden.
- Fairness: Legitime Benutzer können weiterhin auf den Server zugreifen, während böswillige Clients gedrosselt werden.
- Anpassbar: Ratenlimits können je nach Anwendungsfall angepasst werden, beispielsweise unterschiedliche Limits für öffentliche APIs im Vergleich zu privaten Diensten.
- Skalierbarkeit: Ratenbegrenzungsmechanismen lassen sich gut mit moderner Infrastruktur skalieren, insbesondere in Kombination mit Load Balancern oder Reverse-Proxys.
Vergleich mit anderen Techniken
- Firewall-Regeln: Blockieren Sie den Datenverkehr auf Netzwerkebene basierend auf vordefinierten Regeln. Es eignet sich zwar für die groß angelegte Filterung, ist jedoch weniger flexibel und kann legitime Benutzer bei Fehlalarmen blockieren.
- Content Delivery Networks (CDNs): Verteilen Sie den Datenverkehr auf mehrere Server. CDNs eignen sich zwar hervorragend zur Reduzierung der Auswirkungen von DDoS, bekämpfen missbräuchlichen Datenverkehr jedoch nicht auf Anwendungsebene.
- Arbeitsnachweis (PoW): Erfordert, dass Clients Rechenrätsel lösen, bevor sie auf den Server zugreifen. Effektiv, erhöht jedoch die Latenz für legitime Benutzer und kann für Clients ressourcenintensiv sein.
- Ratenbegrenzung: Bietet eine fein abgestimmte Kontrolle, lässt sich gut skalieren und verursacht keinen nennenswerten Mehraufwand. Es ist oft die beste Wahl zum Schutz von Endpunkten auf Anwendungsebene.
Implementierung
Bei der Ratenbegrenzung pro IP wird für jede Client-IP ein separater Begrenzer verwaltet. So implementieren Sie es mit dem Paket golang.org/x/time/rate.
Schritt 1: Installieren Sie das erforderliche Paket
Das Tarifpaket ist Teil der erweiterten Module von Go. Installieren Sie es mit:
Bash
Holen Sie sich golang.org/x/time/rate
Schritt 2: Codieren Sie den Pro-IP-Ratenbegrenzer
Los
Pakethauptseite
importieren (
`"fmt"` `"net/http"` `"sync"` `"time"` `"golang.org/x/time/rate"`
)
var (
`mu sync.Mutex` `visitors = make(map[string]*rate.Limiter)`
)
// getVisitor ruft den Ratenbegrenzer für eine bestimmte IP ab und erstellt einen, falls dieser nicht vorhanden ist.
func getVisitor(ip string) *rate.Limiter {
`mu.Lock()` `defer mu.Unlock()` `limiter, exists := visitors[ip]` `if !exists {` `limiter = rate.NewLimiter(1, 5) // 1 request/second, burst of 5` `visitors[ip] = limiter` `// Clean up limiter after 1 minute of inactivity` `go func() {` `time.Sleep(1 * time.Minute)` `mu.Lock()` `delete(visitors, ip)` `mu.Unlock()` `}()` `}` `return limiter`
}
// rateLimitedHandler wendet die Ratenbegrenzung pro IP an
func rateLimitedHandler(w http.ResponseWriter, r *http.Request) {
`ip := r.RemoteAddr` `limiter := getVisitor(ip)` `if !limiter.Allow() {` `http.Error(w, "Too many requests. Please try again later.", http.StatusTooManyRequests)` `return` `}` `fmt.Fprintln(w, "Request successful.")`
}
func main() {
`http.HandleFunc("/", rateLimitedHandler)` `fmt.Println("Starting server on :8080")` `http.ListenAndServe(":8080", nil)`
}
Erklärung
- Besucherkarte: Behält einen Rate-Limiter für jede IP-Adresse bei. Die Besucherkarte enthält diese Begrenzer, verschlüsselt durch IP-Adressen (r.RemoteAddr). Wenn eine Anfrage eingeht, prüft die getVisitor-Funktion, ob für die IP bereits ein Limiter vorhanden ist.
- Limiter-Erstellung: Jeder Begrenzer lässt 1 Anfrage pro Sekunde mit einer Burst-Kapazität von 5 zu. Wenn noch keiner vorhanden ist, wird ein neuer Begrenzer mit bestimmten Regeln erstellt (1 Anfrage pro Sekunde mit einer Burst-Kapazität von 5). Der Begrenzer lässt zunächst eine gewisse Anzahl von Anfragen zu, erzwingt danach aber eine konstante Rate.
- Automatische Bereinigung: Eine Goroutine bereinigt Leerlaufbegrenzer nach einer Minute, um Speicher zu sparen. Um Speicherwachstum zu verhindern, enthält der Code einen Bereinigungsmechanismus. Eine Goroutine wird jedes Mal gestartet, wenn ein neuer Begrenzer erstellt wird, und sie wartet eine Minute lang inaktiv, bevor sie den entsprechenden Eintrag aus der Besucherkarte entfernt. Dadurch wird sichergestellt, dass Limiter nur für aktive Clients beibehalten werden.
- Ratenbegrenzungslogik: Der Handler prüft, ob der Limiter die Anfrage zulässt. Wenn die Anfrage das definierte Limit überschreitet, antwortet sie mit dem Fehler 429 Too Many Requests; andernfalls wird die Anfrage verarbeitet.
Die Ratenbegrenzung pro IP in Go ist eine hervorragende Möglichkeit, DDoS-Angriffe auf Anwendungsebene abzuwehren. Es ermöglicht eine präzise Kontrolle des Datenverkehrs und stellt sicher, dass legitime Benutzer auf Ihren Dienst zugreifen können, während böswillige Benutzer effektiv gedrosselt werden.
Dieser Ansatz drosselt missbräuchliche IPs effizient, ohne legitime Benutzer zu beeinträchtigen, und bietet eine skalierbare und speichereffiziente Lösung zur Abwehr von DDoS-Angriffen.
Das obige ist der detaillierte Inhalt vonSo stoppen Sie DDoS-Angriffe in Go mit Ratenbegrenzung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Die Hauptunterschiede zwischen Golang und Python sind Parallelitätsmodelle, Typsysteme, Leistung und Ausführungsgeschwindigkeit. 1. Golang verwendet das CSP -Modell, das für hohe gleichzeitige Aufgaben geeignet ist. Python verlässt sich auf Multi-Threading und Gil, was für I/O-intensive Aufgaben geeignet ist. 2. Golang ist ein statischer Typ und Python ist ein dynamischer Typ. 3.. Golang kompilierte Sprachausführungsgeschwindigkeit ist schnell und Python interpretierte die Sprachentwicklung schnell.

Golang ist in der Regel langsamer als C, aber Golang hat mehr Vorteile für die gleichzeitige Programmier- und Entwicklungseffizienz: 1) Golangs Müllsammlung und Parallelitätsmodell macht es in hohen Parallelitätsszenarien gut ab. 2) C erhält eine höhere Leistung durch das manuelle Speichermanagement und die Hardwareoptimierung, weist jedoch eine höhere Komplexität der Entwicklung auf.

Golang wird häufig in Cloud -Computing und DevOps verwendet, und seine Vorteile liegen in Einfachheit, Effizienz und gleichzeitigen Programmierfunktionen. 1) Beim Cloud Computing behandelt Golang effizient gleichzeitige Anforderungen über Goroutine- und Kanalmechanismen. 2) In DevOps machen Golangs schnelle Zusammenstellung und plattformübergreifende Funktionen die erste Wahl für Automatisierungswerkzeuge.

Golang und C haben jeweils ihre eigenen Vorteile bei der Leistungseffizienz. 1) Golang verbessert die Effizienz durch Goroutine- und Müllsammlung, kann jedoch eine Pause einführen. 2) C realisiert eine hohe Leistung durch das manuelle Speicherverwaltung und -optimierung, aber Entwickler müssen sich mit Speicherlecks und anderen Problemen befassen. Bei der Auswahl müssen Sie Projektanforderungen und Teamtechnologie -Stack in Betracht ziehen.

Golang eignet sich besser für hohe Parallelitätsaufgaben, während Python mehr Vorteile bei der Flexibilität hat. 1. Golang behandelt die Parallelität effizient über Goroutine und Kanal. 2. Python stützt sich auf Threading und Asyncio, das von GIL betroffen ist, jedoch mehrere Parallelitätsmethoden liefert. Die Wahl sollte auf bestimmten Bedürfnissen beruhen.

Die Leistungsunterschiede zwischen Golang und C spiegeln sich hauptsächlich in der Speicherverwaltung, der Kompilierungsoptimierung und der Laufzeiteffizienz wider. 1) Golangs Müllsammlung Mechanismus ist praktisch, kann jedoch die Leistung beeinflussen.

Wählen SieGolangforHighperformanceConcurcurrency, idealforbackendServicesandNetworkProgramming; selectPythonforrapidDevelopment, DataScience und MachinelearningDuEToSverseStilityAntenSiveselibrary.

Golang und Python haben jeweils ihre eigenen Vorteile: Golang ist für hohe Leistung und gleichzeitige Programmierung geeignet, während Python für Datenwissenschaft und Webentwicklung geeignet ist. Golang ist bekannt für sein Parallelitätsmodell und seine effiziente Leistung, während Python für sein Ökosystem für die kurze Syntax und sein reiches Bibliothek bekannt ist.


Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

MinGW – Minimalistisches GNU für Windows
Dieses Projekt wird derzeit auf osdn.net/projects/mingw migriert. Sie können uns dort weiterhin folgen. MinGW: Eine native Windows-Portierung der GNU Compiler Collection (GCC), frei verteilbare Importbibliotheken und Header-Dateien zum Erstellen nativer Windows-Anwendungen, einschließlich Erweiterungen der MSVC-Laufzeit zur Unterstützung der C99-Funktionalität. Die gesamte MinGW-Software kann auf 64-Bit-Windows-Plattformen ausgeführt werden.

Dreamweaver CS6
Visuelle Webentwicklungstools

WebStorm-Mac-Version
Nützliche JavaScript-Entwicklungstools

ZendStudio 13.5.1 Mac
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor