惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

K
Kaspersky official blog
T
Threat Research - Cisco Blogs
N
News and Events Feed by Topic
Hacker News: Ask HN
Hacker News: Ask HN
Project Zero
Project Zero
Application and Cybersecurity Blog
Application and Cybersecurity Blog
博客园 - 叶小钗
Security Latest
Security Latest
Spread Privacy
Spread Privacy
aimingoo的专栏
aimingoo的专栏
N
News and Events Feed by Topic
Webroot Blog
Webroot Blog
U
Unit 42
Cyberwarzone
Cyberwarzone
小众软件
小众软件
Scott Helme
Scott Helme
Engineering at Meta
Engineering at Meta
Microsoft Security Blog
Microsoft Security Blog
T
The Blog of Author Tim Ferriss
A
About on SuperTechFans
爱范儿
爱范儿
S
Schneier on Security
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Schneier on Security
Schneier on Security
Latest news
Latest news
GbyAI
GbyAI
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Simon Willison's Weblog
Simon Willison's Weblog
The Register - Security
The Register - Security
WordPress大学
WordPress大学
博客园_首页
Blog — PlanetScale
Blog — PlanetScale
PCI Perspectives
PCI Perspectives
Jina AI
Jina AI
AI
AI
NISL@THU
NISL@THU
I
Intezer
G
GRAHAM CLULEY
B
Blog
S
Secure Thoughts
IT之家
IT之家
宝玉的分享
宝玉的分享
Recent Announcements
Recent Announcements
Y
Y Combinator Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
酷 壳 – CoolShell
酷 壳 – CoolShell
有赞技术团队
有赞技术团队
V2EX - 技术
V2EX - 技术
Recorded Future
Recorded Future
Hacker News - Newest:
Hacker News - Newest: "LLM"

Yesterday17's Blog

