跳过正文
  1. 文章/

使用Tun虚拟网卡抓包

··406 字·2 分钟
Tools Linux Tun Sing-Box Mitmproxy
目录

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

3.整体配置
#

3.1 sing-box 配置
#

  1. 两个入站
    • tun 虚拟网卡
    • mixed 混合入站:接收 8888 端口流量
  2. 四个出站
    • To-Mitmproxy:接收 tun 流量转发到 9999 端口
    • 国外代理:接收 mixed 流量转发到国外代理
    • 国内代理:接收 mixed 流量转发到国内代理
    • 广告拦截:接收 mixed 流量转发到广告拦截
  3. 四个路由
    • TUN 专用路由:接收 tun 流量,全部转发到 To-Mitmproxy 出站
    • 国内网站:接收 mixed 流量转发到国内代理
    • 国外网站:接收 mixed 流量转发到国外代理
    • 广告请求:接收 mixed 流量转发到广告拦截

3.2 mitmproxy 配置
#

  1. web 界面
    • --set web_port=8081
    • 打开于8081端口
  2. 代理模式
    • --mode=upstream:http://127.0.0.1:8888@9999
    • 代理模式为上游代理模式
    • 在本地9999端口监听客户端连接,将所有拦截到的流量转发到上游代理http://127.0.0.1:8888

4. 快速使用
#

  1. 使用UIF来快速使用 sing-box
  2. 单独编写uif_capture.json,在要抓包的时候,先备份正常的uif.json,然后复制uif_capture.json/usr/bin/uif/uif.json
  3. 单独编写core_config_capture.json,在要抓包的时候,先备份正常的core_config.json,然后复制core_config_capture.json/usr/bin/uif/core_config.json
  4. 启动mitmweb
    mitmweb --set web_port=8081 --mode=upstream:http://127.0.0.1:8888@9999
    
  5. 启动uif
  6. 开始抓包
  7. 抓包结束后,恢复uif.jsoncore_config.json

5.参考资料
#

xiadengma
作者
xiadengma