この記事は機械翻訳のミラー記事です。元の記事にジャンプするにはこちらをクリックしてください。

眺める: 13773|答える: 0

【安全チュートリアル】 Linux/FreeBSD向けSYNフラッド攻撃、SYNクッキー防御、カーネルパラメータ修正

[リンクをコピー]
掲載地 2014/10/27 21:37:19 | | |

ハッカーこれは望ましく有望なキャリアです。 良いハッカーは評価し、悪いハッカーは嫌いです。 いわゆる悪いハッカーとは、相手側の誰かに残業させるような男のことです。

    SYN:フラッド攻撃は典型的なサービス拒否攻撃です。 いわゆるサービス拒否攻撃は、被害者のホストやネットワークを良好なサービスを提供できなくすることで、間接的に攻撃の目的を達成することを目的としています。 ハッカーは自分たちが公平で有能で勇敢であることを示そうとし、相手に残業を強いるのを好むが、実際には何でもない。

   1: SYNフラッド攻撃とは何か?

    SYNフラッド攻撃は、IPv4のTCPプロトコルの三者ハンドシェイクプロセスを利用します。 このプロトコルでは、一方がもう一方にTCP接続を開始したい場合は、まずTCP SYN(同期)パケットを相手方に送り、相手側が受信後にTCP SYN + ACKパケットを返送し、その後発起側がTCP ACK(ACKnowledge Character)パケットを送り返すため、3回のハンドシェイクが完了します。

    上記のプロセスには、いくつかの重要な概念があります。

    キューは接続されていません: 三者ハンドシェイクプロトコルでは、サーバーは未接続のキューを維持し、各クライアントのSYNパケット(syn=j)に対してエントリを開き、サーバーがSYNパケットを受信したことを示すもので、顧客に確認を発行し、顧客の確認パケットを待ちます。 これらのエントリで識別される接続はサーバー上でSyn_RECV状態にあり、サーバーが顧客からの確認パケットを受け取ると、そのエントリは削除され、サーバーは確立状態に入ります。 言い換えれば、TCPサーバーがTCP SYNリクエストパケットを受け取った後、TCPクライアントにTCP SYN+ACKパケットを送る前に、まずこの手で形成されたTCP接続に対応するデータ領域を割り当てなければなりません。 一般的に、SYNパケットは受信されたがACKパケットはまだ受信されていない接続状態を示します半開口接続(半開き接続)。

    バックログパラメータ:は最大数の未接続キューを示します。

    SYN-ACK 再送信回数サーバーがSYN-ACKパケットを送信した後、顧客確認パケットが受信されない場合、サーバーは最初の再送信を行い、一定期間待機して確認パケットを受け取れず、2回目の再送信を行います。再送回数がシステムで指定された最大再送回数を超えると、システムは半接続キューから接続情報を削除します。 各リパスの待ち時間が必ずしも同じとは限らないことに注意してください。

    半連結生存時間: はセミコネクションキュー内のエントリが存続する最大時間、すなわちサービスがSYNパケットを受け取った時点からパケットが無効と確認されるまでの最大時間であり、時間値はすべての再送リクエストパケットの最大待ち時間の合計です。 時には、半連結したサバイバルタイム、SYN_RECVサバイバルタイムとも呼ぶことがあります。

    最も一般的なSYNフラッド攻撃では、攻撃者が短時間で大量のTCP SYNパケットを被害者に送信し、攻撃者はTCPクライアント、被害者はTCPサーバーとなります。 上記の説明によると、被害者は各TCP SYNパケットに特定のデータゾーンを割り当てますが、SYNパケットが異なる送信元アドレスを持つ場合(攻撃者が偽造しやすいため)です。 これによりTCPサーバーシステムに大きな負荷がかかり、最終的には正常に動作しなくなる原因となります。

    2. SYNクッキーの原則

    SYNフラッド攻撃を効果的に防ぐ方法の一つがSYNクッキーです。 SYNクッキーの理由D。 J. バーンスタインとエリック・シェンクによって発明されました。

    SYNクッキーは、SYNフラッド攻撃を防ぐためにTCPサーバー側の三者ハンドシェイクプロトコルを改良したものです。その原理は以下の通りです。TCPサーバーがTCP SYNパケットを受け取りTCP SYN+ACKパケットを返す場合、専用のデータ領域を割り当てるのではなく、このSYNパケットに基づいてクッキーの値を計算します。 TCP ACKパケットが受信されると、TCPサーバーはそのクッキー値に基づいてTCP ACKパケットの正当性を確認します。 合法の場合は、将来のTCP接続を処理するために専用のデータエリアが割り当てられます。

    LinuxとFreeBSDでSYNクッキーを実装するためのカーネルパラメータの設定方法について話しましょう

    三つ目:Linux設定

    サーバー構成が不十分だと、TCP TIME_WAITソケットの数が20,000から30,000に達し、サーバーが簡単に壊れてしまう可能性があります。 Linuxカーネルパラメータを変更することで、サーバー上のTIME_WAITソケット数を減らすことができます。

    TIME_WAITは以下のコマンドで確認できます:

  1. 以下是代码片段:
  2. netstat -an | grep "TIME_WAIT" | wc -l
