0.写在开头#
这里不介绍具体操作步骤,主要说明一个思路。
1.抓包方案对比#
当前常见的抓包方案有以下几种:
序号 | 方案 | 代表工具 | 说明 |
---|---|---|---|
1 | 基于代理的 HTTP/HTTPS 抓包 | Fiddler Charles BurpSuite Reqable mitmproxy | 安装中间人证书(自签),解密 https 流量,对外会开放一个代理,发起请求时指定该代理就能抓包 |
2 | 基于网卡嗅探的全协议抓包 | Wireshark Tcpdump | 啥包都能抓,唯一的缺点是无法解密 tls 流量,可以设置环境变量 SSLKEYLOGFILE,但这种方式只能解密浏览器发起的 https,对于某些应用内的请求还是没法解密。 |
但是这两个方案在遇到特定场景时:
- 接口使用 https 协议
- 包括应用内部请求和浏览器请求
- 应用无法指定代理
- 部分请求需要通过梯子
这个时候,使用 tun 虚拟网卡抓包是一个不错的选择。在网络层就拦截请求,再交给指定的代理进行抓包。
2.使用 Tun 虚拟网卡抓包流程示意#
flowchart TD
%% 主节点定义
APP("应用程序")
BROWSER("浏览器")
TUN("TUN入站
(虚拟网卡)") TUN_ROUTE("TUN专用路由
全部转发到代理出站") TO_MITM("To-Mitmproxy出站
(转发到9999端口)") HTTP_PROXY("HTTP代理服务
(9999端口)") MITM("mitmproxy
解密与分析HTTPS流量") MIXED("Mixed入站
接收8888端口流量
HTTP+HTTPS") ROUTER("主路由规则
国内/国外/广告分流") DIRECT("直连出站
(国内服务器)") PROXY("代理出站
(国外服务器)") BLOCK("阻断出站
(Block广告)") WEBUI("mitmweb界面
(8081端口)") INTERNET("目标服务") %% 子图分组 subgraph deviceEnv["设备环境"] APP BROWSER end subgraph singbox["sing-box"] subgraph inbounds["入站规则"] TUN MIXED end subgraph routing["路由规则"] TUN_ROUTE ROUTER end subgraph outbounds["出站规则"] TO_MITM DIRECT PROXY BLOCK end end subgraph mitmproxy["mitmproxy"] HTTP_PROXY MITM WEBUI end subgraph external["外部网络"] INTERNET end %% 请求路径 - 实线 APP -->|"应用请求"| TUN TUN -->|"TUN流量"| TUN_ROUTE TUN_ROUTE -->|"全部流量"| TO_MITM TO_MITM -->|"转发到9999端口"| HTTP_PROXY HTTP_PROXY -->|"上游代理到8888端口"| MITM MITM -->|"返回到8888端口"| MIXED MIXED -->|"解密后的流量"| ROUTER %% 从路由到三个并列出站的线条 - 三个完全独立 ROUTER -->|"国内网站"| DIRECT ROUTER -->|"国外网站"| PROXY ROUTER -->|"广告请求"| BLOCK %% 从出站到互联网的线条 DIRECT -->|"直连请求"| INTERNET PROXY -->|"代理请求"| INTERNET %% 响应路径 - 虚线 INTERNET -.->|"国内响应"| DIRECT INTERNET -.->|"国外响应"| PROXY %% 从出站返回到路由的线条 - 三个完全独立 DIRECT -.->|"直连响应"| ROUTER PROXY -.->|"代理响应"| ROUTER BLOCK -.->|"阻断响应"| ROUTER %% 后续响应流程 ROUTER -.->|"分类后响应"| MIXED MIXED -.->|"加密后响应"| MITM MITM -.->|"代理响应"| HTTP_PROXY HTTP_PROXY -.->|"返回9999端口"| TO_MITM TO_MITM -.->|"转发响应"| TUN_ROUTE TUN_ROUTE -.->|"TUN响应"| TUN TUN -.->|"应用响应"| APP %% 监控线路 - 点虚线 MITM -...->|"流量分析"| WEBUI BROWSER -...->|"访问界面"| WEBUI %% 节点样式 classDef appNode fill:#6a329f,stroke:#9d78c2,color:#ffffff,stroke-width:2px classDef browserNode fill:#4682b4,stroke:#87ceeb,color:#ffffff,stroke-width:2px classDef tunNode fill:#2472c8,stroke:#5cb3ff,color:#ffffff,stroke-width:2px classDef mixedNode fill:#8b4513,stroke:#d2691e,color:#ffffff,stroke-width:2px classDef routerNode fill:#a52a2a,stroke:#cd5c5c,color:#ffffff,stroke-width:2px classDef proxyNode fill:#6b8e23,stroke:#9acd32,color:#ffffff,stroke-width:2px classDef directNode fill:#483d8b,stroke:#7b68ee,color:#ffffff,stroke-width:2px classDef blockNode fill:#8b0000,stroke:#ff6347,color:#ffffff,stroke-width:2px classDef httpNode fill:#c95f00,stroke:#ffa452,color:#ffffff,stroke-width:2px classDef mitmNode fill:#298a3c,stroke:#5fd46c,color:#ffffff,stroke-width:2px classDef webUINode fill:#800080,stroke:#da70d6,color:#ffffff,stroke-width:2px classDef internetNode fill:#696969,stroke:#d3d3d3,color:#ffffff,stroke-width:2px classDef toMitmNode fill:#ff7f50,stroke:#ffb347,color:#ffffff,stroke-width:2px classDef tunRouteNode fill:#db7093,stroke:#ffb6c1,color:#ffffff,stroke-width:2px %% 应用节点样式 class APP appNode class BROWSER browserNode class TUN tunNode class MIXED mixedNode class TUN_ROUTE tunRouteNode class ROUTER routerNode class TO_MITM toMitmNode class PROXY proxyNode class DIRECT directNode class BLOCK blockNode class HTTP_PROXY httpNode class MITM mitmNode class WEBUI webUINode class INTERNET internetNode %% 子图样式 style deviceEnv fill:#2d2d2d,stroke:#666666,color:#ffffff,stroke-width:1px style singbox fill:#1a1a1a,stroke:#555555,color:#ffffff,stroke-width:1px style inbounds fill:#333333,stroke:#888888,color:#ffffff,stroke-width:1px style routing fill:#333333,stroke:#888888,color:#ffffff,stroke-width:1px style outbounds fill:#333333,stroke:#888888,color:#ffffff,stroke-width:1px style mitmproxy fill:#2a2a2a,stroke:#777777,color:#ffffff,stroke-width:1px style external fill:#2d2d2d,stroke:#666666,color:#ffffff,stroke-width:1px
(虚拟网卡)") TUN_ROUTE("TUN专用路由
全部转发到代理出站") TO_MITM("To-Mitmproxy出站
(转发到9999端口)") HTTP_PROXY("HTTP代理服务
(9999端口)") MITM("mitmproxy
解密与分析HTTPS流量") MIXED("Mixed入站
接收8888端口流量
HTTP+HTTPS") ROUTER("主路由规则
国内/国外/广告分流") DIRECT("直连出站
(国内服务器)") PROXY("代理出站
(国外服务器)") BLOCK("阻断出站
(Block广告)") WEBUI("mitmweb界面
(8081端口)") INTERNET("目标服务") %% 子图分组 subgraph deviceEnv["设备环境"] APP BROWSER end subgraph singbox["sing-box"] subgraph inbounds["入站规则"] TUN MIXED end subgraph routing["路由规则"] TUN_ROUTE ROUTER end subgraph outbounds["出站规则"] TO_MITM DIRECT PROXY BLOCK end end subgraph mitmproxy["mitmproxy"] HTTP_PROXY MITM WEBUI end subgraph external["外部网络"] INTERNET end %% 请求路径 - 实线 APP -->|"应用请求"| TUN TUN -->|"TUN流量"| TUN_ROUTE TUN_ROUTE -->|"全部流量"| TO_MITM TO_MITM -->|"转发到9999端口"| HTTP_PROXY HTTP_PROXY -->|"上游代理到8888端口"| MITM MITM -->|"返回到8888端口"| MIXED MIXED -->|"解密后的流量"| ROUTER %% 从路由到三个并列出站的线条 - 三个完全独立 ROUTER -->|"国内网站"| DIRECT ROUTER -->|"国外网站"| PROXY ROUTER -->|"广告请求"| BLOCK %% 从出站到互联网的线条 DIRECT -->|"直连请求"| INTERNET PROXY -->|"代理请求"| INTERNET %% 响应路径 - 虚线 INTERNET -.->|"国内响应"| DIRECT INTERNET -.->|"国外响应"| PROXY %% 从出站返回到路由的线条 - 三个完全独立 DIRECT -.->|"直连响应"| ROUTER PROXY -.->|"代理响应"| ROUTER BLOCK -.->|"阻断响应"| ROUTER %% 后续响应流程 ROUTER -.->|"分类后响应"| MIXED MIXED -.->|"加密后响应"| MITM MITM -.->|"代理响应"| HTTP_PROXY HTTP_PROXY -.->|"返回9999端口"| TO_MITM TO_MITM -.->|"转发响应"| TUN_ROUTE TUN_ROUTE -.->|"TUN响应"| TUN TUN -.->|"应用响应"| APP %% 监控线路 - 点虚线 MITM -...->|"流量分析"| WEBUI BROWSER -...->|"访问界面"| WEBUI %% 节点样式 classDef appNode fill:#6a329f,stroke:#9d78c2,color:#ffffff,stroke-width:2px classDef browserNode fill:#4682b4,stroke:#87ceeb,color:#ffffff,stroke-width:2px classDef tunNode fill:#2472c8,stroke:#5cb3ff,color:#ffffff,stroke-width:2px classDef mixedNode fill:#8b4513,stroke:#d2691e,color:#ffffff,stroke-width:2px classDef routerNode fill:#a52a2a,stroke:#cd5c5c,color:#ffffff,stroke-width:2px classDef proxyNode fill:#6b8e23,stroke:#9acd32,color:#ffffff,stroke-width:2px classDef directNode fill:#483d8b,stroke:#7b68ee,color:#ffffff,stroke-width:2px classDef blockNode fill:#8b0000,stroke:#ff6347,color:#ffffff,stroke-width:2px classDef httpNode fill:#c95f00,stroke:#ffa452,color:#ffffff,stroke-width:2px classDef mitmNode fill:#298a3c,stroke:#5fd46c,color:#ffffff,stroke-width:2px classDef webUINode fill:#800080,stroke:#da70d6,color:#ffffff,stroke-width:2px classDef internetNode fill:#696969,stroke:#d3d3d3,color:#ffffff,stroke-width:2px classDef toMitmNode fill:#ff7f50,stroke:#ffb347,color:#ffffff,stroke-width:2px classDef tunRouteNode fill:#db7093,stroke:#ffb6c1,color:#ffffff,stroke-width:2px %% 应用节点样式 class APP appNode class BROWSER browserNode class TUN tunNode class MIXED mixedNode class TUN_ROUTE tunRouteNode class ROUTER routerNode class TO_MITM toMitmNode class PROXY proxyNode class DIRECT directNode class BLOCK blockNode class HTTP_PROXY httpNode class MITM mitmNode class WEBUI webUINode class INTERNET internetNode %% 子图样式 style deviceEnv fill:#2d2d2d,stroke:#666666,color:#ffffff,stroke-width:1px style singbox fill:#1a1a1a,stroke:#555555,color:#ffffff,stroke-width:1px style inbounds fill:#333333,stroke:#888888,color:#ffffff,stroke-width:1px style routing fill:#333333,stroke:#888888,color:#ffffff,stroke-width:1px style outbounds fill:#333333,stroke:#888888,color:#ffffff,stroke-width:1px style mitmproxy fill:#2a2a2a,stroke:#777777,color:#ffffff,stroke-width:1px style external fill:#2d2d2d,stroke:#666666,color:#ffffff,stroke-width:1px
3.整体配置#
3.1 sing-box 配置#
- 两个入站
- tun 虚拟网卡
- mixed 混合入站:接收 8888 端口流量
- 四个出站
- To-Mitmproxy:接收 tun 流量转发到 9999 端口
- 国外代理:接收 mixed 流量转发到国外代理
- 国内代理:接收 mixed 流量转发到国内代理
- 广告拦截:接收 mixed 流量转发到广告拦截
- 四个路由
- TUN 专用路由:接收 tun 流量,全部转发到 To-Mitmproxy 出站
- 国内网站:接收 mixed 流量转发到国内代理
- 国外网站:接收 mixed 流量转发到国外代理
- 广告请求:接收 mixed 流量转发到广告拦截
3.2 mitmproxy 配置#
- web 界面
--set web_port=8081
- 打开于
8081
端口
- 代理模式
--mode=upstream:http://127.0.0.1:8888@9999
- 代理模式为上游代理模式
- 在本地
9999
端口监听客户端连接,将所有拦截到的流量转发到上游代理http://127.0.0.1:8888
4. 快速使用#
- 使用UIF来快速使用 sing-box
- 单独编写
uif_capture.json
,在要抓包的时候,先备份正常的uif.json
,然后复制uif_capture.json
到/usr/bin/uif/uif.json
- 单独编写
core_config_capture.json
,在要抓包的时候,先备份正常的core_config.json
,然后复制core_config_capture.json
到/usr/bin/uif/core_config.json
- 启动
mitmweb
:mitmweb --set web_port=8081 --mode=upstream:http://127.0.0.1:8888@9999
- 启动
uif
- 开始抓包
- 抓包结束后,恢复
uif.json
和core_config.json