忽略域名

您可能要从mitmproxy的拦截机制中免除部分流量的主要原因有两个:

  • 证书固定:使用证书固定保护某些流量, 而mitmproxy的拦截会导致错误。例如,如果mitmproxy处于活动状态,则Twitter应用程序,Windows UpdateApple App Store无法工作。
  • 便利性:您实际上并不关心某些流量,而只是希望它们消失。请注意,在这里,mitmproxyLimit选项通常是更好的选择,因为它不受以下列出的限制的影响。 如果您想窥视(受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)运行mitmproxymitmdump,并观察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/同一连接上的请求。如果我们在第一个请求之后开始忽略连接,我们将错过相关的第二个请求。