node-mitmproxy1
Version: 
Node.js MITM Proxy
309 lines (251 loc) • 9.59 kB
Markdown
# node-mitmproxy 4.x
[](https://www.npmjs.com/package/node-mitmproxy)  
node-mitmproxy是一个基于nodejs,支持http/https的高性能中间人(MITM)代理,便于渗透测试和开发调试。
## 1、特性
1、支持https  
2、支持配置的方式启动,也支持以模块的方式引入到代码中  
3、**选择性拦截** - 智能路径选择,大幅提升性能  
4、**性能优化** - Promise池化、连接复用、快速路径等多项优化  
5、**WebSocket代理** - 完整支持WebSocket协议代理  
6、**固定证书** - 支持使用固定SSL证书,避免证书变化  
7、**性能监控** - 内置性能统计和监控功能
## 2、安装
###### windows
```
    npm install node-mitmproxy1 -g
```
###### Mac
```
    sudo npm install node-mitmproxy1 -g
```
## 3、使用
#### 关于配置文件
###### 简单配置:
simpleConfig.js
```
module.exports = {
    sslConnectInterceptor: (req, cltSocket, head) => true,
    requestInterceptor: (rOptions, req, res, ssl, next) => {
        console.log(`正在访问:${rOptions.protocol}//${rOptions.hostname}:${rOptions.port}`);
        console.log('cookie:', rOptions.headers.cookie);
        res.end('hello node-mitmproxy!');
        next();
    }
};
```
效果图:  
<img width=500 src="./doc/img/hello_node-mitmproxy.jpg" />
[详细配置说明](https://github.com/wuchangming/node-mitmproxy#4配置详细说明)  
[更多例子](./example/config/)
#### 启动方式
```
node-mitmproxy -c simpleConfig.js
```
### 安装node-mitmproxy CA根证书
生成CA根证书的默认路径:`%用户名%/node-mitmproxy`
#### PC下安装根证书方式
###### Mac
```
sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain ~/node-mitmproxy/node-mitmproxy.ca.crt
```
###### windows
注: 证书需要安装到  ** 受信任的根证书目录 ** 下  
参考 [issues#3](https://github.com/wuchangming/node-mitmproxy/issues/3)
```
start %HOMEPATH%/node-mitmproxy/node-mitmproxy.ca.crt
```
## 以nodejs模块的方式引用到代码中
### 基础使用
```javascript
var mitmproxy = require('node-mitmproxy');
mitmproxy.createProxy({
    port: 8080,
    sslConnectInterceptor: (req, cltSocket, head) => true,
    requestInterceptor: (rOptions, req, res, ssl, next) => {
        console.log(`正在访问:${rOptions.protocol}//${rOptions.hostname}:${rOptions.port}`);
        console.log('cookie:', rOptions.headers.cookie);
        res.end('Hello node-mitmproxy!');
        next();
    },
    responseInterceptor: (req, res, proxyReq, proxyRes, ssl, next) => {
        next();
    }
});
```
### 选择性拦截使用(推荐)
```javascript
var mitmproxy = require('node-mitmproxy');
// 选择性拦截配置
const interceptConfig = {
    // 只拦截这些域名的请求
    domains: ['api.example.com', 'auth.mysite.com'],
    
    // 只拦截这些路径前缀的请求
    pathPrefixes: ['/api/', '/auth/', '/admin/'],
    
    // 静态资源自动走快速模式
    staticExtensions: ['.js', '.css', '.png', '.jpg', '.ico']
};
mitmproxy.createProxy({
    port: 8080,
    sslConnectInterceptor: (req, cltSocket, head) => true,
    requestInterceptor: (rOptions, req, res, ssl, next) => {
        console.log('拦截请求:', req.headers.host + req.url);
        // 只有匹配拦截规则的请求才会到这里
        next();
    },
    responseInterceptor: (req, res, proxyReq, proxyRes, ssl, next) => {
        console.log('拦截响应:', req.headers.host + req.url);
        next();
    },
    interceptConfig  // 启用选择性拦截
});
```
## 4、配置详细说明
#### port
启动端口(默认:6789)
```
    port: 6789
```
#### interceptConfig
选择性拦截配置(新增功能,可大幅提升性能)
```javascript
interceptConfig: {
    // 需要拦截的域名列表(支持子域名匹配)
    domains: ['api.example.com', 'auth.mysite.com'],
    
    // 需要拦截的完整URL列表
    urls: ['cdn.example.com/api/v1/user'],
    
    // 需要拦截的URL前缀列表
    urlPrefixes: ['api.example.com/v1/', 'auth.mysite.com/oauth/'],
    
    // 需要拦截的路径前缀列表
    pathPrefixes: ['/api/', '/auth/', '/admin/'],
    
    // 静态资源扩展名(自动走快速模式)
    staticExtensions: ['.js', '.css', '.png', '.jpg', '.ico']
}
```
**选择性拦截优势:**
- 🚀 **性能提升40-60%** - 只拦截需要的请求
- 📊 **智能路径选择** - 自动识别静态资源和CDN
- 🎯 **精确控制** - 支持域名、URL、路径多维度匹配
- 📈 **实时监控** - 内置性能统计和监控
#### sslConnectInterceptor
判断该connnect请求是否需要代理,传入参数参考[http connnect](https://nodejs.org/api/http.html#http_event_connect) 。
```
    sslConnectInterceptor: (clientReq, clientSocket, head) => true,