2026 新年解密红包 / Melody Flag | Yesterday17's Blog 谈谈 Iori 的设计思路(二):如何实现一个 Showroom 录制工具? | Yesterday17's Blog 谈谈 Iori 的设计思路(一):从 Nico Timeshift 说起 | Yesterday17's Blog Iori Minyami 0.1.0 发布 | Yesterday17's Blog 2025 新年解密红包 / Melody Flag | Yesterday17's Blog 使用 Cloudflare Warp 解决罗森票务的海外登录问题 | Yesterday17's Blog How To Blog 04: The Astro v5 Era | Yesterday17's Blog 谈谈 tokio::select! 的公平性 | Yesterday17's Blog Learning Pingora 05 - Connect with TLS | Yesterday17's Blog Leaving Bytedance | Yesterday17's Blog 大橋彩香 AsiaTour「Reflection」上海公演 个人向记录 & Repo | Yesterday17's Blog Recoving from burnout - What happened? | Yesterday17 Yubikey 重建手册 | Yesterday17's Blog How To Blog 03: Heimus | Yesterday17's Blog 🪧 Blog Migration Accouncement | Yesterday17's Blog Learn Your IDE - VSCode 是如何仅重启插件的? | Yesterday17's Blog How To Blog 02: Astro❤️Password | Yesterday17's Blog How To Blog 01: Why, How, and the Future | Yesterday17's Blog Learning Pingora 04 - Establish L4 Connection | Yesterday17's Blog Learning Pingora 03 - Upstreams and Peers | Yesterday17's Blog Learning Pingora 02 - A Simple HTTP Server | Yesterday17's Blog Learning Pingora 01 - Getting Started | Yesterday17's Blog 2024 新年解密红包 / Melody Flag | Yesterday17's Blog 向新的一年飞驰——记录 2023 | Yesterday17's Blog 「サクラノ刻」对话选摘(2) | Yesterday17's Blog PGP Key Revocation 注销声明 | Yesterday17's Blog 「サクラノ刻」对话选摘(1) | Yesterday17's Blog 2023 新年解密红包 / Melody Flag | Yesterday17's Blog 『蒼の彼方のフォーリズム』通关感想 | Yesterday17's Blog 单显卡直通教程 | Yesterday17's Blog 对博客与笔记的思考 | Yesterday17's Blog Project Anni 之旅(3)自动化 Flutter 应用 CI/CD 上架流程 | Yesterday17's Blog AsobiStage 直接播放链接 | Yesterday17 如何在后分P时代进行投稿——sswa使用详解 | Yesterday17's Blog JSON RPC 与 LSP 协议基础 | Yesterday17's Blog Grajapa Shueisha / BookEnd 加密方式调查 | Yesterday17's Blog 【2022篇+WriteUp】如何再收一个新年红包? | Yesterday17's Blog 如何将良心云的良心功能清理干净 | Yesterday17's Blog 【油猴脚本】bilibili 投稿页面返回旧版+旧版页面强制允许分P上传 | Yesterday17's Blog Cloudr1v1 授权方式分析 | Yesterday17 Typora 1.0.2 逆向实录 | Yesterday17's Blog Project Anni 之旅(2)ValueAfterTable——toml-rs的实现与限制 | Yesterday17's Blog IPv4透明代理+IPv6 Passthrough——树莓派单臂软路由折腾记 | Yesterday17's Blog Chaos; Child 汉化补丁 神秘编码探索 | Yesterday17's Blog 镣铐与舞蹈——个性与共性之迷思 | Yesterday17's Blog Go 学习笔记 02 - 找准 io 之道 | Yesterday17's Blog NAT Slipstreaming v1 原理浅析 | Yesterday17's Blog 绕过「9-nine-」的 CDKEY 验证——KrkrPlugin 正(?)向实录 | Yesterday17's Blog 静流的青春纪念册——「サクラノ刻 -櫻の森の下を歩む-」体验版感言 | Yesterday17's Blog Project Anni 之旅 01 - 从 clap-builder 到 derive | Yesterday17's Blog [Google CTF 2021] CPP WriteUp | Yesterday17's Blog 获取 アソビステージ 的实际播放链接 | Yesterday17's Blog 90 行 Rust 代码实现 AsyncTeeReader | Yesterday17's Blog 或许还算有价值一读的文章列表 | Yesterday17's Blog 从零开始的 Seedbox 之旅 | Yesterday17's Blog [随笔]技术型博客行文迷思(1) | Yesterday17's Blog 浅谈 git fetch 的工作方式 | Yesterday17's Blog 『ソーサレス*アライヴ! ~the World's End Fallen Star~』通关感想" | Yesterday17's Blog Rust std::fmt 格式语法简述 | Yesterday17's Blog 日亚修改居住国的解决方案 | Yesterday17's Blog [Windows/Linux] GC553 的 Switch 完美采集之路 | Yesterday17's Blog 【翻译】Subtyping and Variance / 子类型与变型 | Yesterday17's Blog Berd's Red Envelope 2021 WriteUp | Yesterday17's Blog 【中英对照】ALSA 音频 API 使用教程/A Tutorial on Using the ALSA Audio API | Yesterday17's Blog 从 cue_scanner.l 看 CUE Sheet 的词法单元 | Yesterday17's Blog Postman 历史记录导出的解决方案 | Yesterday17's Blog 《恋爱绮谭 不存在的夏天》通关感想 | Yesterday17's Blog [微机实验/TD-PITE] 微机接口综合实验 | Yesterday17's Blog [微机实验/TD-PITE] 键盘扫描及数码管显示实验 | Yesterday17's Blog [微机实验/TD-PITE] 数码管显示实验 | Yesterday17's Blog Airsonic Advanced+Google Drive+Caddy 部署纪实 | Yesterday17's Blog X-NUCA 2020 - hellowasm 题解 | Yesterday17's Blog [微机实验/TD-PITE] 8251 串行接口实验 | Yesterday17's Blog Node.js child_process.fork 与 env 污染 RCE | Yesterday17's Blog EP.01 「夜の向日葵」 | Yesterday17's Blog [微机实验/TD-PITE] 8254 定时/计数器实验+选做实验 | Yesterday17's Blog [JLU CTF/2020] babywasm WriteUp | Yesterday17's Blog PHP 反序列化与经典利用 | Yesterday17's Blog WebAssembly 逆向简述 | Yesterday17's Blog 『彼女、お借りします』一期完结点评 | Yesterday17's Blog [微机实验/TD-PITE] D/A 转换实验+选做实验 | Yesterday17's Blog [微机实验/TD-PITE] A/D 转换实验+选做实验 | Yesterday17's Blog 开源项目申请 JetBrains Open Source License 简单流程 | Yesterday17's Blog 微软拼音与 JetBrains 搜索快捷键冲突的解决方案 | Yesterday17's Blog [微机实验/TD-PITE] 8259 中断优先级实验+选做实验 | Yesterday17's Blog IFTTT 测试(续) | Yesterday17 IFTTT 测试 | Yesterday17's Blog [微机实验/TD-PITE] 存储器扩展实验+选做实验 | Yesterday17's Blog 新版 GCC 针对 -fdump-translation-unit 的替代方案 | Yesterday17's Blog 一次 HSTS 策略配置的排错之旅 | Yesterday17's Blog YukiNative 踩坑记——Windows 的消息队列 | Yesterday17's Blog 我是我自己——论获取 HTTPS 证书时的验证步骤 | Yesterday17's Blog 【设计文档】对 PUG 的大规模设计修订(1.1) | Yesterday17's Blog GS65 折腾记(2)加装固态,分区,Grub2 引导 Manjaro LiveCD | Yesterday17's Blog 「さくら、もゆ。」的空白字体列表——一次逆向问题定位过程实录 | Yesterday17's Blog GSuite 探索篇(1)使用 Service Account 向 Google Drive 传输文件 | Yesterday17's Blog 『サクラノ詩 -櫻の森の上を舞う-』通关感想 | Yesterday17's Blog 《ATRI -My Dear Moments-》通关感想 | Yesterday17's Blog [工具][VSCode 扩展] AegiKit——方便 Aegisub 使用的工具箱 | Yesterday17's Blog 贝塞尔曲线、字体矢量化与曲线运算 | Yesterday17's Blog
[Project Glow/01] 序 启程 | Yesterday17's Blog
Yesterday17 · 2020-06-20 · via Yesterday17's Blog
还没变色,太好了(?)
还没变色,太好了(?)

