Как заставить netcat использовать существующий HTTP-прокси

11

Я могу получить доступ к веб-странице, просто нажав на мой веб-сервер следующим образом:

$ echo "GET /sample" | nc web-server 80
This is contents of /sample...
$

Теперь я хотел бы, чтобы netcat проходил через HTTP-прокси Squid (прослушивая порт 3128), так же, как я могу настроить свой браузер Firefox через его настройки прокси-сервера и заставить его работать через HTTP-прокси.

Я попробовал следующее, но это не сработало:

$ echo "GET /sample" | nc -x squid-proxy:3128 web-server 80
    <Seemed to be blocked FOREVER on input, so I killed it.>
<Ctrl-C>
$

Примечание: я использую RHEL 5.3 версию netcat, которая имеет следующие параметры:

$ nc --help
nc: invalid option -- -
usage: nc [-46DdhklnrStUuvzC] [-i interval] [-p source_port]
  [-s source_ip_address] [-T ToS] [-w timeout] [-X proxy_version]
  [-x proxy_address[:port]] [hostname] [port[s]]

Выдержка из справочной страницы nc:

 EXAMPLES
    <snip>
 Connect to port 42 of host.example.com via an HTTP proxy at 10.2.3.4, port 8080. 
 This example could also be used by ssh(1); see the ProxyCommand directive in
 ssh_config(5) for more information.
       $ nc -x10.2.3.4:8080 -Xconnect host.example.com 42

Теперь, поскольку у меня нет сценария использования ssh / SSL, я не уверен, как использовать параметры -x/ -Xили даже использовать их вообще!

Если есть несколько способов достижения вышеуказанной цели (а именно маршрутизация трафика netcat через HTTP-прокси), я был бы очень признателен, если бы вы могли поделиться ими всеми.

Спасибо заранее.

Гарри
источник

Ответы:

14

Netcat не является специализированным HTTP-клиентом. Соединение через прокси-сервер для Netcat, таким образом, означает создание TCP-соединения через сервер , поэтому он ожидает, что SOCKS или HTTPS-прокси с -xаргументом, определенным как -X:

 -X proxy_protocol
         Requests that nc should use the specified protocol when talking
         to the proxy server.  Supported protocols are “4” (SOCKS v.4),
         “5” (SOCKS v.5) and “connect” (HTTPS proxy).  If the protocol is
         not specified, SOCKS version 5 is used.

connectуказывает метод создания соединений SSL (HTTPS) через прокси-сервер. Поскольку прокси-сервер не является другой конечной точкой и соединение шифруется по конечной точке, CONNECTзапрос позволяет туннелировать соединение точка-точка через прокси-сервер HTTP (если это разрешено). (Я мог бы затмить детали здесь, но это все равно не важный момент; подробности о « HTTP CONNECTтуннелировании» здесь )

Итак , чтобы подключиться к вашему веб-серверу через прокси-сервер, вам нужно будет сделать то же, что и веб-браузер, - поговорить с прокси-сервером :

$ nc squid-proxy 3128
GET http://webserver/sample HTTP/1.0

( Этот вопрос имеет сходство с этим; я не знаю, полезен ли proxychainон здесь. )

Приложение Браузер, использующий обычный прокси-сервер HTTP, например Squid (насколько я знаю), делает то, что более или менее показано в примере, как показывает Netcat: после ncзвонка я настроил Firefox для использования порта 8080 127.0.0.1 в качестве прокси и попытался открыть Google, это то, что было выведено (минус печенье):

$ nc -l 8080
GET http://google.com/ HTTP/1.1
Host: google.com
User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:6.0.2) Gecko/20100101 Firefox/6.0.2
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
DNT: 1
Proxy-Connection: keep-alive

Поступая так же, вы можете использовать Netcat для доступа к HTTP-серверу через HTTP-прокси. Теперь, что должно произойти, если вы попытаетесь получить доступ к веб-серверу HTTPS? Браузер, конечно, не должен показывать трафик кому- то посередине , поэтому необходимо прямое соединение ; и это где CONNECTвступает в игру. Когда я снова запускаю nc -l 8080и пытаюсь получить доступ, скажем, https://google.comс прокси-сервером 127.0.0.1:80, вот что выходит:

CONNECT google.com:443 HTTP/1.1
User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:6.0.2) Gecko/20100101 Firefox/6.0.2
Proxy-Connection: keep-alive
Host: google.com

Видите ли, CONNECTзапросы запрашивают у сервера прямое соединение с google.comпортом 443(https). Теперь , что делает этот запрос?

$ nc -X connect -x 127.0.0.1:8080 google.com 443

Выход из nc -l 8080экземпляра:

CONNECT google.com:443 HTTP/1.0

Таким образом, он использует тот же способ для создания прямого соединения. Однако, поскольку это, конечно, можно использовать практически для чего угодно (например corkscrew, используя ), CONNECTзапросы обычно ограничиваются только очевидными портами.

Sr-
источник
@sr_ Не могли бы вы немного подробнее рассказать о том, как браузер может ... устанавливать TCP-соединение через серверную часть? Точно так же, как socks4, socks5 и connect, кажется, что есть протокол и для простого HTTP-прокси. Не могли бы вы подтвердить это? Большое спасибо.
Гарри
1
@BruceEdiger, да, действительно. Я вычел, 0.1чтобы скрыть свое невежество. :)
sr_
1
@Harry Моя игра с ncFirefox немного проясняет ситуацию?
sr_
@sr_ Я пытался nc squid-proxy 3128следовать GET http://webserver/sample HTTP/1.0, но получил HTTP / 1.0 403 Forbidden (Ошибка доступа запрещена).
Гарри
1
Тьфу, прости, не знаю. Видите ли, вы не эксперт, вы, :)вероятно, можете использовать tcpdumpили wiresharkкоснуться своего собственного CONNECTсоединения и получить представление ...
sr_
3

Посмотрите на socat: http://www.dest-unreach.org/socat/doc/README

Фабиан Цейндль
источник
Спасибо, +1. Похоже, очень сложный и сложный инструмент. Пробовал echo "GET /sample HTTP/1.0" | socat PROXY:squid-proxy:web-server:80,proxyport=3128 STDIN, но получил эту ошибку: 2012/05/17 06:56:23 socat[3135] E CONNECT web-server:80: Forbidden. Теперь, чтобы посмотреть, правильно ли я понял этот инструмент, я в следующий раз попробовал базовое использование без прокси:, echo "GET /sample HTTP/1.0" | socat TCP4:web-server:80 STDINно ответа не получил! Итак, очевидно, я что-то здесь упускаю в использовании socat. Буду признателен, если вы укажете на мою ошибку.
Гарри
Хорошо, я мог бы заставить работать не-прокси версию, используя STDIO(или, -) вместо STDIN. Но прокси-версия все еще выдает мне ту же ошибку.
Гарри
1
Еще одно обновление: я пытался, echo "GET http://web-server/sample" | socat - TCP:squid-proxy:3128и это сработало. Не могли бы вы подтвердить, что именно так я и должен использовать socat(вместо PROXY:...спецификации адреса)?
Гарри
1
Привет, я сам этим не пользовался, но думаю, что это правильно. Socat открывает обычное TCP-соединение с http-proxy, а squid анализирует http-GET и делает все остальное. Это работает для https между прочим? И, наконец, еще одна ссылка: technostuff.blogspot.com/2008/10/…
Фабиан Цейндль
Нет, я еще не пробовал https. Скоро я тоже буду беспокоиться о https. Спасибо.
Гарри