忽略域名
优质
小牛编辑
138浏览
2023-12-01
忽略域名
您可能要从mitmproxy
的拦截机制中免除部分流量的主要原因有两个:
- 证书固定:使用证书固定保护某些流量, 而
mitmproxy
的拦截会导致错误。例如,如果mitmproxy
处于活动状态,则Twitter
应用程序,Windows Update
或Apple App Store
无法工作。 - 便利性:您实际上并不关心某些流量,而只是希望它们消失。请注意,在这里,
mitmproxy
的Limit
选项通常是更好的选择,因为它不受以下列出的限制的影响。 如果您想窥视(受SSL保护的)非HTTP
连接,请查看 tcp_proxy功能。如果由于响应主体较大而要忽略mitmproxy处理过程中的流量,请查看流功能。
ignore_hosts
ignore_hosts
选项允许您指定与host:port
连接字符串(例如" example.com:443"
)匹配的正则表达式。匹配的主机将从侦听中排除,并未经修改地传递。
- 命令行别名:
--ignore-hosts regex
例:
mitmdump -s index.py --ignore-hosts "example\.com"
- mitmproxy选项: ignore_hosts
局限性
有两个重要的状况要考虑:
在透明模式下,忽略模式与IP和ClientHello SNI主机匹配。虽然通常会在
ignore_hosts
设置了该选项的情况下从Host
标头推断出主机名,但在SSL
握手之前我们无权访问此信息。但是,如果客户端使用SNI
,则我们会将SNI
主机视为忽略目标。- 在常规和上游代理模式下,绝不会忽略显式HTTP请求。 [1]忽略模式应用于CONNECT请求,该请求启动HTTPS或明文WebSocket连接。
教程
如果您只想忽略一个特定的域,通常可以采用可靠的方法:
以详细模式(-v
)运行mitmproxy
或mitmdump
,并观察host:port serverconnect
消息中的信息。mitmproxy
将对此进行过滤。 取host:port
字符串,用^
和$
括起来,转义所有点(. becomes .)并将其用作忽略模式:
>>> mitmdump -v
127.0.0.1:50588: clientconnect
127.0.0.1:50588: request
-> CONNECT example.com:443 HTTP/1.1
127.0.0.1:50588: Set new server address: example.com:443
127.0.0.1:50588: serverconnect
-> example.com:443
^C
>>> mitmproxy --ignore-hosts ^example\.com:443$
以下是忽略模式的其他一些示例:
# 从iOS应用程序商店中免除流量(regex是不严格的,但一般可以工作):
--ignore-hosts apple.com:443
# 无误报的“正确”版本:
--ignore-hosts '^(.+\.)?apple\.com:443$'
# 忽略example.com网站,但不包括二级域名:
--ignore-hosts '^example.com:'
# 透明模式:
--ignore-hosts 17\.178\.96\.59:443
# IP地址范围:
--ignore-hosts 17\.178\.\d+\.\d+:443
此选项还可用于通过否定的超前表达式仅允许某些特定域。但是,忽略模式始终会与目标的IP地址匹配,然后再与目标域名匹配。因此,该模式必须允许使用类似这样的表达式的任何IP地址^(?![0-9.]+:),以使其起作用。以下是这种模式的示例:
# 忽略一切,除了example.com网站以及mitmproxy.org(不包括二级域名):
--ignore-hosts '^(?![0-9\.]+:)(?!example\.com:)(?!mitmproxy\.org:)'
# 忽略一切,除了example.com网站及其子域:
--ignore-hosts '^(?![0-9\.]+:)(?!([^\.:]+\.)*example\.com:)'
Footnotes
这源于显式HTTP代理的局限性:单个连接可以重新用于多个目标域-GEThttp://example.com/
请求之后可以是GEThttp://evil.com/
同一连接上的请求。如果我们在第一个请求之后开始忽略连接,我们将错过相关的第二个请求。