レート制限を使用して Go で DDoS 攻撃を阻止する方法
レート制限は、DDoS 攻撃を軽減するための最も効果的な手法の 1 つです。そのバリエーションの中でも、IP ごとのレート制限 は、ターゲットを絞ったアプローチで際立っています。IP アドレスに基づいて、クライアントごとにリクエスト制限を個別に適用します。これにより、正当なユーザーに対する公平なレベルのアクセスを維持しながら、単一のユーザーがサーバーに負荷をかけることを防ぎます。
この記事では、IP ごとのレート制限がどのように機能するか、それが DDoS 攻撃を阻止するための最良の戦略の 1 つである理由、レート パッケージを使用して Go に実装する方法について説明します。
レート制限を行う理由
レート制限は、セキュリティと使いやすさのバランスをとるため、広く使用されています。これが推奨されるアプローチである理由は次のとおりです:
- 効率的なリソース管理: 各クライアントからのリクエストの数を制限することで、攻撃中であってもサーバーの過負荷を回避できます。
- 公平性: 悪意のあるクライアントが制限されている間も、正規のユーザーはサーバーにアクセスし続けることができます。
- カスタマイズ可能: レート制限は、パブリック API とプライベート サービスの異なる制限など、ユースケースに基づいて調整できます。
- スケーラビリティ: レート制限メカニズムは、特にロード バランサーやリバース プロキシと組み合わせた場合、最新のインフラストラクチャに合わせて拡張できます。
他のテクニックとの比較
- ファイアウォール ルール: 事前定義されたルールに基づいてネットワーク レベルでトラフィックをブロックします。大規模なフィルタリングには効果的ですが、柔軟性が低く、誤検知の際に正規のユーザーをブロックする可能性があります。
- コンテンツ配信ネットワーク (CDN): トラフィックを複数のサーバーに分散します。 CDN は DDoS の影響を軽減するのには優れていますが、アプリケーション レベルで不正なトラフィックに対処することはできません。
- 作業証明 (PoW): クライアントはサーバーにアクセスする前に計算パズルを解く必要があります。効果的ではありますが、正規ユーザーにとっては遅延が増加し、クライアントにとってはリソースを大量に消費する可能性があります。
- レート制限: きめ細かい制御が可能で、拡張性が高く、大幅なオーバーヘッドが追加されません。多くの場合、これはアプリケーション レベルのエンドポイントを保護するための最良の選択です。
実装
IP ごとのレート制限では、クライアント IP ごとに個別のリミッターが維持されます。 golang.org/x/time/rate パッケージを使用して実装する方法は次のとおりです。
ステップ 1: 必要なパッケージをインストールする
料金パッケージは Go の拡張モジュールの一部です。次のコマンドでインストールします:
バッシュ
golang.org/x/time/rate を取得してください
ステップ 2: IP ごとのレート リミッターをコーディングする
行きます
パッケージメイン
インポート (
)`"fmt"` `"net/http"` `"sync"` `"time"` `"golang.org/x/time/rate"`
)
var (
`mu sync.Mutex` `visitors = make(map[string]*rate.Limiter)`
)
// getVisitor は指定された IP のレート リミッターを取得し、存在しない場合はレート リミッターを作成します。
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 は IP ごとのレート制限を適用します
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.")`
}
関数 main() {
`http.HandleFunc("/", rateLimitedHandler)` `fmt.Println("Starting server on :8080")` `http.ListenAndServe(":8080", nil)`
}
説明
- 訪問者マップ: 各 IP アドレスのレート リミッターを維持します。訪問者マップには、IP アドレス (r.RemoteAddr) をキーとしたこれらのリミッターが保持されます。リクエストが受信されると、getVisitor 関数は IP にリミッターがすでに存在するかどうかを確認します。
- リミッターの作成: 各リミッターは、バースト 5 で 1 秒あたり 1 リクエストを許可します。リミッターが存在しない場合は、特定のルール (バースト容量 5 で 1 秒あたり 1 リクエスト) で新しいリミッターが作成されます。リミッターは、初期のリクエストのバーストをある程度許可しますが、その後は一定のレートを強制します。
- 自動クリーンアップ: goroutine は 1 分後にアイドル リミッターをクリーンアップしてメモリを節約します。メモリの増加を防ぐために、コードにはクリーンアップ メカニズムが含まれています。新しいリミッターが作成されるたびに goroutine が開始され、非アクティブ状態が 1 分間待機してから、対応するエントリを訪問者マップから削除します。これにより、リミッターがアクティブなクライアントに対してのみ保持されることが保証されます。
- レート制限ロジック: ハンドラーは、リミッターがリクエストを許可するかどうかを確認します。 リクエストが定義された制限を超えると、429 Too Many Requests エラーが返されます。それ以外の場合は、リクエストを処理します。
Go の IP ごとのレート制限は、アプリケーション レベルで DDoS 攻撃を軽減する優れた方法です。トラフィックを正確に制御し、悪意のあるユーザーを効果的に抑制しながら、正規のユーザーがサービスにアクセスできるようにします。
このアプローチは、正規のユーザーに影響を与えることなく不正な IP を効率的に抑制し、DDoS 攻撃を軽減するためのスケーラブルでメモリ効率の高いソリューションを提供します。
以上がレート制限を使用して Go で DDoS 攻撃を阻止する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











