关于家宽封 web 可能的原因和对策

2019-12-06 03:23:42 +08:00
 alphatoad

前几天讨论的挺火的,估计全国要推广了,随便写点自己的想法

技术有限,欢迎指正和补充

和墙相反,个人认为这个问题的关键在于让 web 服务无法被探测到。目前国内内部的流量还不至于有加密就阻断。 那么问题就可以转化为以下两点

  1. 隐藏流量,不留下提供 Web 服务的痕迹
  2. 服务不可复现。此处复现指的是在第三方的设备上,没有一定的协商则无法访问服务

第一点不说了,第二点拓展一下。不管怎么 DPI,服务最终是要在审核人员的设备上复现的,否则无论再怎么怀疑没有理由封宽带。要阻止这一过程就会很艰辛了。要实现这一点也可以分成两部分:要么完全不泄露域名,要么即便拿到域名也无法访问服务。

frp 肯定是最简单的方法,但是太无聊了。

HTTP 明文就不说了。

双向证书可以确保不可复现,即便拿到域名也无法访问服务。但非浏览器的支持就比较糟糕了。配合 TLS 1.3 和还在草案的 eSNI 确实可以实现完全不留痕迹。这种情况下使用 DDNS 应当问题不大,因为外界确实看不到是否有使用这个域名进行通讯,拿到也访问不了。

如果不想用双向证书,那就只能把域名藏好。这种情况下用 DNS 风险就很大了,否则发现域名指向家宽,审核人员 doublecheck 发现是通的,完美复现。保险起见还是写个 crontab 脚本自己更新地址吧。

TLS 1.2 握手时的 SNI 和证书都是明文的,肯定是不能用了,分分钟被 DPI。 TLS 1.3 的证书是加密的。 Encrypted SNI 可以防止 SNI 泄露,但现在还是草案,CF 和 FF 的实现并不是普世的,随时都会 drop。不过只编译一份自己用问题不大,等过几年实装普及吧。

确保域名藏好之后就可以套一个 sni proxy 使用域名通信了,发现 sni 不对就扔掉。这也是不直接使用 IP 通讯的原因:运营商可以扫端口,发现有 TLS 应用在监听是可以伪装成客户端建立连接的。

TCP Port Knocking 我个人是持保留态度的,因为要设计一个防 replay attack 的 mechanism 很花时间,如果是基于 TLS 的话还是会遇到上面的问题。

4595 次点击
所在节点    程序员
19 条回复
alphatoad
2019-12-06 03:38:18 +08:00
关于 DNS 也可以这样:A 域名 CNAME 到 B,B 域名 A 记录指向家庭宽带。服务端只允许 A 域名。
不过风险还是在就是了
turi
2019-12-06 08:42:58 +08:00
你们是不是 忘记了,阿里云是会自动扫描服务器的,发现 http 或者 https 没有备案的话 直接 404

这么简单的扫描器你们觉得运营商不会写一个吗 ?
alphatoad
2019-12-06 08:54:04 +08:00
@turi 文中提到了
mrdemonson
2019-12-06 09:12:03 +08:00
最不折腾的就是用 zerotiler
国内云服务上装个 moon
家里路由器装 zerotilerone,开启 nat
这样云服务上直接反代内网 ip,
如果要 p2p 保持速度的,在外网电脑上也加入网络
blackboar
2019-12-06 09:25:25 +08:00
这个事情的本质是为了搞净网,让每一个对外开放的网页服务都能找到具体责任人, 运营商、ISP 也只是为了落实这个政策尽量不违反,这 10 年来甚至包括现在我们都是以常用 web 端口作为主要监控对象,如 80,8080,443,说白了你自己加自定义端口开设 web, 只要你内容不过分,我们及大多数数据中心都不会管,甚至连上级部门也一样,只是按照政策去解决那几个常用端口,能对政策交代就行了。

你上边说的很多,我大致看了下,我觉得就 2 点:

1、你的 WEB 服务如果是面向公众,既然面向公众,那么就都能找出来,没有意义;

2、如果不面向公众,就像你说的”服务不可复现“,那还折腾个啥劲,反正就你自己或者个别几个朋友能访问,你稍微做点加密措施,或者不用 http 协议就能解决问题了。


至于你下边说的 DNS 那个,没看懂是解决什么问题的,和普通 A 记录结果不是完全一样吗
cskeleton
2019-12-06 09:34:09 +08:00
@blackboar #5 并不是这样,你去看看之前那几个很热闹的讨论帖。只要有外部能打开的网页,一律都是断网签保证书。大部分中招的还是路由管理页面、群晖管理页面这类。
alphatoad
2019-12-06 09:42:31 +08:00
@blackboar 因为太多的服务依赖 http 了。我想在应用层上直接跑 http,不想再套一层破坏现有的网络栈。对于麻瓜朋友需要过多的配置不现实。
另外一方面,我想要需要的时候可以对公众服务。比如家里有个 nas,可以直接 share 链接。可能过几个小时就关掉了,我需要这段时间不被 dpi。
DNS 防的是通过记录被找出域名。没什么卵用,只能稍稍加大点难度。
alphatoad
2019-12-06 09:54:43 +08:00
仔细一想确实不用 CNAME 指 A,用 wildcard 就可以了。随便挑一个别人猜不到的子域名 listen
asukaceres
2019-12-06 11:01:53 +08:00
TLS client cert auth
alphatoad
2019-12-06 11:04:12 +08:00
@asukaceres please read
3dwelcome
2019-12-06 13:46:24 +08:00
@alphatoad 监管者是通过 TCP 流量来筛选的,提取 HTTP 特征码。如果你随便选一个没备案的域名,直接就进入黑名单了。
我在想可不可以通过 websocket 把 http 流量都给加密一下。
alphatoad
2019-12-06 14:08:07 +08:00
@3dwelcome 你说的是 alpn ?
Leonard
2019-12-06 14:36:46 +08:00
@cskeleton 这种搭 VPN 不行吗
nnnToTnnn
2019-12-06 15:15:00 +08:00
@3dwelcome
@Leonard
@alphatoad
@turi

首先站在开发者的角度上来说。很大可能是通过爬虫来访问用户的 IP,如果发现有响应则停止。

使用端口敲门似乎可以解决这个问题

https://zeroflux.org/projects/knock
alphatoad
2019-12-06 23:18:32 +08:00
@nnnToTnnn 端口敲门我也写了,列举了质疑
baobao1270
2019-12-07 18:18:26 +08:00
可以尝试 HTTP over SSH ?
或者自己实现一套 TLS (笑)
alphatoad
2019-12-07 18:28:01 +08:00
@baobao1270 我确实实现过,但这个问题不是某个实现能解决的
niming007zh
2019-12-07 21:03:52 +08:00
如果你说运营商还没事对你进行各种主动探测扫描的话,是不可能实现公共 web 服务的,esni 只能防流量分析,对主动探测也没用啊
alphatoad
2019-12-09 01:31:13 +08:00
@niming007zh 我都写了啊……

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

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

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

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

© 2021 V2EX