Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

补充readme中的使用说明部分 #61

Merged
merged 4 commits into from Mar 8, 2023
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
331 changes: 328 additions & 3 deletions README.md
Expand Up @@ -33,8 +33,6 @@

## 使用方法

这里仅介绍最基本的使用流程,具体使用方法和规则请查看[文档](https://good-mitm.zu1k.com/)

### 证书准备

由于`MITM`技术的需要,需要你生成并信任自己的根证书
Expand All @@ -43,11 +41,13 @@

出于安全考虑,请不要随意信任任何陌生人提供的根证书,你需要自己生成属于自己的根证书和私钥

经验丰富的用户可以自行使用OpenSSL进行相关操作,考虑到没有相关经验的用户,可以使用以下命令直接生成相关内容,生成的证书和私钥将存储在`ca`目录下

```shell
good-mitm.exe genca
```

上面命令将会生成私钥和证书,文件将存储在`ca`文件夹下
在浏览器使用了Good-MITM提供的代理后,通过访问 [http://cert.mitm.plus](http://cert.mitm.plus) 可以直接下载证书,这在给其他设备提供服务时非常有用

#### 信任证书

Expand All @@ -63,6 +63,331 @@ good-mitm.exe run -r rules

在浏览器或操作系统中使用Good-MITM提供的http代理:`http://127.0.0.1:34567`

#### 透明代理

See https://docs.mitmproxy.org/stable/howto-transparent/ for docs.

```shell
sudo sysctl -w net.ipv4.ip_forward=1
sudo sysctl -w net.ipv6.conf.all.forwarding=1
sudo sysctl -w net.ipv4.conf.all.send_redirects=0

sudo useradd --create-home mitm
sudo -u mitm -H bash -c 'good-mitm run -r rules/log.yaml -b 0.0.0.0:34567'

sudo iptables -t nat -A OUTPUT -p tcp -m owner ! --uid-owner mitm --dport 80 -j REDIRECT --to-port 34567
sudo iptables -t nat -A OUTPUT -p tcp -m owner ! --uid-owner mitm --dport 443 -j REDIRECT --to-port 34567
sudo ip6tables -t nat -A OUTPUT -p tcp -m owner ! --uid-owner mitm --dport 80 -j REDIRECT --to-port 34567
sudo ip6tables -t nat -A OUTPUT -p tcp -m owner ! --uid-owner mitm --dport 443 -j REDIRECT --to-port 34567
```

## Rule 规则

`Rule`用来操控 Good-MITM

一条合格的规则需要包含以下内容:

- `规则名`:用来区分不同的规则,便与维护
- [`筛选器`](#filter):用于从众多`请求`和`返回`中筛选出需要处理的内容
- [`动作`](#action):用于执行想要的行为,包括`重定向`、`阻断`、`修改`等
- 必要时指定需要MITM的域名

```yaml
- name: "屏蔽Yutube追踪"
mitm: "*.youtube.com"
filter:
url-regex: '^https?:\/\/(www|s)\.youtube\.com\/(pagead|ptracking)'
action: reject
```

同时一条合格的规则需要符合以下要求:

- 专注:一条规则只用来做一件事
- 简单:使用简单的方法来处理,便与维护
- 高效:尽量使用高效的方法,比如使用域名后缀和域名前缀来替换域名正则表达式


### Filter 筛选器 <span id="filter"></span>

`Filter`用来筛选需要处理的请求和返回

#### 候选项

`Filter`目前包含以下类型:

- All
- Domain(String)
- DomainKeyword(String)
- DomainPrefix(String)
- DomainSuffix(String)
- UrlRegex(fancy_regex::Regex)

> **注意**
> 当前版本中,`domain`相关类型匹配的是`host`,通常情况下不会影响结果
> 在网站使用非常规端口时,规则需要注明端口
> 后续版本将会对此行为进行优化

##### All 全部

指定筛选器为`all`时将会命中全部请求和返回,通常用来执行日志记录行为

```yaml
- name: "log"
filter: all
action:
- log-req
- log-res
```

##### Domain 域名

`domain`对域名进行全量匹配

```yaml
- name: "redirect"
filter:
domain: 'none.zu1k.com'
action:
redirect: "https://zu1k.com/"
```

##### DomainKeyword 域名关键词

`domain-keyword`对域名进行关键词匹配

```yaml
- name: "reject CSDN"
filter:
domain-keyword: 'csdn'
action: reject
```

##### DomainPrefix 域名前缀

`domain-prefix`对域名进行前缀匹配

```yaml
- name: "ad prefix"
filter:
domain-prefix: 'ads' // example: "ads.xxxxx.com"
action: reject
```

##### DomainSuffix 域名后缀

`domain-suffix`对域名进行后缀匹配


```yaml
- name: "redirect"
filter:
domain-suffix: 'google.com.cn'
action:
redirect: "https://google.com"
```

##### UrlRegex Url正则

`url-regex`对整个url进行正则匹配

```yaml
- name: "youtube追踪"
mitm: "*.youtube.com"
filter:
url-regex: '^https?:\/\/(www|s)\.youtube\.com\/(pagead|ptracking)'
action: reject
```

#### 多个筛选器

`filters`字段支持单个筛选器和多个筛选器,多个筛选器之间的关系为`或`

```yaml
- name: "youtube-2"
mitm:
- "*.youtube.com"
- "*.googlevideo.com"
filters:
- url-regex: '^https?:\/\/[\w-]+\.googlevideo\.com\/(?!(dclk_video_ads|videoplayback\?)).+(&oad|ctier)'
- url-regex: '^https?:\/\/(www|s)\.youtube\.com\/api\/stats\/ads'
- url-regex: '^https?:\/\/(www|s)\.youtube\.com\/(pagead|ptracking)'
- url-regex: '^https?:\/\/\s.youtube.com/api/stats/qoe?.*adformat='
action: reject
```

具有相同动作的多个规则可聚合为一个规则以便于维护

### Action 动作 <span id="action"></span>

`Action` 用来对请求或者返回进行操作

#### 候选项

`Action`目前包含以下选项:

- Reject
- Redirect(String)
- ModifyRequest(Modify)
- ModifyResponse(Modify)
- LogRes
- LogReq

##### Reject 拒绝

`reject`类型直接返回`502`,用来拒绝某些请求,可以用来拒绝追踪和广告

```yaml
- name: "reject CSDN"
filter:
domain-keyword: 'csdn'
action: reject
```

##### Redirect 重定向

`redirect`类型直接返回`302`重定向

```yaml
- name: "youtube-1"
filter:
url-regex: '(^https?:\/\/(?!redirector)[\w-]+\.googlevideo\.com\/(?!dclk_video_ads).+)(ctier=L)(&.+)'
action:
redirect: "$1$4"
```

##### ModifyRequest 修改请求

`modify-request`用来修改请求,具体修改规则见 [修改器](#modify)

##### ModifyResponse 修改返回

`modify-response`用来修改返回,具体修改规则见 [修改器](#modify)

##### Log 记录日志

`log-req` 用来记录请求,`log-res` 用来记录返回

#### 多个动作

`actions`字段支持单个动作和多个动作,当需要执行多个动作时,应使用数组

```yaml
- name: "youtube-1"
filter:
url-regex: '(^https?:\/\/(?!redirector)[\w-]+\.googlevideo\.com\/(?!dclk_video_ads).+)(ctier=L)(&.+)'
actions:
- log-req:
- redirect: "$1$4"
```

### 修改器 <span id="modify"></span>

修改器用来执行修改操作,包括修改请求和修改返回

#### 候选项

根据需要修改的内容的位置,修改器分为以下几类:

- Header(MapModify)
- Cookie(MapModify)
- Body(TextModify)

##### TextModify 文本修改器

`TextModify` 主要对文本就行修改,目前支持两种方式:

- 直接设置文本内容
- 普通替换或者正则替换

###### 直接设置

对于plain类型直接设置,内容将被直接重置为指定文本

```yaml
- name: "modify response body plain"
filter:
domain: '126.com'
action:
modify-response:
body: "Hello 126.com, from Good-MITM"
```

###### 替换

替换支持简单替换和正则替换两种

简单替换

```yaml
- name: "modify response body replace"
filter:
domain-suffix: '163.com'
action:
modify-response:
body:
origin: "网易首页"
new: "Good-MITM 首页"
```

正则替换

```yaml
- name: "modify response body regex replace"
filter:
domain-suffix: 'zu1k.com'
action:
- modify-response:
body:
re: '(\d{4})'
new: 'maybe $1'

```

##### MapModify 字典修改器

`MapModify` 字典修改器主要针对字典类型的位置进行修改,例如 `header` 和 `cookies`

`key` 代表字典的键,必须指定

`value` 是 `TextModify` 类型,按照上文方法书写

如果指定 `remove` 为 `true`,则会删除该键值对

```yaml
- name: "modify response header"
filter:
domain: '126.com'
action:
- modify-response:
header:
key: date
value:
origin: "2022"
new: "1999"
- modify-response:
header:
key: new-header-item
value: Good-MITM
- modify-response:
header:
key: server
remove: true
```

##### Header 修改

见 `MapModify` 部分方法

##### Cookie 修改

与 Header 修改方法一致

如果指定 `remove` 为 `true` 还会同时对应的移除`set-cookie`项

##### Body修改

见 `TextModify` 部分

## License

**Good-MITM** © [zu1k](https://github.com/zu1k), Released under the [MIT](./LICENSE) License.