java运行6袜子v5代理 - 可能吗?(java runtime 6 with socks v5

2019-08-06 19:38发布

我写了(除其他事项外)运行在Windows中的本地服务充当SOCKS v5代理为Firefox的应用程序。

我现在正处于调试阶段,并已发现某些网站无法正常工作。 例如,由于是无法查找域的Java Applet的图片上传Facebook.com上的失败。

我的应用程序覆盖隐藏FF配置设置network.proxy.socks__remote__dns其设置为true。 该应用程序的整个目的是允许访问网站的防火墙(例如,如果用户是在中国)的后面时,所以这个设置是必要的,以确保域解析远程也(不只是HTTP请求)。

在JRE6设置(记录在这里 )没有等效设置,因为远程DNS解析和SOCKS V5的功能不V4的文件似乎在暗示我担心,它只是不可能的。

我如何编程确保JRE使用SOCKS v5代理的所有请求(包括DNS)?


UPDATE:步骤来重现此问题:

  1. 请确保您有一个防火墙阻止(或重定向)上网,包括DNS背后
  2. 安装腻子上你的选择(例如9870)的一些端口号添加动态SSH隧道。 然后登录到具有完全访问互联网的远程服务器
  3. 启动Firefox,你将无法浏览网页
  4. 在FF的网络设置中的SOCKS v5代理为localhost:9870
  5. 在FF去about:config中,改变network.proxy.socks__remote__dns为真
  6. 现在,您将能够浏览网页。
  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%\太阳\的Java \部署。 我可以确认,修改我做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

无论几分钟后,这些IP改变,因为它似乎Facebook的使用循环DNS和其他负载平衡。

随着在Firefox设置代理服务器设置,我可以导航到www.facebook.com没有任何困难(因为DNS正在对代理远程解决)。 乳清我去的网页与Java小程序它失败我已经报堆栈跟踪信息。

但是如果我编辑的Windows \ SYSTEM32 \ DRIVERS \ ETC \主机,添加正确的IP为upload.facebook.com我可以得到小程序加载和正常工作(FF的重启有时是必要的)。

这方面的证据似乎支持我的理论是,Java运行时在代理DNS解析,而只是路由流量虽然它。

我的应用是用于大规模部署和需要与其他网站上(不只是Facebook)的Java小程序的工作。 我真的需要这个问题的变通。


更新3堆栈跟踪转储由ZZ编码器要求:

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.

Answer 1:

新的InetSocketAddress(玉簪,端口)默认情况下其解析IP,并SocksSocketImpl首先使用IP如果目标地址解析。 如果你想RemoteDNS,你可以将新的Socket你的代理服务器,然后connnect到由InetSocketAddress.createUnresolved(主机,端口)构建一个的InetSocketAddress。

您SOCKS服务器必须是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);


Answer 2:

JRE肯定支持SOCKS V5。 我一直在使用它,因为Java 1.4中。 JRE仅使用V4,如果你的SOCKS服务器是V4。 从您的服务器响应的第一个字节必须是5。

V4的支持是马车。 它只有IP地址,而不是域名的作品,因为它不知道如何手之前解决域名。 所以,你必须使用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服务器,那么这个错误的预期。



文章来源: java runtime 6 with socks v5 proxy - Possible?