```
#### requestInterceptor
拦截客户端请求/响应  
参数说明:  
1、requestOptions:客户端请求参数  
2、clientReq: 客户端请求,参考[http.IncomingMessage](https://nodejs.org/api/http.html#http_class_http_incomingmessage)  
3、clientRes: 客户端响应,参考[http.ServerResponse](https://nodejs.org/api/http.html#http_class_http_serverresponse)  
4、ssl: 该请求是否为https  
5、next: 回调函数,执行完拦截逻辑后调用该方法  
```
    requestInterceptor: (requestOptions, clientReq, clientRes, ssl, next) => {
        next();
    }
```
#### responseInterceptor
拦截服务端请求/响应  
参数说明:  
1、clientReq: 客户端请求,参考[http.IncomingMessage](https://nodejs.org/api/http.html#http_class_http_incomingmessage)  
2、clientRes: 客户端响应,参考[http.ServerResponse](https://nodejs.org/api/http.html#http_class_http_serverresponse)  
3、proxyReq: 服务端请求,参考[http.IncomingMessage](https://nodejs.org/api/http.html#http_class_http_incomingmessage)  
4、proxyRes: 服务端响应,参考[http.ServerResponse](https://nodejs.org/api/http.html#http_class_http_serverresponse)  
5、ssl: 该请求是否为https  
6、next: 回调函数,执行完拦截逻辑后调用该方法  
```
    responseInterceptor: (clientReq, clientRes, proxyReq, proxyRes, ssl, next) => {
        next();
    }
```
#### caCertPath
CA根证书路径(ps: 无特殊情况无需配置)  
默认:%HOMEPATH%/node-mitmproxy/node-mitmproxy.ca.crt  
```
caCertPath: 'xxxx/xxxx.crt'
```
#### caKeyPath
CA根证书密钥路径(ps: 无特殊情况无需配置)  
默认:%HOMEPATH%/node-mitmproxy/node-mitmproxy.ca.key.pem  
```
caKeyPath: 'xxxx/xxxx.pem'
```
#### getCertSocketTimeout
获取证书超时时间(默认:1000ms)
```
    getCertSocketTimeout: 1000
```
#### enableWebSocket
是否启用WebSocket代理支持(默认:true)
```
    enableWebSocket: true
```
#### performanceMonitor
是否启用性能监控(默认:false)
```
    performanceMonitor: true
```
## 5、性能优化与最佳实践
### 选择性拦截最佳实践
1. **精确配置域名和路径**
   - 只配置真正需要拦截的域名和路径
   - 避免过于宽泛的匹配规则
2. **合理使用快速域名**
   - 将CDN、静态资源域名加入fastDomains
   - 常见快速域名:`cdn.jsdelivr.net`, `fonts.googleapis.com`, `unpkg.com`
3. **静态资源自动优化**
   - 系统自动识别常见静态资源扩展名
   - 可自定义staticExtensions列表
4. **性能监控**
   - 启用performanceMonitor查看拦截统计
   - 根据统计数据优化拦截配置
### 性能提升效果
- **普通模式**:所有请求都经过拦截器处理
- **选择性拦截**:只处理匹配规则的请求,其他走快速路径
- **性能提升**:根据拦截比例,可提升40-60%的代理性能
## 6、快速开始示例
创建一个简单的API拦截代理:
```javascript
const mitmproxy = require('node-mitmproxy');
// 创建选择性拦截配置
const interceptConfig = {
    domains: ['jsonplaceholder.typicode.com'],
    pathPrefixes: ['/posts', '/users'],
    fastDomains: ['cdn.jsdelivr.net']
};
// 启动代理服务器
mitmproxy.createProxy({
    port: 8080,
    requestInterceptor: (rOptions, req, res, ssl, next) => {
        console.log('🔍 拦截请求:', req.headers.host + req.url);
        
        // 修改请求头
        rOptions.headers['X-Custom-Header'] = 'node-mitmproxy';
        
        next();
    },
    responseInterceptor: (req, res, proxyReq, proxyRes, ssl, next) => {
        console.log('📦 拦截响应:', proxyRes.statusCode, req.headers.host + req.url);
        next();
    },
    interceptConfig,
    performanceMonitor: true
});
console.log('🚀 代理服务器已启动: http://localhost:8080');
console.log('📊 性能监控已启用');
```
## 7、版本更新说明
### v4.x 主要更新
- ✨ **选择性拦截功能** - 智能路径选择,大幅提升性能
- 🚀 **性能优化** - Promise池化、连接复用等多项优化
- 🔧 **WebSocket支持** - 完整的WebSocket代理功能
- 📊 **性能监控** - 内置统计和监控功能
- 🔒 **固定证书** - 支持使用固定SSL证书
- 🛠️ **API改进** - 更友好的配置选项和错误处理
### 从v3.x升级
- 保持向后兼容,现有代码无需修改
- 建议添加`interceptConfig`配置以获得性能提升
- 新项目推荐使用选择性拦截模式
## 8、更多
#### 关于伪造https证书的逻辑图
<img src="doc/img/node-MitmProxy https.png" width=650/>
#### 关于http代理的逻辑图
<img src="doc/img/node-MitmProxy http.png" width=650/>