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

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

Nov 30, 2024 am 01:22 AM

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 サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

Golang vs. Python:パフォーマンスとスケーラビリティ Golang vs. Python:パフォーマンスとスケーラビリティ Apr 19, 2025 am 12:18 AM

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

Golang and C:Concurrency vs. Raw Speed Golang and C:Concurrency vs. Raw Speed Apr 21, 2025 am 12:16 AM

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

ゴーを始めましょう:初心者のガイド ゴーを始めましょう:初心者のガイド Apr 26, 2025 am 12:21 AM

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

Golang vs. C:パフォーマンスと速度の比較 Golang vs. C:パフォーマンスと速度の比較 Apr 21, 2025 am 12:13 AM

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

Golangの影響:速度、効率、シンプルさ Golangの影響:速度、効率、シンプルさ Apr 14, 2025 am 12:11 AM

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

Golang vs. Python:重要な違​​いと類似点 Golang vs. Python:重要な違​​いと類似点 Apr 17, 2025 am 12:15 AM

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

GolangとC:パフォーマンスのトレードオフ GolangとC:パフォーマンスのトレードオフ Apr 17, 2025 am 12:18 AM

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

パフォーマンスレース:ゴラン対c パフォーマンスレース:ゴラン対c Apr 16, 2025 am 12:07 AM

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

See all articles