Winsock API (CAsyncSocket ではない) を使用して、着信接続をリッスンするソケットを作成しています。
誰かが接続を試みたとき、接続を受け入れる前に IP アドレスを取得するにはどうすればよいですか? 特定の IP アドレスからの接続のみを受け入れるようにしようとしています。
ありがとう
Winsock API (CAsyncSocket ではない) を使用して、着信接続をリッスンするソケットを作成しています。
誰かが接続を試みたとき、接続を受け入れる前に IP アドレスを取得するにはどうすればよいですか? 特定の IP アドレスからの接続のみを受け入れるようにしようとしています。
ありがとう
リモート IP アドレスを確認するために接続を受け入れたくない理由は 2 つあります。
1)。クライアントは、このポートにリッスン ソケットがあることを認識します。クライアント接続を拒否することにした場合、このポートでリッスンしているソケットがあることを彼らに知られたくありません。
2)。この手法はそれほど効率的ではなく、より多くの CPU、RAM、およびネットワークを使用する必要があります。そのため、サービス拒否攻撃の場合には適していません。
ATM を使用する場合、CONNECT ACK パケットは、エンド クライアントではなく、最新のスイッチから送信されます。したがって、ソケットで accept() を呼び出し、(渡された addr_family に基づいて) アドレスを確認し、その時点でソケットを閉じる必要があります。リクエスタに到達するまでに、おそらく失敗するだけです。
また、これがどれだけのリソースを消費すると思うかはわかりませんが、接続の受け入れは非常に低いレベルであり、実際には問題にはなりません. それらを落とすのはとても簡単です。
DoS 攻撃を受けた場合、コードはあらかじめ設定された時間リッスンを停止する可能性があるため、心配している場合、攻撃者は失敗するだけです。
クライアントがリッスンしているソケットがあることを知っているかどうかは本当に重要ですか? telnet を使用してローカルホストにポート 137 で接続してみて、Windows でのファイル共有が接続を切断する速さを確認してください... (有効にしていて、正しいポート番号を覚えていれば..へー..)
しかし、SOCKET レベルでは、やりたいことはできません。TCP レベルに到達し、着信接続要求を見て、そこで処理することについて話しているのです。
これは実行できますが、それを実行するためのカーネル ドライバーについて話しているのです。ユーザーモードでこれを行うことができるかどうかはわかりません。
これについてカーネルの助けが必要な場合は、私に知らせてください。いくつかの例またはガイダンスを提供できる場合があります。
ちょうど私自身の 2 セントと IMVHO...
接続を受け入れ、IP を確認し、許可されていない場合は接続を閉じます
編集:
TCP接続について話していると思います。ポートをリッスンし、接続がクライアントから来ると、API は TCP 3 ウェイ ハンドシェイクを実行し、クライアントはこのポートがリッスンされていることを認識します。
最初にIPアドレスを見てから決定できるように、パケットの送信を防ぐ(つまり、接続を受け入れる)方法があるかどうかはわかりません。
私が考えることができる唯一の方法は、ネットワーク層でソース IP に基づいてパケット フィルタリングを行うことです (たとえば、ファイアウォールを使用します)。