我可以轻松地使用 Netcat(或 Socat)捕获浏览器和特定主机:端口之间的流量。
但对于 Linux,是否存在类似 Squid 的 HTTP 代理的命令行对应项,我可以使用它来捕获我的 HTTP 客户端(浏览器或命令行程序)与任意主机:端口之间的流量?
答案1
Perl 和 Python(可能还有 Ruby)都有简单的工具包,您可以使用它们来快速构建简单的 HTTP 代理。
在 Perl 中,使用HTTP::代理。这是文档中的 3 行示例。添加过滤器来过滤、记录或重写请求或响应;请参阅文档中的示例。
use HTTP::Proxy;
my $proxy = HTTP::Proxy->new( port => 3128 );
$proxy->start;
在Python中,使用简单HTTP服务器。这是一些稍微改编自的示例代码效果机器人。调整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()
答案2
这可能不是最好的解决方案,但如果您使用任何代理,那么它将有一个特定的host:port
,因此 netcat 解决方案仍然有效,尽管您必须拆开代理元数据才能理解它。
最简单的方法可能是使用任何随机匿名代理并通过 引导所有流量netcat
。 (即将浏览器代理设置为localhost:port
,然后将数据转发到真实代理。)
如果您想拥有本地代理,那么 SOCKS5 代理ssh -D <port> localhost
可能是您最简单的选择。显然,您需要告诉浏览器使用“socks”代理而不是“http”代理。
所以,像这样(假设您的本地计算机接受传入的 ssh 连接):
ssh -fN -D 8000 localhost
nc -l 8080 | tee capturefile | nc localhost 8000
当然,这仅适用于一次浏览器连接尝试,然后退出,并且我没有尝试将返回数据转发到浏览器,因此您需要完整的netcat
解决方案。