私は、(とりわけ)FirefoxのSOCKSv5プロキシとして機能するローカルサービスをWindowsで実行するアプリケーションを作成しました。
私は現在デバッグ段階にあり、正しく機能しない特定のWebサイトを見つけました。たとえば、Facebook.comでの画像アップロード用のJavaアプレットは、ドメインを検索できないために失敗します。
私のアプリは、非表示のFF構成設定network.proxy.socks__remote__dnsをオーバーライドしてtrueに設定します。アプリの全体的な目的は、ファイアウォールの背後にある場合(たとえば、ユーザーが中国にいる場合)にWebサイトへのアクセスを許可することです。したがって、この設定は、ドメインがリモートでも解決されるようにするために不可欠です(HTTP要求だけでなく)。
JRE6の設定(ここに記載)には同等の設定はありません。リモートDNS解決はSOCKS v5の機能であり、v4ではないため、ドキュメントに記載されているように、それが不可能であることが心配です。
JREがすべてのリクエスト(DNSを含む)にSOCKS v5プロキシを使用していることをプログラムで確認するにはどうすればよいですか?
更新:この問題を再現する手順:
- DNSを含むインターネットアクセスをブロック(またはリダイレクト)するファイアウォールの背後にいることを確認してください
- PuTTYをインストールし、選択したポート番号(9870など)に動的SSHトンネルを追加します。次に、インターネットに完全にアクセスできるリモートサーバーにログインします
- Firefoxを起動すると、Webを閲覧できなくなります
- FFネットワーク設定で、SOCKS v5プロキシをlocalhost:9870に設定します
- FFでabout:configに移動し、network.proxy.socks__remote__dnsをtrueに変更します
- これで、Webを閲覧できるようになります。
- facebook.comにアクセスしてログインし、プロファイルに移動して、画像アップローダーのJavaアプレットを使用して画像を追加してみてください
次のような一連のクラスが見つからないエラーで失敗します。
ロード:クラスcom.facebook.facebookphotouploader5.FacebookPhotoUploader5.classが見つかりません。
JREがクラスが存在するドメインを解決できないため、これは失敗していると思います。この信念は、ドキュメント(http://java.sun.com/javase/6/docs/technotes/guides/deployment/deployment-guide/properties.html)がSOCKS v4(これは私の知る限り、リモートDNSはサポートされていません)。私のdeployment.propertiesファイルは%APPDATA%\ Sun \ Java\Deploymentにあります。Javaコントロールパネルで行った変更がそのファイルに書き込まれることを確認できます。「ブラウザ設定を使用する」の代わりに、Javaのネットワーク設定を上書きしてSOCKSプロキシ設定を手動で使用しようとすると、まだ問題が発生します。JREにプロキシを介してリモートでDNSを実行させる簡単な方法はないようです。
更新2:
SOCKSプロキシなしで、ローカルクライアントから
- www.facebook.comは203.161.230.171に解決されます
- upload.facebook.comは64.33.88.161に解決されます
どちらのホストにも到達できません(ファイアウォールのため)
リモートサーバーにログインすると、次のようになります。
- www.facebook.com 69.63.187.17
- upload.facebook.com 69.63.178.32
FacebookはラウンドロビンDNSやその他の負荷分散を使用しているように見えるため、これらのIPは両方とも数分後に変更されます。
Firefoxでプロキシ設定を設定すると、問題なくwww.facebook.comに移動できます(DNSはプロキシでリモートで解決されているため)。ホエー私はJavaアプレットのあるページに移動しますが、すでに報告したスタックトレースメッセージで失敗します。
ただし、Windows \ System32 \ drivers \ etc \ hostsを編集し、upload.facebook.comに正しいIPを追加すると、アプレットをロードして正しく動作させることができます(FFの再起動が必要になる場合があります)。
この証拠は、Javaランタイムがプロキシ上のDNSを解決するのではなく、トラフィックをルーティングするだけであるという私の理論をサポートしているようです。
私のアプリケーションは大量展開用であり、他のサイト(Facebookだけでなく)のJavaアプレットで動作する必要があります。この問題の回避策が本当に必要です。
UPDATE 3 ZZCoderによって要求されたStacktraceダンプ:
load: class com.facebook.facebookphotouploader5.FacebookPhotoUploader5.class not found.
java.lang.ClassNotFoundException: com.facebook.facebookphotouploader5.FacebookPhotoUploader5.class
at sun.plugin2.applet.Applet2ClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.plugin2.applet.Plugin2ClassLoader.loadCode(Unknown Source)
at sun.plugin2.applet.Plugin2Manager.createApplet(Unknown Source)
at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(Unknown Source)
at java.io.BufferedInputStream.fill(Unknown Source)
at java.io.BufferedInputStream.read1(Unknown Source)
at java.io.BufferedInputStream.read(Unknown Source)
at sun.net.www.http.HttpClient.parseHTTPHeader(Unknown Source)
at sun.net.www.http.HttpClient.parseHTTP(Unknown Source)
at sun.net.www.http.HttpClient.parseHTTP(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
at java.net.HttpURLConnection.getResponseCode(Unknown Source)
at sun.plugin2.applet.Applet2ClassLoader.getBytes(Unknown Source)
at sun.plugin2.applet.Applet2ClassLoader.access$000(Unknown Source)
at sun.plugin2.applet.Applet2ClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
... 7 more
Exception: java.lang.ClassNotFoundException: com.facebook.facebookphotouploader5.FacebookPhotoUploader5.class
Dumping class loader cache...
Live entry: key=http://upload.facebook.com/controls/2008.10.10_v5.5.8/,FacebookPhotoUploader5.jar,FacebookPhotoUploader5.jar, refCount=1, threadGroup=sun.plugin2.applet.Applet2ThreadGroup[name=http://upload.facebook.com/controls/2008.10.10_v5.5.8/-threadGroup,maxpri=4]
Done.