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