8

私は、(とりわけ)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プロキシを使用していることをプログラムで確認するにはどうすればよいですか?


更新:この問題を再現する手順:

  1. DNSを含むインターネットアクセスをブロック(またはリダイレクト)するファイアウォールの背後にいることを確認してください
  2. PuTTYをインストールし、選択したポート番号(9870など)に動的SSHトンネルを追加します。次に、インターネットに完全にアクセスできるリモートサーバーにログインします
  3. Firefoxを起動すると、Webを閲覧できなくなります
  4. FFネットワーク設定で、SOCKS v5プロキシをlocalhost:9870に設定します
  5. FFでabout:configに移動し、network.proxy.socks__remote__dnsをtrueに変更します
  6. これで、Webを閲覧できるようになります。
  7. facebook.comにアクセスしてログインし、プロファイルに移動して、画像アップローダーのJavaアプレットを使用して画像を追加してみてください
  8. 次のような一連のクラスが見つからないエラーで失敗します。

    ロード:クラス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.
4

2 に答える 2

5

デフォルトで IP を解決する new InetSocketAddress(hosta, port) と、ターゲット アドレスが解決される場合、SocksSocketImpl は最初に IP を使用します。RemoteDNS が必要な場合は、新しいソケットをプロキシにしてから、InetSocketAddress.createUnresolved(host, port) によって構築された InetSocketAddress に接続できます。

Socks Server は SOCKS5 である必要があり、Java SocksSocketImpl 自動検出バージョンはバージョンです。

Proxy p = new Proxy(Proxy.Type.SOCKS, paddr);
Socket s = new Socket(p);
InetSocketAddress addr = InetSocketAddress.createUnresolved("host.blocked.by.gfw", port);
s.connect(addr);
于 2011-12-16T03:54:19.500 に答える
1

JRE は確かに Socks V5 をサポートしています。Java 1.4 から使用しています。SOCKS サーバーが V4 の場合、JRE は V4 のみを使用します。サーバー応答の最初のバイトは 5 でなければなりません。

V4 サポートにはバグがありました。事前にドメイン名を解決する方法がわからないため、ドメイン名ではなく IP アドレスでのみ機能します。したがって、Socks が機能する場合は、V5 を使用する必要があります。

プロキシ設定が間違っているのではないかと思われます。ソックスがまったく機能しません。これは、Wireshark で簡単に追跡できるはずです。アプレットが使用しているポートを確認するだけです。

また、スタックトレースは非常に役立ちます。靴下が使用されているかどうかが表示されます。例えば、

load: class test.MyApplet.class not found.
java.lang.ClassNotFoundException: <name>.class
at sun.applet.AppletClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.applet.AppletClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.applet.AppletClassLoader.loadCode(Unknown Source)
at sun.applet.AppletPanel.createApplet(Unknown Source)
at sun.plugin.AppletViewer.createApplet(Unknown Source)
at sun.applet.AppletPanel.runLoader(Unknown Source)
at sun.applet.AppletPanel.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

Caused by: java.net.SocketException: Malformed reply from SOCKS server
at java.net.SocksSocketImpl.readSocksReply(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)

SOCKS プロキシを HTTP サーバーに向けたので、このエラーが発生することが予想されます。

于 2009-09-23T03:13:51.773 に答える