コードをコピーします

Linux(例えばCentOS)では、/etc/sysctl.confファイルを修正することでこれを実現できます。

    次の行を追加してください:

  1. 以下是代码片段:
  2. net.ipv4.tcp_fin_timeout = 30
  3. net.ipv4.tcp_keepalive_time = 1200
  4. net.ipv4.tcp_syncookies = 1
  5. net.ipv4.tcp_tw_reuse = 1
  6. net.ipv4.tcp_tw_recycle = 1
  7. net.ipv4.ip_local_port_range = 1024    65000
  8. net.ipv4.tcp_max_syn_backlog = 8192
  9. net.ipv4.tcp_max_tw_buckets = 5000
  10. net.ipv4.tcp_synack_retries = 2
  11. net.ipv4.tcp_syn_retries = 2
コードをコピーします

説明:

net.ipv4.tcp_syncookies = 1 はSYNクッキーが有効であることを示し、これはBOOLEANです。 SYNがキューのオーバーフローを待つ際には、クッキーを有効にして処理し、これにより少数のSYN攻撃を防ぐことができます。デフォルト値は0で、これはキューが閉鎖されていることを意味します。
net.ipv4.tcp_tw_reuse = 1 は再利用が有効であることを示し、これはBOOLEANです。 新しいTCP接続に対してTIME-WAITソケットを再利用可能で、デフォルトは0となり、クロージャーを示します。
net.ipv4.tcp_tw_recycle = 1はTCP接続におけるTIME-WAITソケットの高速リサイクルを可能にすることを意味し、これはBOOLEANであり、デフォルトは0で閉じていることを意味します。
net.ipv4.tcp_fin_timeout = 30 は、ローカルリクエストによってソケットが閉じられた場合、このパラメータがソケットが FIN-WAIT-2 状態にどれくらいの時間留まるかを決定します。 単位は秒単位です。
net.ipv4.tcp_keepalive_time = 1200は、キーパライブが使用された際にTCPがキーパライブメッセージを送信する頻度を示します。 デフォルトは2時間ですが、20分に変更されました。 単位は秒単位です。
net.ipv4.ip_local_port_range = 1024 65000は、外部接続に使用されるポートの範囲を示します。 デフォルトのケースは小さいです:32768から61000、1024から65000に変更されました。
net.ipv4.tcp_max_syn_backlog = 8192はSYNキューの長さを示し、デフォルトで1024です。増加したキューの長さは8192で、接続待ちのネットワーク接続を増やすためです。
net.ipv4.tcp_max_tw_buckets = 5000はシステムが同時に維持TIME_WAITできる最大ソケット数を示し、この数を超えるとTIME_WAITソケットが即座にクリアされ、警告メッセージが印刷されます。 デフォルトは180000で、5000に変更されました。 ApacheやNginxのようなサーバーでは、前述のパラメータでソケット数を減TIME_WAIT良い効果がありますが、Squidの場合はあまり効果がありません。 このパラメータは、Squidサーバーが多数のTIME_WAITソケットによって引きずられるのを防ぐために、最大数のTIME_WAITソケット数を制御します。
net.ipv4.tcp_synack_retriesとnet.ipv4.tcp_syn_retriesはSYNの再試行回数を定義します。

