ローカル ネットワーク上で基本的な要求を処理する複数のサーバーを実行しているとします (たとえば、ホーム ネットワークでは、すべてのマシンが一般に KKKx の形式で IP を持ち、x は可変です)。そのようなサーバーをすべて検出する簡単な方法はありますか? 特定の Java サーバー アプリケーションを実行しているネットワーク上の各 IP を見つける必要があります。
6 に答える
Java アプリケーション内のソリューションをお探しですか? 単に 1 回限りの解決策を探している場合は、nmap が機能するはずです。
ローカル ネットワークの形式が 192.*.*.* の場合は、これを試してください (ルートとして実行する必要があるため、sudo を追加しました)。
sudo nmap -vv -sS -O -n "192.168.1.1/24"
つまり、クラス C のネットワークがあります... 1 から 254 までの各 IP アドレスで特定のサーバー アプリケーション ポートを開こうとするだけです。そのアプリケーションに期待することを行います。
すべての Web サーバーが の固定ポートをリッスンするわけではないため、80
ポートをスキャンする必要があります。すべてのポートのソケットをループで開いて (そして閉じて!)、これに使用できますjava.net.Socket
。/
成功した場合は、問題の IP/ポートで単純な GET リクエストを発行します。これを使用できますjava.net.URLConnection
。(ステータス コードに関係なく) 有効な HTTP 応答を受信した場合、それは Web サーバーです。サーバーの種類Server
は、HTTP 応答のヘッダーによって判別できます。ただし、デフォルトの応答ヘッダーがサーバー管理者によって偽装/削除/変更される可能性があることを考慮する必要があります。
一部のファイアウォールは、ポート スキャナーのスキャン パターンを認識し、これをブロックする場合があることに注意してください。
これを実現するには 2 つの基本的な方法があり、どちらの方法でも、確認したい各ホストとの間でパケットを送受信する必要があります。
最も簡単な方法は、通常どおり、目的のポートへの TCP 接続を確立しようとすることです。
より複雑で洗練されたアプローチですが、実行に関しては高速ですが、SYN パケットを送信し、応答パケットを待ちます。応答が SYN/ACK の場合は、ポートが開いている (接続を待っている) ことを意味し、それ以外の場合は開いていないことを意味します。ただし、Java はこれに必要な API ( raw socketを参照) を提供していません。ライブラリ/ラッパーを見つけるか、C と JNI を使用して作成する必要があります。
2 番目のオプションの詳細については、こちらをお読みください。
IP 範囲をスキャンし、次のようなコードを使用してポート 80 へのソケット接続をテストします。
try {
s = new Socket(addr,80);
System.out.println("Webserver found on IP:" + addr );
s.close();
}
catch (IOException ex) {
System.out.println("Webserver NOT found on IP:" + addr );
}