2009-09-16 9 views
8

Napisałem aplikację, która (między innymi) uruchamia usługę lokalną w systemie Windows, która działa jako serwer proxy SOCKS v5 dla przeglądarki Firefox.Java Runtime 6 ze skarpetkami v5 proxy - Możliwe?

Jestem w fazie debugowania już teraz i znalazłem niektóre witryny, które nie działają poprawnie. Na przykład aplet Java do przesyłania zdjęć w serwisie Facebook.com nie działa, ponieważ nie może wyszukiwać domen.

Moja aplikacja zastępuje ukrytą FF config ustawienia network.proxy.socks__remote__dns ustawienie go na prawdziwej. Celem aplikacji jest umożliwienie dostępu do stron internetowych za firewallem (np. Jeśli użytkownik znajduje się w Chinach), więc to ustawienie jest niezbędne, aby zapewnić zdalne rozwiązywanie domen (a nie tylko żądania HTTP).

W ustawieniach JRE6 (udokumentowane here) nie ma ustawienia równoważnego, a ponieważ zdalna rozdzielczość DNS jest cechą SOCKS v5, a nie v4, jak sugeruje dokumentacja, obawiam się, że po prostu nie jest to możliwe.

Jak mogę programowo upewnić się, że środowisko JRE korzysta z proxy SOCKS v5 dla wszystkich żądań (w tym DNS)?


UPDATE: Kroki prowadzące do odtworzenia problemu:

  1. Upewnij się, że jesteś za firewallem, który blokuje (lub przekierowuje) dostępu do Internetu tym DNS
  2. Install kit i dodać dynamiczny tunel SSH na wybranym numerze portu (np. 9870). Następnie zalogować się na zdalnym serwerze, który ma pełny dostęp do internetu
  3. Uruchom Firefoksa i będzie nie móc przeglądać strony internetowe
  4. W ustawieniach sieciowych FF określonych proxy SOCKS v5 do localhost: 9870
  5. W FF przejdź do: config, zmień network.proxy.socks__remote__dns na true
  6. Będziesz mógł teraz przeglądać Internet.
  7. Idź do facebook.com, zaloguj się, przejdź do swojego profilu i próbować używać apletu java uploader zdjęcie, aby dodać kilka zdjęć
  8. Będzie ona niepowodzeniem z serii klasa nie znaleziono błędów szuka podobnego do:

    load: class com.facebook.facebookphotouploader5.FacebookPhotoUploader5.class nie znaleziono.

Uważam, że to się nie udaje, ponieważ środowisko JRE nie może rozpoznać domeny, w której znajduje się klasa. Opieram to na tym, że dokumentacja (http://java.sun.com/javase/6/docs/technotes/guides/deployment/deployment-guide/properties.html) mówi tylko o SOCKS v4 (o ile wiem, nie obsługuje zdalnego DNS). Mój plik deployment.properties znajduje się w% APPDATA% \ Sun \ Java \ Deployment. Mogę potwierdzić, że modyfikacje dokonane w panelu sterowania Java są zapisywane w tym pliku. Jeśli zamiast "Użyj ustawienia przeglądarki" ustawienia sieciowe dla Java ja przesłonię i próbuję ręcznie użyć ustawień proxy SOCKS, nadal mam problem. Wydaje się, że nie istnieje łatwy sposób zmuszenia JRE do zdalnego wykonywania DNS za pośrednictwem serwera proxy.


UPDATE 2:

Bez proxy SOCKS, z mojego lokalnego klienta

  • www.facebook.com postanawia 203.161.230.171
  • upload.facebook.com postanawia 64.33 .88.161

Żaden host nie jest osiągalny (z powodu zapory)

Jeśli mogę się zalogować do serwera zdalnego, otrzymuję:

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

Obie te zmiany IP po kilku minutach, jak się wydaje, Facebook wykorzystuje system DNS roboczy typu round-robin i inne równoważenia obciążenia.

Dzięki ustawieniom serwera proxy ustawionym w przeglądarce Firefox mogę bez problemu nawigować do witryny www.facebook.com (ponieważ serwer DNS jest zdalnie rozwiązywany w serwerze proxy). Whey Idę na stronę z apletem Javy, która zawodzi z komunikatami stacktrace, które już zgłosiłem.

Jednak jeśli mogę edytować Windows \ System32 \ drivers \ etc \ hosts, dodając odpowiednią IP dla upload.facebook.com I może uzyskać aplet załadować i działa poprawnie (restart FF jest czasami konieczne) .

Ten dowód wydaje się potwierdzać moją teorię, że Java Runtime jest nie rozwiązywanie DNS na Proxy, ale zamiast tego tylko ruting ruchu mimo to.

Moja aplikacja służy do masowego wdrażania i musi współpracować z apletami Java na innych stronach (nie tylko na Facebooku). Naprawdę potrzebuję obejścia tego problemu.


UPDATE 3 StackTrace zrzucić żądana przez ZZ Coder:

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. 
+1

Wystąpiłem również w tym problemie, Java nie rozpoznaje zdalnie serwera DNS. Czy kiedykolwiek to działa? – Arya

+0

Nie, nigdy nie doszedłem do rozwiązania. Porzucił ten projekt. – rwired

+0

Przykro mi, że nie wymyśliłeś rozwiązania, ale pomogłeś mi niezmiernie! To całe "java nie rozwiązuje zdalnie serwera DNS" jest sztucznym hobbitem. –

Odpowiedz

1

JRE pewno obsługuje Socks V5. Używam go od wersji 1.4 Java. JRE używa tylko V4, jeśli twój serwer SOCKS jest V4. Pierwszy bajt z odpowiedzi serwera musi być 5.

Obsługa V4 była błędna. Działa tylko z adresem IP, a nie nazwą domeny, ponieważ nie wie, jak rozwiązać nazwę domeny przed ręką. Musisz więc używać V5, jeśli Socks w ogóle działa.

Podejrzewam, że twoje ustawienia proxy są nieprawidłowe, więc skarpetki nie działają. Powinno to być łatwe do prześledzenia za pomocą Wireshark. Sprawdź, którego portu używa aplet.

Także stacktrace będzie bardzo pomocny. Pokaże Ci, czy używasz skarpet. Na przykład:

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) 

Wskazałem serwer proxy SOCKS na mój serwer HTTP, więc ten błąd jest oczekiwany.

+0

Sprawdziłem zgodnie z Twoimi sugestiami. Uzyskanie 5 kopii z serwera proxy jako pierwszego bajtu. Z pewnością przechodzi przez proxy. Mój stacktrace wciąż pokazuje ClassNotFoundException. – rwired

+0

Jeśli opublikujesz cały stacktrace z powodu, mogę uzyskać wskazówkę –

+0

To jest ślad stosu po przejściu do strony www.facebook.com, wybierz profil-zdjęcia-album-dodać więcej zdjęć i po tym, jak aplet zakończy się niepowodzeniem z " Błąd: kliknij, aby wyświetlić szczegóły " U dołu porzuciłem listę programów ładujących klasy. – rwired