9

ServerSocket で接続をリッスンする Java アプリ (アプリケーション コンテナーで実行されていない) があります。localhost からの接続のみを受け入れるようにしたいと思います。現在、接続が受け入れられた後、ピア IP をチェックし、ループバック アドレスでない場合は拒否しますが、ピア IP アドレスがスプーフィングされる可能性があることはわかっています。したがって、可能であれば、ループバック インターフェイスのみをリッスンするソケットにバインドすることをお勧めします。これは可能ですか?

bind() を呼び出すときに "127.0.0.1" をローカル アドレスとして指定するなど、いくつかの方法を試しましたが、うまくいきませんでした。前もって感謝します。


ご協力ありがとうございました。これがすべて私の間違いだったことを認めるのは恥ずかしい. 私たちのアプリケーションは 2 つの異なるポートでリッスンします。一方をループバック インターフェイスにバインドし、もう一方をテストしていました。実際に正しいポートに telnet で接続しようとすると、すべて正常に動作します (つまり、"127.0.0.1" へのバインドは想定どおりに動作します)。

ループバック アドレスのスプーフィングについては、その通りです。それを第一の関心事のように聞こえるようにするべきではありませんでした。実際、望ましい動作はローカル接続のみを取得することであり、ローカル インターフェイスのみにバインドすることは、すべての接続を受け入れてから非ローカル接続を閉じるよりも直接的な方法です。

4

5 に答える 5

8

ピア IP アドレスは、この方法でスプーフィングすることはできません。ピアを検査し、確立中に接続をドロップすることを決定する手法を使用することを恐れる必要はありません。

ただし、127.0.0.1 へのバインドは機能するはずであり、オペレーティング システムは、接続しているホストが他の IP アドレスのシステムの 1 つに接続している場合、リッスンしているものがないことを接続ホストに伝えます。コンパイル可能な例でこの質問を修正できますか? おそらく、単純なエラーを犯したのでしょう。

于 2008-09-19T02:41:53.803 に答える
3

すでに行っているように、とにかく接続を受け入れてから getInetAddress() を使用して、アドレスが承認されたものであることを確認できます。そうでない場合は、すぐにソケットを close() してください。なりすましができるアドレスで127.0.0.1はありません。

別の方法として、リモート サイトのアドレスとポートで呼び出される checkAccept() メソッドを持つ独自のセキュリティ マネージャをインストールすることもできます。それは少し難しいです - 最初の解決策は常に私にとって十分だったので、試したことはありません.

于 2008-09-19T03:51:46.913 に答える
3
if (socket.getInetAddress().isLoopbackAddress()){
    //Your code goes here
}
于 2012-02-14T04:37:51.500 に答える
3

ピア アドレスがスプーフィングされている場合は、それ以上何もできません。

ただし、127.0.0.1 を偽装するのは簡単ではありません。このようなパケットを受け入れるには、TCP/IP スタックが十分に機能しない必要があります。スプーファーがパケットを受信する方法はありません。優れた TCP/IP スタックでは、シーケンス番号を推測できないため、期待される会話に追いつくことができません。

于 2008-09-19T10:05:31.973 に答える
1

ServerSocket をバインドするときに localhost を指定すると、TCP/IP スタックが接続を拒否するようになります。これがあなたのシステムで機能していなくても、物理インターフェイスを介してアドレスがルーティングされていないため、localhost がスプーフィングされることはありません。

バインドが成功しない理由、OS、Java のバージョンなどを教えてください。

于 2008-09-19T02:43:38.947 に答える