You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
go-mitmproxy/README_CN.md

4.3 KiB

go-mitmproxy

English

go-mitmproxy 是一个用 Golang 实现的 mitmproxy支持中间人攻击Man-in-the-middle并解析、监测、篡改 HTTP/HTTPS 流量。

主要功能

  • 解析 HTTP/HTTPS 流量,可通过 WEB 界面查看流量详情。
  • 支持插件机制,方便扩展自己需要的功能。多种事件 HOOK 可参考 examples
  • HTTPS 证书相关逻辑与 mitmproxy 兼容,并保存在 ~/.mitmproxy 文件夹中。如果之前已经用过 mitmproxy 并安装信任了根证书,则 go-mitmproxy 可以直接使用。
  • 更多功能请参考配置文档

暂未实现的功能

  • 只支持客户端显示设置代理,不支持透明代理模式。
  • 暂不支持 http/2 协议解析和 websocket 协议解析。

如需了解显示设置代理和透明代理模式的区别,请参考 Python 版本的 mitmproxy 文档:How mitmproxy worksgo-mitmproxy 目前支持文中提到的『Explicit HTTP』和『Explicit HTTPS』。

命令行工具

安装

go install github.com/lqqyt2423/go-mitmproxy/cmd/go-mitmproxy@latest

使用

使用以下命令启动 go-mitmproxy 代理服务器:

go-mitmproxy

启动后HTTP 代理地址默认为 9080 端口Web 界面默认在 9081 端口。

首次启动后需安装证书以解析 HTTPS 流量,证书会在首次启动命令后自动生成,路径为 ~/.mitmproxy/mitmproxy-ca-cert.pem。安装步骤可参考 Python mitmproxy 文档:About Certificates

更多参数

可以使用以下命令查看 go-mitmproxy 的更多参数:

go-mitmproxy -h
Usage of go-mitmproxy:
  -addr string
    	代理监听地址 (默认值为 ":9080")
  -allow_hosts []string
    	HTTPS解析域名白名单
  -cert_path string
    	生成证书文件路径
  -debug int
    	调试模式1-打印调试日志2-显示调试来源
  -f string
    	从文件名读取配置传入json配置文件地址
  -ignore_hosts value
    	HTTPS解析域名黑名单
  -ssl_insecure
    	不验证上游服务器的 SSL/TLS 证书
  -version
    	显示 go-mitmproxy 版本
  -web_addr string
    	web 界面监听地址 (默认值为 ":9081")

作为包引入开发功能

简单示例

package main

import (
	"log"

	"github.com/lqqyt2423/go-mitmproxy/proxy"
)

func main() {
	opts := &proxy.Options{
		Addr:              ":9080",
		StreamLargeBodies: 1024 * 1024 * 5,
	}

	p, err := proxy.NewProxy(opts)
	if err != nil {
		log.Fatal(err)
	}

	log.Fatal(p.Start())
}

通过开发插件添加功能

参考示例 examples,可通过自己实现 AddAddon 方法添加自己实现的插件。

下面列出目前支持的事件节点:

type Addon interface {
	// 一个客户端已经连接到了mitmproxy。请注意一个连接可能对应多个HTTP请求。
	ClientConnected(*ClientConn)

	// 一个客户端连接已关闭(由我们或客户端关闭)。
	ClientDisconnected(*ClientConn)

	// mitmproxy 已连接到服务器。
	ServerConnected(*ConnContext)

	// 服务器连接已关闭(由我们或服务器关闭)。
	ServerDisconnected(*ConnContext)

	// 与服务器的TLS握手已成功完成。
	TlsEstablishedServer(*ConnContext)

	// HTTP请求头已成功读取。此时请求体为空。
	Requestheaders(*Flow)

	// 完整的HTTP请求已被读取。
	Request(*Flow)

	// HTTP响应头已成功读取。此时响应体为空。
	Responseheaders(*Flow)

	// 完整的HTTP响应已被读取。
	Response(*Flow)

	// 流式请求体修改器
	StreamRequestModifier(*Flow, io.Reader) io.Reader

	// 流式响应体修改器
	StreamResponseModifier(*Flow, io.Reader) io.Reader
}

WEB 界面

你可以通过浏览器访问 http://localhost:9081/ 来使用 WEB 界面。

功能点

  • 查看 HTTP/HTTPS 请求的详细信息
  • 支持对 JSON 请求/响应进行格式化预览
  • 支持二进制模式查看响应体
  • 支持高级的筛选过滤规则
  • 支持请求断点功能

截图示例

License

MIT License