2つのクライアントがServerSocketクラスで相互に接続できるようにルックアップサーバーが必要なAIMのようなJavaアプリケーションを作成しています。残念ながら、サーバーソケットには開いているポートが必要です。そうしないと、ファイアウォールによってブロックされます。クライアントにファイアウォール設定を手動で変更させることなく、開いているポートを見つけるか、ポートを開く(許可を求められても問題ありません)方法があります。すべてのクライアントがファイアウォール設定を手動で変更する必要はありません。ありがとう!
2 に答える
ServerSocket を作成すると、サーバー側でポートが開かれます (ポートがファイアウォールでもブロックされていないと仮定します)。多くのシステムでは、1024 未満のポート番号はファイアウォールによってブロックされないため、多くの場合、カスタム構成は必要ありません。ただし、多くの ISP がネットワーク内でブロックするポートをますます厳しくしているため、多くのソフトウェアはポート 80 で動作するようになりました。なぜポート 80 なのか? これは HTTP に使用されるポートであるため、Web 上で動作するすべてのサービスに対してほぼ 100% (ファイアウォールで) 開いています。
開いているポートを見つける方法の質問に答えるために、ポート スキャナーはこの機能を実行します。基本的に、一連のポート (ポート 1 ~ 1024 など) で接続を確立しようとするだけです。接続が成功すると (Java では、これはソケットを介した良好な接続と見なされます)、そのポートが「開いている」と見なすことができます。接続を確立するためにデータを交換する必要はありません。接続を確立してから閉じるだけで済みます。
また、サーバー上で実行されているサーバー ソフトウェアがまったくない場合は、ブロックされていなくても、「開いている」ようには見えません。ソケット (TCP) 接続が成功しないと、どのポートがユーザーのファイアウォールによってブロックされていないかわかりません。
繰り返しますが、私は 2 つの関連しているが別個の概念を行ったり来たりしています。ファイアウォールは、ポートをブロック/オープンするか、ポート転送を行うことができます。これは、特定のマシンの接続に対してポートが「開いている」こととは異なります。マシンが特定のポートで接続を受け入れるには、そのポートで接続をリッスンするソフトウェアが必要です。そうしないと、接続を確立できません。
煩わしくない代替ソリューションをいくつか検討することをお勧めします-開いているポートのスキャンにはかなりの時間がかかる場合があり、攻撃されたと感じたファイアウォールからパニック反応を引き起こす可能性があります. 積極的に使用されており、ファイアウォールの背後にあるサーバーの問題を正確に解決するために開発された手法がいくつかあります。
- UDPホールパンチング、ユーザー側の構成は不要。Skype がこの手法をどのように使用するかについての簡単な説明は、ここにあります。
- UPnP / IGDは代替手段として使用できますが、セキュリティ上の問題により、最近ではすぐに使用できるデバイスは少なくなります。
- JSTUNと呼ばれるクライアントとサーバー側の Java 実装によるSTUN
どのソリューションを選択しても、さまざまなインターネット サービス プロバイダーで徹底的にテストしてください。ブロックされたポートに関して予想される制限が多数あります。