前几天讨论的挺火的,估计全国要推广了,随便写点自己的想法
技术有限,欢迎指正和补充
和墙相反,个人认为这个问题的关键在于让 web 服务无法被探测到。目前国内内部的流量还不至于有加密就阻断。 那么问题就可以转化为以下两点
第一点不说了,第二点拓展一下。不管怎么 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 的话还是会遇到上面的问题。
1
alphatoad OP 关于 DNS 也可以这样:A 域名 CNAME 到 B,B 域名 A 记录指向家庭宽带。服务端只允许 A 域名。
不过风险还是在就是了 |
2
turi 2019-12-06 08:42:58 +08:00
你们是不是 忘记了,阿里云是会自动扫描服务器的,发现 http 或者 https 没有备案的话 直接 404
这么简单的扫描器你们觉得运营商不会写一个吗 ? |
4
mrdemonson 2019-12-06 09:12:03 +08:00 via Android
最不折腾的就是用 zerotiler
国内云服务上装个 moon 家里路由器装 zerotilerone,开启 nat 这样云服务上直接反代内网 ip, 如果要 p2p 保持速度的,在外网电脑上也加入网络 |
5
blackboar 2019-12-06 09:25:25 +08:00 2
这个事情的本质是为了搞净网,让每一个对外开放的网页服务都能找到具体责任人, 运营商、ISP 也只是为了落实这个政策尽量不违反,这 10 年来甚至包括现在我们都是以常用 web 端口作为主要监控对象,如 80,8080,443,说白了你自己加自定义端口开设 web, 只要你内容不过分,我们及大多数数据中心都不会管,甚至连上级部门也一样,只是按照政策去解决那几个常用端口,能对政策交代就行了。
你上边说的很多,我大致看了下,我觉得就 2 点: 1、你的 WEB 服务如果是面向公众,既然面向公众,那么就都能找出来,没有意义; 2、如果不面向公众,就像你说的”服务不可复现“,那还折腾个啥劲,反正就你自己或者个别几个朋友能访问,你稍微做点加密措施,或者不用 http 协议就能解决问题了。 至于你下边说的 DNS 那个,没看懂是解决什么问题的,和普通 A 记录结果不是完全一样吗 |
6
cskeleton 2019-12-06 09:34:09 +08:00
@blackboar #5 并不是这样,你去看看之前那几个很热闹的讨论帖。只要有外部能打开的网页,一律都是断网签保证书。大部分中招的还是路由管理页面、群晖管理页面这类。
|
7
alphatoad OP @blackboar 因为太多的服务依赖 http 了。我想在应用层上直接跑 http,不想再套一层破坏现有的网络栈。对于麻瓜朋友需要过多的配置不现实。
另外一方面,我想要需要的时候可以对公众服务。比如家里有个 nas,可以直接 share 链接。可能过几个小时就关掉了,我需要这段时间不被 dpi。 DNS 防的是通过记录被找出域名。没什么卵用,只能稍稍加大点难度。 |
8
alphatoad OP 仔细一想确实不用 CNAME 指 A,用 wildcard 就可以了。随便挑一个别人猜不到的子域名 listen
|
9
asukaceres 2019-12-06 11:01:53 +08:00
TLS client cert auth
|
10
alphatoad OP @asukaceres please read
|
11
3dwelcome 2019-12-06 13:46:24 +08:00
@alphatoad 监管者是通过 TCP 流量来筛选的,提取 HTTP 特征码。如果你随便选一个没备案的域名,直接就进入黑名单了。
我在想可不可以通过 websocket 把 http 流量都给加密一下。 |
14
nnnToTnnn 2019-12-06 15:15:00 +08:00
@3dwelcome
@Leonard @alphatoad @turi 首先站在开发者的角度上来说。很大可能是通过爬虫来访问用户的 IP,如果发现有响应则停止。 使用端口敲门似乎可以解决这个问题 https://zeroflux.org/projects/knock |
16
baobao1270 2019-12-07 18:18:26 +08:00
可以尝试 HTTP over SSH ?
或者自己实现一套 TLS (笑) |
17
alphatoad OP @baobao1270 我确实实现过,但这个问题不是某个实现能解决的
|
18
niming007zh 2019-12-07 21:03:52 +08:00
如果你说运营商还没事对你进行各种主动探测扫描的话,是不可能实现公共 web 服务的,esni 只能防流量分析,对主动探测也没用啊
|
19
alphatoad OP @niming007zh 我都写了啊……
|