MySQLデータベースのSYNフラッディング問題を解決する

MySQLデータベースのSYNフラッディング問題を解決する

Syn 攻撃は、最も一般的で最も簡単に悪用される攻撃方法です。TCP プロトコルの欠陥を利用して、偽造された TCP 接続要求を大量に送信します。多くの場合、偽の IP を使用して大量の SYN パケットが送信されます。攻撃を受けたサーバーは SYN+ACK で応答します。相手は偽の IP であるため、パケットを受信することはなく、応答しません。その結果、攻撃を受けたサーバーは SYN_RECV 状態で大量のセミ接続を維持し、デフォルトの 5 つの応答ハンドシェイク パケットを再試行し、TCP 待機接続キューをいっぱいにしてリソースを使い果たし、通常のビジネス要求が接続できなくなります。

Syn 攻撃はアプリケーション サーバーでよく発生し、データベース サーバーはイントラネット内にあるため、同様の攻撃に遭遇する可能性は低いです。ただし、アプリケーションがデータベースに正しく接続されていない場合、データベース側で Syn 攻撃とみなされ、接続が拒否されることがあります。

[問題の説明]

データベースが突然接続を拒否し、アプリケーションがエラーを報告します。問題が発生したとき、データベース サーバーのオペレーティング システム ログ (/var/log/messages) に次のエラー メッセージが表示されます。

カーネル: ポート 3306 で SYN フラッディングの可能性があります。Cookie を送信しています。

【問題分析】

問題が発生した時点で、データベース監視インジケーターから判断すると、Threads Connected インジケーターが増加しました。これも非常に明白です。データベースの場合、Syn Flooding は、アプリケーションが突然データベースへの接続を開始し、オペレーティング システムがそれを処理できないため、Syn Flooding を報告することを意味します。データベースのパフォーマンス インジケーターの観点から見ると、接続数は間違いなく急増します。解決策は、これらの突然の増加がどこから来ているのかを分析し、ピークを平滑化し、谷を埋めて、接続をより安定させることです。

【解決】

データベース サーバー側で、次の調整を行います。この調整は、TCP ハーフ接続バッファを増やすことを意味します。デフォルト値は 2048 ですが、突然の負荷に耐えるシステムの能力を高めるために 8192 に調整します。 Tcp_syn_retires と Tcp_synack_retires のデフォルト値は 5 です。これは、再試行を終了する前にサーバーが 5 つのパケットを送信する必要があることを意味します。このパラメータを 2 に調整します。再試行は 1 回だけなので、エラー パケットをできるだけ早く解決して、キャッシュされた接続の数を減らすことができます。

エコー 8192 > /proc/sys/net/ipv4/tcp_max_syn_backlog
エコー 2 > /proc/sys/net/ipv4/tcp_syn_retries
エコー 2 > /proc/sys/net/ipv4/tcp_synack_retries

このパラメータ調整は再起動せずにすぐに有効になります。もちろん、サーバーを再起動すると、これらのパラメータはデフォルト値に戻ります。この調整により、データベースのストレス耐性は強化されましたが、問題は完全に解決されませんでした。

クライアント側でも対応する調整を行います。

データベース接続数への負荷を軽減するために、通常は接続プールを次のように構成することをお勧めします。

testWhileIdle="false"。アイドル時に接続文字列の健全性をチェックしない
minIdle="0"。接続プール内のアイドル接続の最小数
maxAge="30000"です。リンクは一定のミリ秒数後にリサイクルできます。
初期サイズ="1"。接続プール内の初期接続の最小数
timeBetweenEvictionRunsMillis="5000"。リサイクルスレッドの実行間隔(ミリ秒)

現在のシナリオでは、minIdle パラメータを 0 から 5 に増やすことをお勧めします。接続プールには通常 5 つのアイドル接続があるようにします。このようにして、データベースへの要求が開始されると、これらの 5 つのアイドル接続が最初に使用されます。山を削り谷を埋める効果を実現します。もちろん、副作用としてデータベース接続の数が増加します。適切な調整量は、実際のデータベース接続負荷に基づいて決定する必要があります。 .NET プログラムの場合、調整可能な対応する接続​​プール パラメータもあります。minPoolSize パラメータは適切に変更でき、5 に調整することもできます。

この調整を行うと、基本的にデータベースの Syn Flooding 問題の大部分は解決できます。

