Реализация прокси в C # SOCKS5 не всегда работает на локальном компьютере - PullRequest
0 голосов
/ 24 июня 2018

Context

Я сделал реализацию SOCKS 5 Proxy в C # на основе спецификации RFC 1928 как часть программного обеспечения, над которым я работаю. Прокси-сервер будет запускаться локально внутри моего программного обеспечения (то есть он не находится на удаленном сервере) и будет использоваться для перенаправления определенных HTTP / HTTPS подключений на определенный IP-адрес.

Как это должно работать / причина локального прокси

Мое программное обеспечение является своего рода средством запуска, которое запускает файл .jar. Java-программа принимает необязательные параметры, которые указывают прокси-сервер, и я хочу использовать эту функцию для перенаправления любых HTTP или HTTPS запросов, сделанных java-программой, на мои собственные серверы. Вот почему прокси-сервер ДОЛЖЕН работать на том же компьютере, что и прокси-клиент (Java-программа).

Моя проблема

Я тестирую этот прокси с помощью простой Java-программы, которая пытается получить код состояния с веб-сайта через мой прокси. По какой-то причине без изменения какого-либо кода примерно в 8 раз из 10 java-программа генерирует исключение SocketException (java.net.SocketException: Reply from SOCKS server has bad length), но в других случаях она работает и правильно печатает код ответа HTTP.

Что я пробовал

Если я запускаю прокси-программу на отдельном компьютере или на виртуальной машине, она всегда работает без каких-либо ошибок (по крайней мере, надеюсь, я запустил java-программу ~ 20 раз, и она не вызвала исключение). В моем случае это нереальное решение, потому что прокси должен работать локально, как часть программы, над которой я работаю.

Мой код

Реализация SOCKS в C # слишком длинна для SO-сообщения (~ 100 строк), поэтому я загрузил его в Pastebin .

Ниже приведен мой тестовый код Java.

public static void main(String[] args) throws Exception {
    Proxy proxy = new Proxy(Proxy.Type.SOCKS, new InetSocketAddress("127.0.0.1", 32128));

    HttpURLConnection conn = (HttpURLConnection)(new URL("http://somedomain.com/")
        .openConnection(proxy));
    conn.setDoInput(true);
    conn.setDoOutput(false);
    conn.connect();

    System.out.println(conn.getResponseCode());
}

Вопрос

Почему прокси-сервер работает, если я размещаю его на отдельном компьютере / виртуальной машине, но не удается, когда я размещаю (и использую) его локально? И когда это работает локально, что может быть причиной, казалось бы, случайного поведения, и как я могу это исправить?

EDIT:

Я забыл упомянуть, что код в настоящее время функционирует только как прозрачный прокси-сервер, то есть он пока не передает соединения на другие IP-адреса.

1 Ответ

0 голосов
/ 30 декабря 2018

Я только что вернулся к этому проекту после 6-месячного перерыва, и я нашел решение этой проблемы.В строках 70-73 первые четыре байта ответа отправляются отдельно с writer.Write(...).Я решил проблему, заменив эти четыре строки одним вызовом Write, который отправляет массив (byte[4]), содержащий четыре значения.

...