在之前的文章中,我已经配置了各种各样奇怪的东西。拜它们所赐,虽然现在的网络不是不可以用,但是一旦想要修改就特别麻烦。

因此我制定了这个计划,其目标是用多个部分融合来模拟甚至超越 Surge 的效果。需要实现的功能包括但不限于:

  • 网关级透明代理
  • MITM
  • 高扩展性的请求/返回修改
  • 局域网 DNS 代理接入
  • NAT Type A

运行环境

首先需要声明的一点是,这个计划和路由器是无缘的。为了满足 MITM 的性能要求,本计划的运行环境为本人目前手上的笔记本电脑有且只有这个。

树莓派能不能达到性能要求我也说不准,毕竟我手上没有(笑)

功能解释

下面来简单介绍一下各个部分的功能吧。虽然并不一定会有读者(笑)

网关级透明代理

简单来说,就是使以本机作为网关的其他设备能够实现透明代理。实现这个功能的方法很多,大致可以分为 RedirectTProxyTun/Tap,这个计划也会选择上述三种之一。

MITM

如果想要以非请求者的身份获取/修改 https 请求的明文内容,那么就必须 MiTM 了。MiTM 的原理是自签名,因此需要让使用 MiTM 功能的终端信任自签名的 CA 才行。因此如果是 Android 7 以上的 Android 系统就无缘了。

但是这个功能仍然是必要的,因为除 Android 以外,iOS 等是支持信任用户导入系统级 CA 的。并且 MiTM 能够做到的事情非常多,诸如绕过 Abema 地域限制等等都可以做到。

高扩展性的请求/返回修改

这个功能是基于上面的 MiTM 的。既然能看也就能改,这应该也是必然的吧(笑)

问题就出在这个高扩展性上。目前使用的方案是 MITMProxy,虽然确实挺方便,但遇到需要修改或调试的话,事情就变得麻烦了。在 Project Glow 中,需要找到一种方便的调试手段。

