mitmproxy 使用

命令行访问

  1. 手册 https://docs.mitmproxy.org

  2. 下载 https://mitmproxy.org/, 并解压缩

  3. 运行 mitmweb

  4. 将浏览器的代理设置为 127.0.0.1:8080

    我使用 firefox + ZeroOmega + auto switch (指定规则)

  5. 浏览器访问 http://127.0.0.1:8081

  6. 安装证书 file|Install Certificates...

    1. 会访问 http://mitm.it/ 也要走 8080 代理
    2. 根据系统下载证书
    3. firefox 设置 | 隐私与安全 | 证书 | 查看证书| 导入
  7. 浏览器访问目标地址

  8. Flow List 中过滤内容

    • 直接输入根据 url 过滤
    • ~bs xxx 根据返回内容过滤
    • ~all xxx 根据所有内容过滤
    • 过滤手册 https://docs.mitmproxy.org/stable/concepts/filters/

转发规则

mitmweb -s rewrite_target.py -p 8080

# 将 url 中指定规则的请求转发至其它服务器
# rewrite_target.py
from mitmproxy import http

TARGET_HOST = "tongyi.xsoft.com"
TARGET_PORT = 80
TARGET_SCHEME = "http"

def request(flow: http.HTTPFlow) -> None:
    """
    将所有 path 以 /v1/chat/ 开头的请求,转发到 tongyi.xsoft.com(保持 path/query 不变)
    例如:
      请求  https://origin.example.com/v1/chat/abcd?x=1
      转发到 https://tongyi.xsoft.com/v1/chat/abcd?x=1
    """
    # 使用 path 匹配(更稳健,不受原始 host 影响)
    try:
        if flow.request.path.startswith("/v1/chat/") or flow.request.path == "/v1/chat":
            # 修改上游目标
            flow.request.scheme = TARGET_SCHEME
            flow.request.host = TARGET_HOST
            flow.request.port = TARGET_PORT
            # 修改 Host header(后端通常需要这个)
            flow.request.headers["Host"] = TARGET_HOST
    except Exception:
        # 避免脚本因为意外异常中断 mitmproxy
        pass

透明代理

  • https://docs.mitmproxy.org/stable/howto/transparent/
  • https://bitsflow.org/network/mitmproxy-as-transparent-proxy/
  • https://zhuanlan.zhihu.com/p/265358836

使用 docker

podman run --rm -it -v ~/.mitmproxy:/home/mitmproxy/.mitmproxy -p 8080:8080 -p 127.0.0.1:8081:8081 mitmproxy/mitmproxy mitmweb --web-host 0.0.0.0
- 8080 代理端口
- 8081 web 端口
- /home/mitmproxy/.mitmproxy 保存证书和日志,不设置的话,下次运行会重新生成证书
- 然后根据日志查看访问 url + 密码,或是使用 web_password 指定密码
- https://hub.docker.com/r/mitmproxy/mitmproxy
上一篇
下一篇