2009-04-04 14 views
4

私は、着信接続をリッスンするソケットを作成するために、Winsock API(CAsyncSocketではなく)を使用しています。C++ Winsock API接続を受け入れる前にクライアントIPを接続する方法は?

誰かが接続しようとすると、接続を受け入れる前にIPアドレスを取得するにはどうすればよいですか?私は特定のIPアドレスからの接続だけを受け入れるようにしようとしています。

おかげ

答えて

0

接続

編集、それが許可されていない場合、IPを見て、接続を受け入れる閉じる:

私はあなたを想定していますが、TCP接続の話をしています。ポートをリッスンしてクライアントからの接続が受信されると、APIはTCP 3ウェイハンドシェイクを実行し、クライアントはこのポートがリッスンされていることを認識します。

最初にIPアドレスを見て決定できるように、パケットの送信(つまり接続の受け入れ)を防ぐ方法があるかどうかはわかりません。

私が考えることができる唯一の方法は、ネットワーク層でソースIPに基づいてパケットフィルタリングを行うことです(ファイアウォールを使用するなど)。

1):私は、リモートのIPアドレスを確認するために、接続を許可したくない理由

1

つの理由。クライアントは、このポートにリスニングソケットがあることを確認します。クライアント接続を拒否することにした場合、このポートでリスンするソケットがあることを知らせたくありません。

2)。この手法は効率的ではなく、より多くのCPU、RAM、およびネットワークの使用を必要とします。サービス拒否攻撃の場合はそれほど良くありません。

1

ATMを使用する場合、CONNECT ACKパケットは、最終クライアントからではなく、最新のスイッチから送信されます。したがって、ソケット上でaccept()を呼び出してから、アドレス(渡されたaddr_familyに基づいて)を調べ、その時点でソケットを閉じなければなりません。リクエスタに到達するまでには、たぶん失敗するでしょう。

あなたはこれがどれくらいのリソースを占めるかはわかりませんが、接続を受け入れることは非常に低いレベルであり、実際には問題にはなりません。それをドロップするのはかなり簡単です。

DoS攻撃を受けた場合、コードはあらかじめ設定された時間だけ待機して終了することができるため、攻撃者は心配しても失敗することがあります。

クライアントがソケットリスニングを知っているかどうかは本当に重要ですか? telnetを使ってポート137のlocalhostに接続し、Windowsのファイル共有が接続をどのくらい遅くしているかを見てみましょう。(有効にしておけば、正しいポート番号..hh ..)

しかし、SOCKETレベルでは、あなたが望むことをすることはできません。あなたは、TCPレベルに下がって、着信接続要求を見て、そこで彼らと対処することを話しています。

これは実行できますが、これを行うにはカーネルドライバが必要です。私はあなたがユーザーモードでこれを全く行うことができないかどうかはわかりません。

これでカーネルのヘルプが必要な場合は、お知らせください。私はあなたにいくつかの例や指導を与えることができるかもしれません。

ちょうど私の自身の2セント、およびIMVHO ...

6

SO_CONDITIONAL_ACCEPTソケットオプション。 Here

また、Vistaだけでなく、XPやServer 2003でも利用できることは間違いありません。

+0

本当に、[リッスンソケットを隠していますが] [SO_CONDITIONAL_ACCEPTを有効にするという欠点は、一般的にこの制限を上回ります[アプリケーションはTCP/IPスタックではなく、そのためにDoS SYN攻撃を処理する必要があるため自分の。] –

関連する問題