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"`
Nach dem Login kopieren
)
var (
`mu sync.Mutex`
`visitors = make(map[string]*rate.Limiter)`
Nach dem Login kopieren
)
// 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`
Nach dem Login kopieren
}
// 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.")`
Nach dem Login kopieren
}
func main() {
`http.HandleFunc("/", rateLimitedHandler)`
`fmt.Println("Starting server on :8080")`
`http.ListenAndServe(":8080", nil)`
Nach dem Login kopieren
}
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!