以下のコマンドを実行して設定を有効にしてください:

  1. 以下是代码片段:
  2. /sbin/sysctl -p
コードをコピーします

/etc/sysctl.confを修正したくない場合は、以下のコマンドを使って変更することもできます:

  1. 以下是代码片段:
  2. /sbin/sysctl -w key=value
コードをコピーします

第四に、FreeBSDの下で設定

    yayuの個人的な学習視点:FreeBSDのSynに対する防御はLinuxと同じでない場合があり、パラメータの設定も完全に同じではなく、関連する構成や理解も正しくないかもしれません:)

    TCPリンクには1台ありますMSL(最大セグメント寿命)概念最大発電時間一般的な実装ではMSL値は30秒間測定され、一部の実装では2分かかることもあります。 TCP状態機械における「パッシブシャットダウン」:CLOSE_WAITからLAST_ACKまで、以下のルールがあります。TCPがアクティブシャットダウンを行い、最後のACKを返送すると、接続はMSLの2倍の期間、TIME_WAIT状態にとどまらなければなりません。 これにより、TCPは最後のACKを再度送信できます(もう一方はタイムアウトして最後のFINを再送信します)。

    このルールの存在により、そのアドレス上のリンク(クライアントアドレス、ポート、サーバー側アドレス、ポート)はこの2*MSL時間中に使用できません。 例えば、リンクを作成後に閉じてからすぐに再開すると、ポートは利用できません。

    TIME_WAIT時間は2*MSLです。 ですので、net.inet.tcp.msl を調整することでTIME_WAIT時間を短縮できます。 ウェブサーバーの場合、この値は7500または2000に調整可能です(ウェブアクセス時、ページを4~15秒以上フラッシュできない場合、諦めることも検討できます -_-)

    パラメータ設定の参考:

  1. 以下是引用片段:
  2. net.inet.tcp.syncookies=1
  3. 防止DOS攻击

  4. net.inet.tcp.msl=7500
  5. 防止DOS攻击,默认为30000

  6. net.inet.tcp.blackhole=2
  7. 接收到一个已经关闭的端口发来的所有包,直接drop,如果设置为1则是只针对TCP包

  8. net.inet.udp.blackhole=1
  9. 接收到一个已经关闭的端口发来的所有UDP包直接drop
コードをコピーします

FreeBSDでは、yayuは「/sbin/sysctl -p」のようなコマンドを見つけて/etc/sysctl.confの内容を有効にするものを見つけなかったので、次のコマンドを使いました:

  1. 以下是代码片段:
  2. sysctl net.inet.tcp.syncookies=1 net.inet.tcp.msl=7500 net.inet.tcp.blackhole=2 net.inet.udp.blackhole=1
コードをコピーします






先の:武昌工業大学の学生から報道機関への手紙
次に:大学や大学のホテルでの売春組織の真実を回復せよ 「武昌理工学院:噂は止まる...
免責事項:
Code Farmer Networkが発行するすべてのソフトウェア、プログラミング資料、記事は学習および研究目的のみを目的としています。 上記の内容は商業的または違法な目的で使用されてはならず、そうでなければ利用者はすべての結果を負うことになります。 このサイトの情報はインターネットからのものであり、著作権紛争はこのサイトとは関係ありません。 ダウンロード後24時間以内に上記の内容を完全にパソコンから削除してください。 もしこのプログラムを気に入ったら、正規のソフトウェアを支持し、登録を購入し、より良い本物のサービスを受けてください。 もし侵害があれば、メールでご連絡ください。

Mail To:help@itsvse.com