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

GO言語で文字列パッケージをマスターすると、テキスト処理機能と開発効率が向上します。 1)コンテナ機能を使用してサブストリングを確認し、2)インデックス関数を使用してサブストリング位置を見つけ、3)関数を効率的にスプライスストリングスライス、4)機能を置き換えてサブストリングを置き換えます。空の文字列や大きな文字列操作のパフォーマンスの問題をチェックしないなど、一般的なエラーを避けるように注意してください。

文字列の操作を簡素化し、コードをより明確かつ効率的にすることができるため、GOの文字列パッケージを気にする必要があります。 1)文字列を使用して、弦を効率的にスプライスするために参加します。 2)文字列を使用して、空白の文字で文字列を分割します。 3)文字列を介してサブストリング位置を見つけます。Indexと文字列lastindex; 4)文字列を使用して、文字列を置き換える。 5)文字列を使用して、ビルダーを効率的にスプライスします。 6)予期しない結果を避けるために、常に入力を確認してください。

theStringspackageIngoisESSENTINEFOREFFSTRINGMANIPULATION.1)ITOFFERSSSIMPLEYETPOWERFULFUNCTIONS FORTOSSCHECKINGSUBSTRINGSNINGSTRINGS.2)ITHANDLESUNICODEWELL、ITHANDLESUNICODEWELL

whendeciding botedego'sbytespackageandstringspackage、usebytes.bufferbinarydataandstrings.builderforstringoperations.1)usebytes.bufferforkithbyteslices、binarydata、appendingdatatypes、およびwritioio.writioio.writioio.writioio.writioio.

Goの文字列パッケージは、さまざまな文字列操作機能を提供します。 1)文字列を使用して、サブストリングを確認します。 2)文字列を使用して、ストリングをサブストリングスライスに分割します。 3)文字列を通して文字列をマージします。 4)文字列または文字列を使用して、文字列の最初と端でブランクまたは指定された文字を削除します。 5)指定されたすべてのサブストリングを文字列に置き換えます。ReplaceAll。 6)文字列を使用して、hasprefixまたは文字列hassuffixを使用して、文字列の接頭辞または接尾辞を確認します。

GO言語文字列パッケージを使用すると、コードの品質が向上します。 1)文字列を使用して()join()を使用して、パフォーマンスのオーバーヘッドを避けるために、文字列アレイをエレガントに接続します。 2)strings.split()とstrings.contains()を組み合わせて、テキストを処理し、ケースの感度の問題に注意を払います。 3)文字列の乱用を避け、replace()を回避し、多数の置換に正規表現を使用することを検討します。 4)文字列を使用して、ビルダーを使用して、頻繁にスプライシング文字列の性能を向上させます。

GoのBYTESパッケージは、バイトスライスを処理するためのさまざまな実用的な機能を提供します。 1.bites.containsは、バイトスライスに特定のシーケンスが含まれているかどうかを確認するために使用されます。 2.bites.splitは、バイトスライスをスモールピースに分割するために使用されます。 3.bites.joinは、複数のバイトスライスを1つに連結するために使用されます。 4.bites.trimspaceは、バイトスライスのフロントブランクとバックブランクを削除するために使用されます。 5.バイト。エクアルは、2つのバイトスライスが等しいかどうかを比較するために使用されます。 6.bytes.indexは、大規模なスライスでサブスライスの開始インデックスを見つけるために使用されます。

エンコード/binaryPackageIngoisESSENTINESTENTINESTINESTIDANDARDIZEDWAIDTOREADANDWRITEBINIRYDATA、クロスプラットフォームコンパティビティアンドハンドリングの可能性を確保することを確認します


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

Dreamweaver Mac版
ビジュアル Web 開発ツール

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

SublimeText3 Linux 新バージョン
SublimeText3 Linux 最新バージョン

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

SAP NetWeaver Server Adapter for Eclipse
Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。