Golangは、パフォーマンスとスケーラビリティの点でPythonよりも優れています。 1)Golangのコンピレーションタイプの特性と効率的な並行性モデルにより、高い並行性シナリオでうまく機能します。 2)Pythonは解釈された言語として、ゆっくりと実行されますが、Cythonなどのツールを介してパフォーマンスを最適化できます。

Golangは並行性がCよりも優れていますが、Cは生の速度ではGolangよりも優れています。 1)Golangは、GoroutineとChannelを通じて効率的な並行性を達成します。これは、多数の同時タスクの処理に適しています。 2)Cコンパイラの最適化と標準ライブラリを介して、極端な最適化を必要とするアプリケーションに適したハードウェアに近い高性能を提供します。

goisidealforforbeginnersandsutable forcloudnetworkservicesduetoitssimplicity、andconcurrencyfeatures.1)installgofromtheofficialwebsiteandverify with'goversion'.2)

Golangは迅速な発展と同時シナリオに適しており、Cは極端なパフォーマンスと低レベルの制御が必要なシナリオに適しています。 1)Golangは、ごみ収集と並行機関のメカニズムを通じてパフォーマンスを向上させ、高配列Webサービス開発に適しています。 2)Cは、手動のメモリ管理とコンパイラの最適化を通じて究極のパフォーマンスを実現し、埋め込みシステム開発に適しています。

speed、効率、およびシンプル性をspeedsped.1)speed:gocompilesquilesquicklyandrunseffictient、理想的なlargeprojects.2)効率:等系dribribraryreducesexexternaldedenciess、開発効果を高める3)シンプルさ:

GolangとPythonにはそれぞれ独自の利点があります。Golangは高性能と同時プログラミングに適していますが、PythonはデータサイエンスとWeb開発に適しています。 Golangは同時性モデルと効率的なパフォーマンスで知られていますが、Pythonは簡潔な構文とリッチライブラリエコシステムで知られています。

GolangとCのパフォーマンスの違いは、主にメモリ管理、コンピレーションの最適化、ランタイム効率に反映されています。 1)Golangのゴミ収集メカニズムは便利ですが、パフォーマンスに影響を与える可能性があります。

GolangとCにはそれぞれパフォーマンス競争において独自の利点があります。1)Golangは、高い並行性と迅速な発展に適しており、2)Cはより高いパフォーマンスと微細な制御を提供します。選択は、プロジェクトの要件とチームテクノロジースタックに基づいている必要があります。