もちろん、これらはシステムをわずかに改善できるだけのチューニング方法にすぎません。ストレス耐性を向上させます。最終的な分析は、接続圧力がどこから発生するかによって異なります。そして、データベースへの大量の接続をバースト的に確立する必要がある理由。このような緊急事態にデータベースを使用することは適切でしょうか?別の方法としては、Redis を前面のバッファとして使用することです。データベースへの突然の接続要求を避けてください。これにはアプリケーションの変換が含まれます。

要約する

上記は、MySQL データベースの Syn Flooding の問題を解決するための編集者による紹介です。皆様のお役に立てれば幸いです。ご質問がある場合は、メッセージを残していただければ、すぐに返信いたします。また、123WORDPRESS.COM ウェブサイトをサポートしてくださっている皆様にも感謝申し上げます。
この記事が役に立ったと思われた方は、ぜひ転載していただき、出典を明記してください。ありがとうございます!

以下もご興味があるかもしれません:
  • bitronix を使用して MySQL に接続するときの MySQLSyntaxErrorException の解決方法
  • Linux corosync+pacemaker+drbd+mysql の詳細なインストール
  • MySQL エラー: type=InnoDB ソリューションの近くで使用する正しい構文の MySQL サーバー バージョン
  • MySQL 5.7 拡張エディション セミ同期レプリケーション パフォーマンスの最適化
  • Coolcode から SyntaxHighlighter および MySQL 正規表現実装分析

<<:  Vue Element-ui フォーム検証ルールの実装

>>:  Linux の一般的な基本コマンドと使用方法

推薦する

HTML の相対パスと絶対パスの違いの分析

HTML 初心者は、ファイルを正しく参照する方法という問題によく遭遇します。たとえば、HTML ペー...

CSS の 6 つの重要なセレクター (3 秒で覚える)

出典: https://blog.csdn.net/qq_44761243/article/deta...

MySQL 8.0.13 で日付を 0000-00-00 00:00:00 に設定すると発生する問題を解決する

データベース操作を学び始めたばかりです。今日、データを保存していたところ、エラーが発生していることに...

HTML テーブルレイアウト例の説明

HTML ドキュメント内の要素は次々に配置され、ブロックレベル要素の前後に改行が追加されるだけで、合...

JavaScriptはキュー構造プロセスを実現する

目次1. キューを理解する2. カプセル化キュー3. 太鼓をたたいて花を渡す場合1. キューを理解す...

SQL と NoSQL の違いのまとめ

主な違い: 1. タイプSQL データベースは主にリレーショナル データベース (RDBMS) とし...

Vue3+Vue-cli4 プロジェクトで Tencent スライダー検証コードを使用する方法

導入:従来の画像検証コードと比較して、スライダー検証コードには次の利点があります。サーバーは検証コー...

MySQL 5.7 のインストールと設定方法のグラフィックチュートリアル

このチュートリアルでは、MySQL 5.7のインストールと設定方法を参考までに紹介します。具体的な内...

MySQL がユーザー名とパスワードの漏洩を引き起こす可能性のある Riddle の脆弱性を公開

MySQL バージョン 5.5 および 5.6 を標的とする Riddle 脆弱性により、中間者攻撃...

MySQL の 6 つの一般的な制約タイプの詳細な説明

目次序文1.nullでない2. ユニーク3. デフォルト4.主キー自動増分主キー5. 外部キー6.チ...

メンテナンス可能なJSコードの書き方を教えます

目次保守可能なコードとは何ですか?コード規約1. 読みやすさ2. 変数と関数の命名3. 透過的な変数...

CSS3 box-shadow プロパティの詳細な例

CSS3 - 影の追加(ボックスシャドウの使用) CSS3 - div またはテキストに影を追加する...

MySQLテーブル名の大文字と小文字を区別しない設定方法の詳細な説明

デフォルトでは、Linux の MySQL はテーブル名の大文字と小文字を区別します。 MySQL ...

HTML+CSS ボックスモデルの例 (円、半円など) 「border-radius」はシンプルで使いやすい

多くの友人は、フロントエンドを学習するときに、ボックス モデルがデフォルトで正方形であることに気付き...

Flask アプリケーションの Docker デプロイ実装手順

1. 目的Flask アプリケーションをローカルで作成し、Docker でパッケージ化し、独自のサー...