Ich habe eine Anwendung geschrieben, die (unter anderem) einen lokalen Dienst in Windows ausführt, der als SOCKS v5-Proxy für Firefox fungiert.
Ich bin gerade in der Debug-Phase und habe bestimmte Webseiten gefunden, die nicht korrekt funktionieren. Zum Beispiel schlägt das Java-Applet zum Hochladen von Bildern auf Facebook.com fehl, weil es keine Domains suchen kann.
Meine App überschreibt eine versteckte FF-Konfigurationseinstellung network.proxy.socks__remote__dns , die sie auf true setzt. Der Zweck der App besteht darin, den Zugriff auf Websites zu ermöglichen, wenn sie sich hinter einer Firewall befinden (z. B. wenn sich der Benutzer in China befindet). Daher ist diese Einstellung wichtig, um sicherzustellen, dass Domänen auch remote aufgelöst werden (und nicht nur HTTP-Anfragen).
In den JRE6-Einstellungen (dokumentiert hier ) ) Es gibt keine entsprechende Einstellung, und da die Remote-DNS-Auflösung eine Funktion von SOCKS v5 und nicht v4 ist, wie die Dokumentation zu implizieren scheint, mache ich mir Sorgen, dass es einfach nicht möglich ist.
Wie kann ich programmgesteuert sicherstellen, dass die JRE einen SOCKS v5-Proxy für alle Anforderungen (einschließlich DNS) verwendet?
UPDATE: Schritte zum Reproduzieren dieses Problems:
Es wird mit einer Reihe von Klassenfehlern fehlschlagen, die ähnlich aussehen:
laden: Klasse com.facebook.facebookphotouploader5.FacebookPhotoUploader5.class nicht gefunden .
Ich glaube, dass dies fehlschlägt, weil die JRE die Domäne, in der sich die Klasse befindet, nicht auflösen kann. Ich bin davon überzeugt, dass die Dokumentation ( Ссылка ) spricht nur über SOCKS v4 (was meines Wissens nicht Remote-DNS unterstützt). Meine deployment.properties-Datei befindet sich in% APPDATA% \ Sun \ Java \ Deployment. Ich kann bestätigen, dass Änderungen, die ich in der Java-Systemsteuerung mache, in diese Datei geschrieben werden. Wenn ich anstelle von "Browsereinstellung verwenden" die Netzwerkeinstellungen für Java überschreibe und versuche, die SOCKS-Proxyeinstellungen manuell zu verwenden, habe ich immer noch das Problem. Es scheint keine einfache Möglichkeit zu sein, die JRE dazu zu zwingen, DNS remote über den Proxy auszuführen.
UPDATE 2:
Ohne den SOCKS-Proxy von meinem lokalen Client
Kein Host ist erreichbar (wegen der Firewall)
Wenn ich mich beim Remote-Server anmelde, bekomme ich:
Beide IPs ändern sich nach ein paar Minuten, da Facebook anscheinend Round-Robin-DNS und andere Lastausgleiche verwendet.
Mit den in Firefox eingestellten Proxyeinstellungen kann ich problemlos zu www.facebook.com navigieren (da DNS auf dem Proxy remote aufgelöst wird). Whey Ich gehe auf die Seite mit dem Java-Applet, die mit den Stacktrace-Nachrichten fehlschlägt, die ich bereits gemeldet habe.
Allerdings wenn ich Windows \ System32 \ drivers \ etc \ hosts editiere und die richtige IP für upload.facebook.com hinzufüge. Ich kann das Applet laden und arbeiten lassen richtig (manchmal ist ein Neustart von FF nötig).
Dieser Beweis scheint meine Theorie zu unterstützen, dass die Java Runtime nicht ist, DNS auf dem Proxy aufzulösen, sondern nur den Datenverkehr dorthin zu leiten.
Meine Anwendung ist für Massenimplementierung gedacht und muss mit Java-Applets auf anderen Seiten (nicht nur auf Facebook) funktionieren. Ich brauche wirklich eine Lösung für dieses Problem.
UPDATE 3 Stacktrace-Dump, angefordert von ZZ Coder:
%Vor%neue InetSocketAddress (Hosta, Port), die IP standardmäßig auflösen, und SocksSocketImpl verwenden IP zuerst, wenn die Zieladresse aufgelöst wird. Wenn Sie RemoteDNS möchten, können Sie Socket Sie einen Proxy neu verbinden und dann mit einer InetSocketAddress verbinden, die von InetSocketAddress.createUnresolved (Host, Port) erstellt wird.
Ihr Socks Server muss SOCKS5 sein, Java SocksSocketImpl Auto Detect ist Version.
%Vor%JRE unterstützt sicherlich Socks V5. Ich benutze es seit Java 1.4. JRE verwendet V4 nur, wenn der SOCKS-Server V4 ist. Das erste Byte von Ihrer Serverantwort muss 5 sein.
Die V4-Unterstützung war fehlerhaft. Es funktioniert nur mit der IP-Adresse, nicht mit dem Domainnamen, weil es nicht weiß, wie man den Domainnamen vorhandeln soll. Sie müssen also V5 verwenden, wenn Socks überhaupt funktioniert.
Ich vermute, dass Ihre Proxy-Einstellung falsch ist, so dass Socken überhaupt nicht funktioniert. Dies sollte mit Wireshark leicht zu verfolgen sein. Überprüfe einfach, welchen Port das Applet benutzt.
Auch der Stacktrace wird sehr hilfreich sein. Es zeigt Ihnen, ob Socks verwendet wird. Zum Beispiel
%Vor%Ich habe SOCKS-Proxy auf meinen HTTP-Server gesetzt, daher wird dieser Fehler erwartet.