5

ネイティブC++を使用してリモートUDPポートが開いているかどうかを確認するにはどうすればよいですか?UDPはコネクションレス型であるため、呼び出しconnect()は役に立ちません。ローカルではないのでバインドしてみません。nmapも示すことはできません。(ただしnetstat、見つけることはできますが、開いているポート/ファイルに関する内部情報を調べていると思います)。とにかくそれを検出することはありますか?ネットワークレベルでレイヤーを下に移動した場合、C ++でICMPメッセージを送信して、ポート到達不能ステータスを確認することはできますか?つまり、ポートのステータスに関する十分な情報が得られるでしょうか。

プラットフォームはLinuxです。

4

2 に答える 2

5

リモートマシンのUDPポートがファイアウォールを通過しているかどうか、および/またはアプリケーションが実行されているかどうかを判断しようとしていると思います。

これを確実に判断することはできません。最も近い方法は、一連の小さなデータグラムをそのアドレスとポートに、約1秒間隔で約10秒間送信してみることです。

ポートをブロックしているファイアウォールがなく、アプリケーションが実行されていない場合、リモートシステムが送り返す可能性がありますICMP_UNREACH_PORT(ポートに到達できません)。ICMP_UNREACH_HOSTブロッキングファイアウォールがなく、リモートシステムがダウンしている場合、ルーターがまたはを送り返す可能性がありますICMP_UNREACH_NET。ファイアウォールがあなたをブロックしている場合、それは返送するかもしれませんICMP_UNREACH_FILTER_PROHIBが、ほとんどのファイアウォールは何も返送しません。

ほとんどのファイアウォールがその種のICMPフィードバックをブロックするため、これらのいずれかを取り戻す可能性はかなり低くなります。ICMPメッセージが戻ってきたとしても、rootとして実行していない限り、Linuxは通常それを表示しません。一部のオペレーティングシステムは、同じアドレス/ポートの隣の障害としてICMPエラーを報告します。そのためsendto()、メッセージを数回繰り返す必要があります。ただし、そうでないものもあります。その場合は、特定のICMPポートを開いて、リターンメッセージを解析する必要があります。

どういうわけかICMPメッセージを受け取ったとしても、それらは信頼できないことを理解してください。たとえばICMP_UNREACH_PORT、アプリケーションがリッスンしているだけでなく、積極的にデータを送信している場合でも、取得できます。(それはまれですが、私はそれが起こるのを見ました。)

アプリケーションが特定のポートで実行されていて、そのアプリケーションが何であるかを知っていて、そのアプリケーションが応答するメッセージを作成する方法を知っている場合は、そうして応答を取得することが、そのポートを示す最良の指標です。開いています。ただし、応答がないということは何の意味もありません。ポートがブロックされているか、アプリケーションが実行されていないか、メッセージが気に入らなかった可能性があります。

結論:いいえ、そうではありません。

于 2012-06-04T19:05:59.017 に答える
0

リモートポートがUDPデータグラムを受信する準備ができているかどうかを確認する防弾方法はありません。UDPはコネクションレス型であるため、リモートホストが自分にとって意味のある何かに応答しているかどうかを判断できます。(ポートスキャナーのように)ヒントを得る方法はあるかもしれませんが、それは私が本番コードで信頼するものではありません。

于 2012-06-04T18:54:17.873 に答える