最近在使用 mitmproxy 作为中间人代理服务器做一些对 https 请求和响应的中间修改。现在的问题是 mitmproxy 非常慢 , 在请求到达和响应完成都会增加几百毫秒的延迟,问问大家有没有这样一款代理服务器:
1.像 mitmproxy 也可以有插件机制的 https 代理服务器。 2.性能快一点,真正的请求以外的浪费尽量少;能支持 https 长链接,不要每次请求好像都要重新握手。
![]() | 1 jerryjhou 2022-02-19 17:56:09 +08:00 via iPad 把证书验证取消能降低延迟,你敢吗 |
![]() | 2 smilebaby OP @jerryjhou 必须要走 https ,因为浏览器要跑 https 的网页。这种情况能 把证书验证取取消 ? 能否详细说说 已经信任了 mitmproxy 的证书了,我感觉没啥不敢的。 |
3 dcty 2022-02-19 18:08:10 +08:00 via iPhone Mac 的话试试看 surge |
![]() | 5 jerryjhou 2022-02-19 18:19:05 +08:00 via iPad @smilebaby 取消验证不是指浏览器不验证证书,是让 Mitmproxy 不再验证远程服务器的证书 中间人的工作原理肯定会有额外延迟 |
![]() | 6 haoliang 2022-02-19 18:20:39 +08:00 openresty? |
![]() | 8 ch2 2022-02-19 18:25:58 +08:00 Fiddler 自带的 Jscript |
![]() | 10 also24 2022-02-19 18:31:19 +08:00 ![]() @jerryjhou #5 看了你这条,去翻了下文档,发现 mitmproxy 有个 "Upstream Certificate Sniffing" 的功能,感觉这个功能会大大的增加延迟。 https://docs.mitmproxy.org/stable/concepts-certificates/#upstream-certificate-sniffing 这个功能可以通过选项 upstream_cert 来关闭。 @smilebaby #7 可以通过 ssl_insecure 选项关闭对上游证书的验证,不过我觉得可以先试一下我前面提到的 upstream_cert 选项 https://docs.mitmproxy.org/stable/concepts-options/ |
![]() | 11 smilebaby OP |
![]() | 12 also24 2022-02-19 18:48:01 +08:00 ![]() @smilebaby #11 你的 mintmproxy 版本是? --insecure 应该是旧版本的选项,对应新版本的 --ssl-insecure 至于 upstream_cert ,应该使用 --set upstream_cert=false |
![]() | 13 smilebaby OP @also24 谢谢!因为要在 py2 上跑,用了个低版本。我刚想起来,题目里没说清楚,其实我大部分情况是自己造一个响应,所以不请求真正的服务器。现在要解决的是浏览器和代理间的性能问题,哪怕同一台机器上,也像附言里看到的浪费太多时间。浏览器和代理间能保持长链接吗? |
![]() | 14 wuruxu 2022-02-19 19:30:30 +08:00 看看这个用 C 实现的 https://github.com/droe/sslsplit |
![]() | 15 zer 2022-02-19 19:46:04 +08:00 试过 charles 吗? |
16 ly841000 2022-02-19 20:19:32 +08:00 也用过 mitmproxy ,不仅慢,还有内存泄漏,时间长了连不上等问题,体验很差, 后来用 c# Titanium.Web.Proxy 库,只对需要修改的 Host 代理,其它的直连,好用太多了 |
![]() | 17 ETiV 2022-02-19 20:38:37 +08:00 你得说说你本质的需求 至少这些年我用它下来没觉得它慢过,因为我根本不会在意响应到达客户端的延迟 mitmproxy 在设计上是为了能够劫持并修改内容的,修改内容这一部分就需要等待内容全部下载回来后再触发的钩子。。然后它再将这些内容吐回给请求端。 这中间必然有延迟,或者说增加了请求端的「首字节响应时间」 |
![]() | 18 smilebaby OP @ETiV 对,我的问题开始没有说清楚。我的问题实际是目前看浏览器和代理之间没有维持一个长链接,导致每次请求浪费在浏览器和代理之间的时间太多。第一次请求慢可以接受,对真正目标的访问更不重要,因为数据是自己组织的,或者可以不用 mitmproxy 获取。 |
![]() | 22 monkeyWie 2022-02-19 21:49:51 +08:00 java 的可以吗,试试我这个: https://github.com/monkeyWie/proxyee |
![]() | 24 smilebaby OP @monkeyWie 才发现您是作者,厉害!我需要找朋友随后实验一下。我现在的问题主要集中在浏览器和代理间这个交互需要保持长链接,使用场景是同一台机器上,希望通讯时间能降到 10ms 一下。https 通讯同一台机器上保持长链接并降到 10ms 以下,您觉得可能吗? |
![]() | 25 smilebaby OP 先忽略代理服务器和真实网址之间交互的性能问题。( 1.大部分情况是自己组织伪数据,2.有真实的请求也可以自己实现不用代理程序自己的。) |
![]() | 26 llbbzh 2022-02-19 22:36:26 +08:00 Fiddler 性能不错的呀,感觉比 Mitmproxy 好不少 |
27 0o0O0o0O0o 2022-02-19 22:40:44 +08:00 via iPhone 我用过很多 mitm 工具和库,对于你描述的场景,我还是建议你自己实现。go 有不少 mitm 实现,找个用用,十行不到就能实现一个简单的 mitm ,语言跨平台,而且也不用找什么插件系统了,自己写代码实现想要的功能。 |
28 0o0O0o0O0o 2022-02-19 22:44:09 +08:00 import "github.com/elazarl/goproxy" proxy := goproxy.NewProxyHttpServer() proxy.OnRequest(goproxy.ReqHostMatches(regexp.MustCompile(pattern))). HandleConnect(goproxy.AlwaysMitm) // proxy.OnRequest ... // proxy.OnResponse ... |
![]() | 29 smilebaby OP @0o0O0o0O0o 是个新思路,多谢! |
30 neohob 2022-02-19 23:06:07 +08:00 via iPhone socat gost realm |
![]() | 31 mrchi 2022-02-20 09:14:46 +08:00 这是用到生产环境上了?这玩意难道不是调试用的吗?调试时候多了几百豪秒延迟你能感觉出来? |
34 SergeGao 2022-02-20 13:31:36 +08:00 可以试试 whistle ,https://github.com/avwo/whistle |
36 warcraft1236 2022-02-21 11:11:59 +08:00 奇怪,如果你的所有返回都是自己构造的,那么你应该做一个 mock server ,这样也不会存在性能问题 |
![]() | 37 smilebaby OP @warcraft1236 你是说不过代理,直接做个假的 web 服务吗? |