ホームページ > バックエンド開発 > Golang > レート制限を使用して Go で DDoS 攻撃を阻止する方法

レート制限を使用して Go で DDoS 攻撃を阻止する方法

DDD
リリース: 2024-11-30 01:22:13
オリジナル
993 人が閲覧しました

How to Stop DDoS Attacks in Go with Rate Limiting

レート制限は、DDoS 攻撃を軽減するための最も効果的な手法の 1 つです。そのバリエーションの中でも、IP ごとのレート制限 は、ターゲットを絞ったアプローチで際立っています。IP アドレスに基づいて、クライアントごとにリクエスト制限を個別に適用します。これにより、正当なユーザーに対する公平なレベルのアクセスを維持しながら、単一のユーザーがサーバーに負荷をかけることを防ぎます。

この記事では、IP ごとのレート制限がどのように機能するか、それが DDoS 攻撃を阻止するための最良の戦略の 1 つである理由、レート パッケージを使用して Go に実装する方法について説明します。

レート制限を行う理由

レート制限は、セキュリティと使いやすさのバランスをとるため、広く使用されています。これが推奨されるアプローチである理由は次のとおりです:

  1. 効率的なリソース管理: 各クライアントからのリクエストの数を制限することで、攻撃中であってもサーバーの過負荷を回避できます。
  2. 公平性: 悪意のあるクライアントが制限されている間も、正規のユーザーはサーバーにアクセスし続けることができます。
  3. カスタマイズ可能: レート制限は、パブリック API とプライベート サービスの異なる制限など、ユースケースに基づいて調整できます。
  4. スケーラビリティ: レート制限メカニズムは、特にロード バランサーやリバース プロキシと組み合わせた場合、最新のインフラストラクチャに合わせて拡張できます。

他のテクニックとの比較

  1. ファイアウォール ルール: 事前定義されたルールに基づいてネットワーク レベルでトラフィックをブロックします。大規模なフィルタリングには効果的ですが、柔軟性が低く、誤検知の際に正規のユーザーをブロックする可能性があります。
  2. コンテンツ配信ネットワーク (CDN): トラフィックを複数のサーバーに分散します。 CDN は DDoS の影響を軽減するのには優れていますが、アプリケーション レベルで不正なトラフィックに対処することはできません。
  3. 作業証明 (PoW): クライアントはサーバーにアクセスする前に計算パズルを解く必要があります。効果的ではありますが、正規ユーザーにとっては遅延が増加し、クライアントにとってはリソースを大量に消費する可能性があります。
  4. レート制限: きめ細かい制御が可能で、拡張性が高く、大幅なオーバーヘッドが追加されません。多くの場合、これはアプリケーション レベルのエンドポイントを保護するための最良の選択です。

実装

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)`
ログイン後にコピー

}

説明

  1. 訪問者マップ: 各 IP アドレスのレート リミッターを維持します。訪問者マップには、IP アドレス (r.RemoteAddr) をキーとしたこれらのリミッターが保持されます。リクエストが受信されると、getVisitor 関数は IP にリミッターがすでに存在するかどうかを確認します。
  2. リミッターの作成: 各リミッターは、バースト 5 で 1 秒あたり 1 リクエストを許可します。リミッターが存在しない場合は、特定のルール (バースト容量 5 で 1 秒あたり 1 リクエスト) で新しいリミッターが作成されます。リミッターは、初期のリクエストのバーストをある程度許可しますが、その後は一定のレートを強制します。
  3. 自動クリーンアップ: goroutine は 1 分後にアイドル リミッターをクリーンアップしてメモリを節約します。メモリの増加を防ぐために、コードにはクリーンアップ メカニズムが含まれています。新しいリミッターが作成されるたびに goroutine が開始され、非アクティブ状態が 1 分間待機してから、対応するエントリを訪問者マップから削除します。これにより、リミッターがアクティブなクライアントに対してのみ保持されることが保証されます。
  4. レート制限ロジック: ハンドラーは、リミッターがリクエストを許可するかどうかを確認します。 リクエストが定義された制限を超えると、429 Too Many Requests エラーが返されます。それ以外の場合は、リクエストを処理します。

Go の IP ごとのレート制限は、アプリケーション レベルで DDoS 攻撃を軽減する優れた方法です。トラフィックを正確に制御し、悪意のあるユーザーを効果的に抑制しながら、正規のユーザーがサービスにアクセスできるようにします。

このアプローチは、正規のユーザーに影響を与えることなく不正な IP を効率的に抑制し、DDoS 攻撃を軽減するためのスケーラブルでメモリ効率の高いソリューションを提供します。

以上がレート制限を使用して Go で DDoS 攻撃を阻止する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート