5

私は、Richard Stevens によるUNIX Network Programming Volume 1 に取り組んでおり、Telnet プロトコルを使用する TCP Echo クライアントを作成しようとしています。私はまだ初期段階にあり、読み書き機能を書き込もうとしています。

マルチクライアントである必要があり、Berkeley Sockets ライブラリを学習しようとしているときに C++ スレッドの学習に取り組みたくないため、I/O 多重化と Select 関数を使用するように記述したいと思います。同時に。I/O 多重化に関する章の最後に、Stevens は DOS 攻撃に関する小さなセクションを持っており、私が使用することを計画していた方法は、接続後に 1 バイトを送信するだけでハングする DOS 攻撃に対して脆弱であると述べています。その後、彼は 3 つの可能な解決策について言及しています。つまり、ノンブロッキング IO、スレッド化 (アウト)、および I/O 操作にタイムアウトを設定することです。

私の質問は、そのような攻撃を回避する他の方法はありますか? そうでない場合、これらのうちどれが最高ですか? 操作にタイムアウトを設定するセクションをざっと見ましたが、やりたいことのようには見えません。それを行うために彼が提案する方法はかなり複雑に見えます。私は NIO の章をちらりと見ただけで、今のところそれが進むべき道のように見えますが、この章をさらに数時間掘り下げる前に、これを回避する他の方法があるかどうかを確認したいと思います.

何か案は?

4

5 に答える 5

4

必読:C10K問題

接続ごとにスレッド(またはプロセス)を使用すると、非常に簡単なコードになります。接続数の制限は、実際には、システムが快適にマルチタスクできるスレッド数の制限です。

非同期IOを使用してすべてのソケットを単一のスレッドに配置することは、それほど単純なコードではありませんが(libeventとlibev2でうまくラップされます)、はるかにスケーラブルです-システムが許可する開いているファイルハンドルの数によって制限されます-たとえば、最近のLinuxビルドでは-それは数百万単位で測定できます!このため、ほとんどのWebサーバーおよびその他のサーバーは非同期IOを使用します。

ただし、サーバーは依然として使い果たされる可能性のある有限のリソースであり、新しい接続を処理するための容量が単に不足するよりも多くの厄介な攻撃があります。

ファイアウォールと損傷の制限(バックアップ、DMZなど)は、実際のインターネット向けサービスに不可欠な要素です。

于 2009-08-22T22:43:22.083 に答える
3

...そのような攻撃を回避する他の方法はありますか?

はい、非同期 I/Oは別の一般的なアプローチです。

ブロッキングread()によって実行が無期限に停止される可能性があるという問題がある場合、一般的な対策は次のとおりです。

  1. 複数の実行スレッドを持つ

    マルチスレッド、マルチプロセス、両方。

  2. ブロッキング操作の時間制限

    例: 瞬間的 (ノンブロッキング I/O)、またはそうでない ( SO_RCVTIMEOalarm()など)

  3. 非同期で操作する

    例えば、aio_read

...これらの中で最高のものはどれですか?

select()初心者には、時間制限のある/と組み合わせたノンブロッキング I/O をお勧めしpoll()ます。アプリケーションは、接続が「十分な時間」内に「十分なデータ」(たとえば、行全体) を生成したかどうかを追跡できます。

これは強力で、移植性が高く、一般的な手法です。

ただし、より適切な答えは、「場合による」です。プラットフォームのサポートと、さらに重要なこととして、これらの選択による設計への影響は、ケースバイケースで評価する必要があります。

于 2009-08-23T03:07:12.917 に答える
2

ソケット プログラミングの学習を始めたばかりの場合は、ソケットの基本的な機能に集中して、まだセキュリティの問題についてあまり心配しない方がよいでしょう。いくつかのクライアント/サーバー アプリケーションを作成し、それらがどのように機能するかを完全に理解すると、それらがどのように機能しないかを理解できるようになります。

インターネットに接続されたネットワーク アプリケーションを悪意のあるクライアントから保護することは、簡単なことではありません。おそらく、あなたが言及したすべての高度な手法と、さらにいくつかの手法が必要になります。たとえば、一部の責任をアプリケーション コードからルーターまたはファイアウォール レベルに移すのが一般的です。信頼できるホストのみにアクセスを制限したり、過剰な接続試行を検出してトラフィックがアプリケーションに到達する前にそれらを抑制またはブロックしたりできます。

于 2009-08-22T22:20:14.390 に答える
1

私の質問は、そのような攻撃を回避する他の方法はありますか?

サーバーの場合、アプリケーションレベルのタイマーが必要です。

  • 接続ごとの入力データバッファ
  • ダムソケット読み取りコードは、ソケットから入力バッファにデータを読み取ります
  • アプリケーション固有のコードは、入力バッファーの内容を解析します

アプリケーション固有のコードは、「長すぎる」アイドル状態が許可されている入力バッファーに関連付けられた接続を終了する可能性があります。

これを行うことは、非同期I/Oまたは専用のI/Oスレッドを意味します。

于 2009-08-22T22:50:19.633 に答える
1

これを支援するために私が以前に行ったこと(1997年頃:)は、一定時間内にマジックナンバーを送信することを要求することでした。そうしないと、接続が閉じられました。

非同期接続の場合、ソケットはブロックされず、有効なコマンドを送信していない現在の接続のリストをポーリングできるスレッドが必要になります。約 20 ミリ秒後にメッセージが受信されなかった場合これは有効なコマンドを意味し、その接続を閉じて、必要なクリーンアップを行います。

これは完璧ではありませんが、現在の懸念事項を解決するのに役立ち、接続が多すぎてリソースが消費されないようにすることができます.

そのため、メイン スレッドとクリーンアップ用の 2 番目のスレッドが必要になるため、シングル スレッドではありません。

于 2009-08-23T01:59:07.923 に答える