再谈家庭宽带架设 HTTPS 防嗅探。

2020-05-08 17:13:43 +08:00
 binkcn

先说目标:

      我的目标是在公网任意位置(公司、移动网络、手机 APP 等)通过 HTTPS 协议可以访问到位于家中 NAS 上提供的 HTTPS 协议服务,譬如 Seafile (实际上 Seafile PC 客户端和手机客户端在 auth 认证阶段也是走 HTTPS 协议的),但是又不会被探测到,或者说即便探测到了,也无法在第三方进行复现,从而避开监管不给 G0v 添麻烦。

目前的已有方案:

     由于 `HTTPS` 协议中客户端发送的 `SNI`  会泄漏 `server_name`,可能会被 ISP 嗅探到,然后 `ESNI `也迟迟没有实装,再者即便实装了,大量客户端(譬如手机 App 、浏览器等)在没有得到 `DoH` 等安全 `DNS` 支持的情况下,大概率还是会直接发送 `server_name` 从而导致域名被泄漏,所以等 tls v1.3 esni 不现实。

     然后我在测试机上部署且体验了 SNIProxy,也不是绝对满足需求,毕竟这玩意儿只能防止直连端口证书泄漏域名,但是正常访问握手时 client hello 发送 server_name 的问题还是没有解决。

     至于 Frp 、SSH 、VPN 隧道等方案也不完美,不具备 **从任意设备,任意公网访问** 这个先决条件。

我的想法:

     想了一个折中办法,实现上比较麻烦,也有一些小瑕疵,先抛砖引玉聊一聊?也或者如果有现成的类似的玩意儿也可以直接发给我玩玩?

     首先,我们需要一个中间服务器,负责在上面跑一些自己写的脚本,但是这个服务器只作为一个类似前期握手的存在,并不参与具体的流量转发。所以一般来说服务器用最便宜的 VPS 即可,要求具有 IPv4 公网 IP 和低延迟+稳定,对硬件性能无要求。

    然后,家里的 NAS 也需要进行一些调整,同样跑一个脚本执行一些额外操作。

    最后,具体的实现是这样:
  1. 正常解析域名 seafile.yourdomain.com 的 A 记录到 VPS 上,客户端正常请求 https://seafile.yourdomain.com
  2. VPS 上的脚本监听且收到请求后,先挂起请求,然后通过任意加密方式(比如加密的 SSH 隧道)连接家中的 NAS,并且将本次请求中的客户端公网 IP 发送到 NAS 的脚本上
  3. NAS 的脚本接收到这个公网 IP 后通过 iptables 操作防火墙允许这个 IP 从公网访问 NAS 的 https 服务,并且标记这个 ip,设定一个定时器在 N 秒后移除这条白名单规则,这个参数 N 可配置,一般默认 30-60 秒这样。
  4. NAS 通知 VPS 已设置好白名单,以及过期时间 N,VPS 上标记该域名白名单状态和过期时间。这样在过期时间内该域名的后续请求不再挂起而是直接放行,参见下一步操作。
  5. VPS 不再挂起 https 请求,返回 302 状态,重定向该请求到另外一个域名 seafile.fakedomain.com 。这个新的域名是直接解析到家庭宽带的公网 IP 的。
  6. 客户端收到 302 状态后跟随跳转重新请求到 seafile.fakedomain.com (即 NAS )上,由于白名单的存在,通讯正常处理。
  7. 安全起见,NAS 上仍然部署 sniproxy,丢弃非 seafile.fakedomain.com 的访问,防止直接端口探测。

这样一套组合拳打下来,优缺点分别如下:

优点:

  1. seafile 等自建云盘的文件传输是直接 客户端<-->NAS,无需第三方中转,家庭宽带的带宽上限下限可以发挥到极限。
  2. 即便 ISP 采用 TCP 包拦截抓到 client hello 中的 server_name(seafile.fakedomain.com) 也无法直接访问,因为第三方请求 IP 不在 NAS 的白名单中
  3. 理论上客户端无需进行特殊配置即可支持。(浏览器默认支持 301 302 跟随跳转,其他客户端就看代码本身了)

缺点:

  1. 仍然需要一台中间服务器,当然了,最最便宜的 10 刀一年的垃圾 vps 就行了。
  2. 需要客户端支持 http 301 302 跟随跳转,如果客户端的 http request 是自己写的,只接受 http code 200,其他默认 return error 的话,我这个方案就嗝儿屁。当然了,正常的网页浏览器都是支持的,怕就怕第三方手机 app 这种。譬如 seafile 的手机端认证时是采用 https 的,是否会跟随跳转我暂时没有测试。
  3. 如果 nas 是跑云盘的话,大流量大带宽的使用仍然会被运营商发现,这个真的没有办法……

总结:

所以,如果你只是要访问家中的网页 https 服务,流量不那么大的那种,又不想被运营商扫到你的端口进行各种探测抓包的话,我这个方案似乎可行?

