Java Runtime 6 с Socks v5 прокси - Возможно? - PullRequest
8 голосов
/ 16 сентября 2009

Я написал приложение, которое (помимо прочего) запускает локальную службу в Windows, которая действует как прокси SOCKS v5 для Firefox.

Я сейчас на стадии отладки и обнаружил некоторые сайты, которые работают неправильно. Например, Java-апплет для загрузки изображений на Facebook.com не работает, потому что не может искать домены.

Мое приложение переопределяет скрытый параметр конфигурации FF network.proxy.socks__remote__dns , установив для него true . Основная цель приложения - разрешить доступ к веб-сайтам за брандмауэром (например, если пользователь находится в Китае), поэтому этот параметр важен для обеспечения удаленного разрешения доменов (а не только запросов HTTP).

В настройках JRE6 (задокументировано здесь ) нет эквивалентной настройки, и поскольку разрешение удаленного DNS является функцией SOCKS v5, а не v4, поскольку в документации, похоже, подразумевается, что я обеспокоен тем, что это просто невозможно.

Как программно убедиться, что JRE использует прокси SOCKS v5 для всех запросов (включая DNS)?


UPDATE: Действия по воспроизведению этой проблемы:

  1. Убедитесь, что вы находитесь за брандмауэром, который блокирует (или перенаправляет) доступ в Интернет , включая DNS
  2. Установите PuTTY и добавьте динамический туннель SSH на некоторый номер порта по вашему выбору (например, 9870). Затем войдите на удаленный сервер, который имеет полный доступ к Интернету
  3. Запустите Firefox, и вы не сможете просматривать веб-страницы
  4. В настройках сети FF установите прокси SOCKS v5 на localhost: 9870
  5. В FF перейдите к: config, измените network.proxy.socks__remote__dns на true
  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). Мой файл deploy.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

Оба эти IP-адреса меняются через несколько минут, так как кажется, что Facebook использует циклический DNS и другую балансировку нагрузки.

С настройками прокси-сервера, установленными в Firefox, я могу без каких-либо затруднений перейти на www.facebook.com (поскольку DNS разрешается удаленно на прокси-сервере). Когда я захожу на страницу с Java-апплетом, она выходит из строя с сообщениями о трассировке стека, о которых я уже сообщил.

Однако , если я редактирую Windows \ System32 \ drivers \ etc \ hosts, добавляя правильный IP-адрес для upload.facebook.com Я могу заставить апплет загружаться и работать правильно ( перезапуск FF иногда необходим).

Это доказательство, похоже, подтверждает мою теорию о том, что Java Runtime не разрешает DNS на Прокси, а вместо этого просто маршрутизирует трафик через него.

Мое приложение предназначено для массового развертывания и должно работать с java-апплетами на других сайтах (не только на Facebook). Мне действительно нужно обойти эту проблему.


ОБНОВЛЕНИЕ 3 Дамп стека трассировки запрошен 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.

Ответы [ 2 ]

4 голосов
/ 16 декабря 2011

новый InetSocketAddress (хоста, порт), который разрешает IP по умолчанию, и SocksSocketImpl сначала использует IP, если целевой адрес разрешен. Если вы хотите RemoteDNS, вы можете создать Socket you An Proxy, затем подключиться к InetSocketAddress, который создается InetSocketAddress.createUnresolved (host, port).

Ваш сервер 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);
1 голос
/ 23 сентября 2009

JRE, безусловно, поддерживает Socks V5. Я использую его с Java 1.4. JRE использует только V4, если ваш SOCKS-сервер V4. Первый байт ответа вашего сервера должен быть 5.

Поддержка V4 глючила. Он работает только с IP-адресом, а не с именем домена, потому что не знает, как разрешить имя домена заранее Так что вы должны использовать V5, если Socks работает вообще.

Я подозреваю, что ваш прокси-сервер неверен, поэтому носки не работают вообще. Это должно быть легко проследить с помощью 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-сервер, поэтому ожидается эта ошибка.

...