局域网 DNS 代理接入

这个功能对应的是之前那篇讲 SNI Proxy 的文章,但是那篇文章的配置实际上是有一定问题的,不知道大家注意到没有(

首先是 http 的问题。虽然 http 已经解决了,但拜它所赐,现在本机的所有网站都不能搭建在 80 端口了。这是一个非常迫切需要解决的问题。

其次,如果本机需要提供 https 服务(虽然不太常见),在那篇文章的配置下是做不到的。

最后,那篇文章使用了非常 hack 的手段来解决本地 DNS 冲突的问题。通过将所有 INPUT 链中目标端口为 53UDP 请求的目标端口都替换成 5353,我们看似解决了本地 53 端口占用的问题,但事实真的是这样吗?这里就当留给不知道存不存在的读者的思考题好了(笑)

NAT Type A

这个功能对于游戏而言还是挺重要的,需要的都懂,不需要的也用不上,这里就不多赘述了(

基本架构

如上图所示,想要达到上述目标,我们的基本架构就是这样的了。这里为了看起来清楚点用 Packet Tracer 瞎几把画了个图,实际上并不会(悲)

可以看到,这里描绘的是 AP 模式下的工作状态。各设备通过 AP 连接至本机;本机将所有流量转向第一层路由,决定是否需要经过 MITM;经过 MITM 或否的流量再流经第二层路由判断需不需要代理;最后将请求发往对应的服务器。

这个结构对 SNI 代理也有效。SNI 代理相当于监听了 80/443 端口,在它们请求原服务器的同时流量也会被 MITM Judger 处理。

待解决的问题

当然了,饼画得很好也就意味着随之而来的问题也会接连不断。下面就是这个计划面临的一些问题了。

Tun 还是 TProxy

虽然前几个月我从 TProxy 切换到了 clashTun 模式,但是实际上我并没有享受到这个模式的红利,反而增加了维护成本,并且 GitHub 上也有反馈网速问题的 issue[1]

从事实来看,使用 Golang 实现的网络栈必然会比 C 要慢。虽然这是无可奈何的事情,但我是不是可以简化这一步,使得这个流程相对更加内聚呢?

双层的 MiTM JudgerRule-based Proxy

从逻辑分层上来说,MITM JudgerRule-based Proxy 是两层的;但是从实现角度来说,我们又希望这个过程能够合并成一个应用。

其实分成两层的根本目的是希望经过 MITM 的请求还能根据规则选择代理,那么我们能不能单独增加一种规则类型,然后再开一个端口,从这个端口进入的流量都绕过这些规则呢?这样的话我们甚至可以配合防火墙实现某些 IP 段启用/禁用 MITM,保证 Android 系统的正常访问。

这些修改意味着我们需要修改 clash 的实现,不过我找到了这个

如果有空的话我或许会选择把它集成进 clash 里。或者,自己造轮子?(

MiTM 持续服务

在目前的部署下存在非常致命的问题:当需要重新启动 MiTM 部分时,所有的 MiTM 流量都会被中断。我们需要解决这个问题,或是使用 MITMProxy 的热重载,又或是其他方法。

DNS 解析

正确的 DNS 解析是访问现代互联网的前提。而与之对应的,SNI 代理又有修改部分 DNS 解析的需求。我们希望把这两个过程合并,根据请求的 IP 返回对应合适的解析。

例如,我们希望将 192.168.1.0/24 配置成使用 SNI 代理的网段。这样的需求在目前是无法实现的,具体如何实现还需要看之后的研究情况。

目前的一个迫切问题是 clash 在执行一段时间之后就会串 IP,导致证书错乱。这是很严重的问题,需要尽快解决。

整合各部分的配置

刘大爷在实现完这么多功能之后一定也注意到了:很多需求是需要多个功能配合实现的。我估计也正是因为这个原因,刘大爷推出了 Surge 的模块系统。

在这个计划中,我们也需要这样一个整合多个部分的系统。或许是直接的类似系统,又或者是能够方便操作的命令行工具之类的,总之不能纯手动配置各个部分(笑)