4

ポートスキャンについての意見があります。JavaでいくつかのIPアドレスのUDPポートをスキャンしています。私のプログラムでは(すべてがOKであると仮定して)、開いているUDPポートを1つしか見つけることができません。一方、「nmap」を介したポートスキャンでは、4つの開いているUDPポートを取得します。Javaコードで複数のポートが見つからない理由を誰かに教えてもらえますか?ちなみに、コードで真のオープンポートを見つけることができます。

int startPortRange=1;
    int stopPortRange=1024;
    InetAddress address = InetAddress.getByName("bigblackbox.cs.binghamton.edu");
    int counter=0;
    for(int i=startPortRange; i <=stopPortRange; i++)
    {
        counter++;      
       try{


            byte [] bytes = new byte[128];
            DatagramSocket ds = new DatagramSocket();
            DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
            ds.setSoTimeout(100);
            ds.connect(address, i);
            ds.send(dp);
            ds.isConnected();
            dp = new DatagramPacket(bytes, bytes.length);
            ds.receive(dp);
            ds.close();
            System.out.println("open");
            System.out.println(counter);
        }
        catch(InterruptedIOException e){
            //System.out.println("closed");
        }
        catch(IOException e){
            //System.out.println("closed");
        }       
    }

上記のコードの出力は135オープンです

nmapを使用してコマンドラインで同じ操作を行うと、開いているポートが増えます。新規ユーザーのため、画像をアップロードできませんでした。ありがとうございました ここに画像の説明を入力してください

4

1 に答える 1

4

少なくとも以下を提供しない限り、具体的な答えを提供することは不可能です。

  • プログラムのソースコード。

  • 取得している(誤った)出力の例。

  • 同じシナリオで期待される出力。

この情報がなければ、何が悪いのかを伝える方法はありません。私たちが知っている限りでは、開いているポートを見つけた後、プログラムが途中で終了するという単純なケースでさえあり得ます。または、最後に見つかった開いているポートのケースが、表示される前に前のエントリのエントリを上書きしています。

いずれにせよ、Wiresharkなどのネットワークスニファを使用して送受信されているものを調査することは価値があるかもしれません。セッションをプログラムによって作成されたセッションと比較することにより、問題を特定するのに役立ついくつかの重要な違いを見つけることができる場合があります。nmap

編集:

コードを見て、と比較したnmapところ、aのケースを閉じたポートとして誤って処理しているようですがSocketTimeoutException、送信したパケットへの応答を拒否するサーバーのポートである可能性があります。

編集2:

これが完全な話です:

ポートが適切に閉じられると、サーバーは、ポート到達不能エラーコードを含むICMP宛先到達不能パケットを送り返します。Javaは、このエラーを、閉じたポートを示していると正しく見なすエラーと解釈します。IOException

一方、ポートが開いていると、サーバーから2つの異なる応答が発生する可能性があります。

  • サーバーはUDPパケットを送り返します。これはプログラムによって受信され、ポートが開いていることを明確に示します。たとえば、DNSサーバーは、多くの場合、フォーマットエラー応答で応答します。nmapこれらのポートがであることが示されていますopen

  • 提供されたサービスに対して不正な形式であるため、サーバーはプローブパケットを無視します。これにより、ネットワークタイムアウトが発生SocketTimeoutExceptionし、プログラムにが発生します。

残念ながら、ネットワークタイムアウトが原因で、アクティブなサーバーが不正な形式のプローブパケットを無視したためか、パケットフィルタがプローブを切断したためかを判断する方法はありません。これが、nmapタイムアウトしたポートをとして表示する理由open|filteredです。

于 2012-03-02T01:14:29.260 に答える