Есть ли в командной строке универсальный HTTP-прокси (например, Squid)?


9

Я могу легко использовать Netcat (или Socat) для захвата трафика между моим браузером и конкретным хостом: портом.

Но для Linux существует ли какой-либо аналог командной строки Squid-подобного HTTP-прокси, который я могу использовать для захвата трафика между моим HTTP-клиентом (браузером или программой командной строки) и любым произвольным портом host: port?


Ответы:


8

И Perl, и Python (и, возможно, также Ruby) имеют простые наборы, которые можно использовать для быстрого создания простых HTTP-прокси.

В Perl используйте HTTP :: Proxy . Вот 3-строчный пример из документации. Добавьте фильтры, чтобы фильтровать, регистрировать или переписывать запросы или ответы; см. документацию для примеров.

use HTTP::Proxy;
my $proxy = HTTP::Proxy->new( port => 3128 );
$proxy->start;

В Python используйте SimpleHTTPServer . Вот пример кода, слегка адаптированный из effbot . Адаптируйте do_GETметод (или другие) для фильтрации, записи или перезаписи запросов или ответов.

import SocketServer
import SimpleHTTPServer
import urllib
class Proxy(SimpleHTTPServer.SimpleHTTPRequestHandler):
    def do_GET(self):
        self.copyfile(urllib.urlopen(self.path), self.wfile)
httpd = SocketServer.ForkingTCPServer(('', 3128), Proxy)
httpd.serve_forever()

Я считаю, что это именно то решение, которое я искал. Спасибо.
Гарри

Python один работал для меня для HTTP-запросов, но он не поддерживает HTTPS-запросы.
Рассел Сильва


6

Возможно, это не лучшее решение, но если вы используете какой-либо прокси-сервер, у него будет конкретное host:portрешение, поэтому решение netcat все еще работает, хотя вам придется выбирать метаданные прокси-сервера, чтобы разобраться в этом.

Самый простой способ сделать это - использовать любой случайный прокси-сервер для анонимизации и просто направить весь трафик netcat. (Т.е. установите прокси вашего браузера на localhost:portи затем перенаправьте данные на реальный прокси.)

Если вы хотите иметь локальный прокси-сервер, ssh -D <port> localhostвозможно, самый простой вариант - прокси-сервер SOCKS5 . Очевидно, что вы должны указать браузеру использовать прокси «socks» вместо прокси «http».

Итак, что-то вроде этого (при условии, что ваша локальная машина принимает входящие ssh-соединения):

ssh -fN -D 8000 localhost
nc -l 8080 | tee capturefile | nc localhost 8000

Естественно, это сработает только для одной попытки подключения к браузеру, а затем завершится, и я не пытался переслать возвращаемые данные в браузер, поэтому вам понадобится ваше полное netcatрешение.


Спасибо. Есть ли у вас какие-либо варианты имен для анонимных прокси для Linux? Я бы предпочел те, которые не такие тяжелые, как Squid (с точки зрения размера, памяти, скорости запуска), запускаемые не rootпользователем и т. Д.
Harry

Кроме того, я не последовал вашему примеру с прокси SOCKS5. Не могли бы вы объяснить, что происходит с 2 вызовами выше? Я, например, знаю, что ssh -fN -D ...запускает прокси SOCKS5 на localhostпорт 8000, но что делает nc -l ...? И на какой порт мой браузер должен указывать: 8000или 8080?
Гарри

2
@harry для прокси аномизации взглянуть на privoxy
Ульрих

1
Когда я говорю «прокси-сервер анонимизации», я не имею в виду то, что вы сами настраиваете: я имею в виду существующий прокси-сервер в сети. @UlrichDangel предлагает privoxy, и я уверен, что есть и другие.
Ams

Эти ncкоманды принимают весь трафик с порта 8080 и направить его в 8000. Я не обеспечивает полное netcatрешение , потому что ваш пост предложил вы уже знали , как сделать эту часть.
Ams
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.