11694 次点击
所在节点    宽带症候群
84 条回复
markmx
2020-05-09 10:10:57 +08:00
ipv6 不是可以互通吗。目前我是这样搞得。
brMu
2020-05-09 10:32:48 +08:00
总结楼主的核心:自动添加和移除白名单,即使 sni 被监听到,也无法访问 NAS 。

方案我觉得是可行的,就是不知道效率怎么样,另外定制化太多,不知道有没有人愿意开发。

再就是即使他无法主动探测出 https 网页,但是仍然能知道你是在进行 https 通信,如果仅凭这点就判你是滥用(不需要截图证据),那就没折了。

所以我觉得最稳妥的方案还是无特征连到家里再操作,手机也就多 2-3 下而已。
NeoChen
2020-05-09 10:39:56 +08:00
在家建个$$server,通过$$代理来访问内网资源,甚至...出国的时候还能作为国内代理用,这个会有什么问题么?
ghostwwg
2020-05-09 11:11:11 +08:00
需求:公网任意位置访问自家的 homelabs
方案: 起个 vpn 服务
优点:能实现外网链接服务后任意访问内网资源
缺点:如果你是不固定设备,那需要额外配置

那么问题来了: 通常你外网访问 homelabs 是固定设备么?
AoTmmy
2020-05-09 11:16:02 +08:00
用 frp 的话进行访问的客户端不需要任何设置啊,为什么你说客户端还要设置,难不成是 nas 设置? frp 设置多简单,你这太复杂了
smallfount
2020-05-09 11:19:30 +08:00
所以搞那么复杂干嘛。。。直接 FRP 吧。。这样就不用管你宽带上用啥反正都是内网访问外部流量了。。
brMu
2020-05-09 12:22:09 +08:00
@NeoChen 好方法,kill two birds with one tone.
hymzhek
2020-05-09 14:18:03 +08:00
KyonLi
2020-05-09 14:32:43 +08:00
如果必须当着你的面复现才能定罪那这个思路没问题,可是这样的话收到传唤出门前网线一拔不就行了
lifanxi
2020-05-09 19:29:08 +08:00
挺好的方法,局限性就是需要客户端支持 302 跳转。
我现在的出国服务器上就用了类似的端口敲门的方法,理论上可以规避一些扫描。
lifanxi
2020-05-09 19:30:08 +08:00
@hymzhek 不用 VPS 做不到无感敲门。
gy6221
2020-05-09 19:59:10 +08:00
这思路确实不错。。。
不知道群晖那一票 app 是否支持 302
leafleave
2020-05-09 20:24:50 +08:00
你这就是 port knock,只不过是敲邻居家的门,然后让邻居通知你家的服务器
jiangyang123
2020-05-09 21:23:21 +08:00
@smallfount #25 frp 的缺点是流量只能中转,如果要 p2p 的话,客户端还得装个 frpc

lz 的办法理论上是能直连的
LnTrx
2020-05-09 21:40:14 +08:00
@binkcn 静态页面随便挂在哪里都行
andynet
2020-05-10 09:12:01 +08:00
我的做法是家里的宽带和 VPS GRE
VPS 上 nginx proxy 内网的 IP
如果是跑其他应用的话就在 VPS 上用 iptables nat 到内网的端口上

写个脚本放在服务器上探测,一但 GRE 断了的话自动重取 DDNS 的 IP 地址重新建立 GRE 隧道
一般 VPS 是固定 IP,家里的服务器只需要确保到 VPS 端的 GRE 地址是 ping 的通的就可以。

缺点是 GRE 1.只适用于 IPv4 2.GRE 是透明的。如果需要增强安全性的话可以考虑在 GRE 后套 IPsec,如果只跑跑应用也就无所谓了。
优点是 Linux 的 IP 套件原生支持,部署成本比较小,几行命令就搞定了,也不需要写配置文件。

不知道我说清楚没,欢迎大家指正补充。
JoeoooLAI
2020-05-11 09:54:10 +08:00
未来估计都是搭隧道或者 frp 之类的中转才有机会。 那个某花生壳可能要再次流行了
binkcn
2020-05-11 10:52:20 +08:00
@brMu 程序我已经在写了。

至于抓到 https 通信就判定滥用的话,我觉得可能性不大吧,我先做个小白鼠试试看。
binkcn
2020-05-11 10:54:34 +08:00
@ghostwwg 非固定设备,其实我折腾这些主要是家里 nas 上现在在循环录制宝宝的监控视频,然后我又希望我的家人父母可以异地通过手机、PC 等方式随时查看监控或者视频回放。

所以开篇就直接 pass 掉了 frp vpn $$ 等手段。
binkcn
2020-05-11 11:06:55 +08:00
@lifanxi 等了 30 楼了,可算有一个看明白我的诉求和想法的了。

我刚刚测试过了,Seafile 客户端在进行 https 登录认证的时候是支持 302 跳转跟随的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/669709

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX