java runtime 6 avec socks v5 proxy-Possible?


J'ai écrit une application qui (entre autres) exécute un service local dans Windows qui agit comme un proxy SOCKS v5 pour Firefox.

Je suis en phase de débogage en ce moment et j'ai trouvé certains sites Web qui ne fonctionnent pas correctement. Par exemple l'applet Java pour le téléchargement d'images sur Facebook.com échoue car is ne peut pas rechercher des domaines.

Mon application remplace un paramètre de configuration FF caché réseau.proxy.chaussettes__à distance__dns le paramètre vrai . Le but de l'application est de permettre l'accès aux sites Web derrière un pare-feu (par exemple si l'utilisateur est en Chine), donc ce paramètre est essentiel pour s'assurer que les domaines sont résolus à distance également (et pas seulement les requêtes HTTP).

Dans les paramètres JRE6 (documenté ici) il n'y a pas de paramètre équivalent, et puisque la résolution DNS à distance est une fonctionnalité de SOCKS v5 et non v4 comme la documentation semble impliquer que je crains que ce ne soit tout simplement pas possible.

Comment puis-je m'assurer par programme que le JRE utilise un proxy SOCKS v5 pour toutes les demandes (y compris DNS)?


MISE À JOUR: Étapes pour reproduire ce problème:

  1. Assurez-vous que vous êtes derrière un pare-feu qui bloque (ou redirige) l'accès à Internet y compris le DNS
  2. Installez PuTTY et ajoutez un tunnel SSH dynamique sur un numéro de port de votre choix (par exemple 9870). Ensuite, connectez-vous à un serveur distant qui a un accès complet à Internet
  3. Lancez Firefox et vous allez pas être capable de naviguer sur le web
  4. Dans les paramètres réseau FF, définissez le proxy SOCKS v5 sur localhost: 9870
  5. Dans FF aller à propos de:config, changer réseau.proxy.chaussettes__à distance__dns true
  6. Vous allez maintenant pouvoir naviguer sur le web.
  7. Aller à facebook.com, connectez-vous, accédez à votre profil et essayez d'utiliser l'applet java picture uploader pour ajouter des images
  8. , Il échouera avec une série de classe introuvable erreurs recherche similaire pour:

    charge: classe com.Facebook.facebookphotouploader5.FacebookPhotoUploader5.classe non trouvée .

Je crois que cela échoue car le JRE est incapable de résoudre le domaine sur lequel réside la classe. Je fonde cette croyance sur le fait que la documentation (http://java.sun.com/javase/6/docs/technotes/guides/deployment/deployment-guide/properties.html) ne parle que de SOCKS v4 (qui, pour autant que je sache, ne prend pas en charge le DNS distant). Mon déploiement.le fichier de propriétés se trouve dans % APPDATA% \ Sun \ Java \ Deployment. Je peux confirmer que les modifications que j'apporte dans le panneau de configuration Java sont écrites dans ce fichier. Si au lieu de "Utiliser les paramètres du navigateur" les paramètres réseau pour Java je remplace et tente d'utiliser les paramètres proxy SOCKS manuellement, j'ai toujours le problème. Il ne semble pas y avoir de moyen facile de forcer le JRE à faire DNS à distance via le proxy.


MISE À JOUR 2:

Sans le proxy SOCKS, de mon local client

  • www.facebook.com résout à 203.161.230.171
  • upload.facebook.com résout à 64.33.88.161

Aucun hôte n'est accessible (à cause du pare-feu)

Si je me connecte au serveur distant, j'obtiens:

  • www.facebook.com 69.63.187.17
  • upload.facebook.com 69.63.178.32

Ces deux adresses IP changent après quelques minutes, car il semble que Facebook utilise le DNS round-robin et d'autres équilibrage de charge.

Avec le proxy paramètres définis dans Firefox, je peux naviguer vers www.facebook.com sans aucune difficulté (puisque DNS est résolu à distance sur le proxy). Whey Je vais à la page avec l'applet Java, il échoue avec les messages stacktrace que j'ai déjà signalés.

Cependant si je modifie Windows \ System32 \ drivers \ etc \ hosts, en ajoutant l'IP correcte pour upload.facebook.com Je peut charger et fonctionner correctement l'applet (le redémarrage de FF est parfois nécessaire).

Cette preuve semble soutenez ma théorie selon laquelle le Runtime Java est pas en train de résoudre le DNS sur le Proxy, mais simplement en routant le trafic.

Mon application est destinée au déploiement en masse et doit fonctionner avec des applets java sur d'autres sites (pas seulement Facebook). J'ai vraiment besoin d'un contournement pour ce problème.


MISE À JOUR 3 Stacktrace de vidage demandé par ZZ Codeur:

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.
Author: rwired, 2009-09-16

2 answers

New InetSocketAddress(hosta, port) qui résout IP par défaut, et SocksSocketImpl utilise IP en premier si l'adresse cible est résolue. Si vous voulez RemoteDNS, vous pouvez nouveau Socket vous un proxy, puis connectez-vous à un InetSocketAddress qui est construit par InetSocketAddress.createUnresolved (hôte, port).

Votre serveur Socks doit être SOCKS5, java SocksSocketImpl auto detect est la version.

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);
 5
Author: Jerry Du, 2011-12-16 04:16:44

JRE prend certainement en charge Socks V5. Je l'utilise depuis Java 1.4. JRE n'utilise V4 que si votre serveur SOCKS est V4. Le premier octet de la réponse de votre serveur doit être 5.

Le support de la V4 était bogué. Il ne fonctionne qu'avec l'adresse IP, pas le nom de domaine car il ne sait pas comment résoudre le nom de domaine avant la main. Vous devez donc utiliser V5 si Socks fonctionne du tout.

Je soupçonne que votre paramètre proxy est incorrect, donc socks ne fonctionne pas du tout. Cela devrait être facile à tracer avec Wireshark. Vérifiez simplement quel port l'applet utilise.

Aussi la stacktrace sera très utile. Il vous montrera si des chaussettes sont utilisées. Par exemple,

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)

J'ai pointé SOCKS proxy vers mon serveur HTTP, donc cette erreur est attendue.

 1
Author: ZZ Coder, 2009-09-23 03:13:51