一种利用 DNS 进行协商的、同端口上支持多种协议的实现方式

2018-10-20 14:18:49 +08:00
 noli

前提

预先分配密钥,或者通信双方预先知道对方的证书。

步骤

  1. 客户端 bind 0 绑定一个客户端本地端口
  2. 客户端向服务器上的 DNS 发起预设的域名查询,
1693 次点击
所在节点    奇思妙想
4 条回复
noli
2018-10-20 14:36:05 +08:00
手抖,没写完就发送出去了。。。

步骤

1. 客户端生成一个本地 TokenC

2. 客户端向指定服务器发起符合预设格式的 DNS 查询,用以向服务器申请 TokenS,以及告知 TokenC

3. 服务器通过 DNS 答复,发送 TokenS,经过签名的 TokenC 用以证明自身身份,防止中间人

4. 客户端对 TokenS 签名为 sign(TokenS) ,并向服务器 443 发起 TCP 连接,先行发送 sign(TokenS) 以验证身份

5. 服务器在 443 监听,通过 sign(TokenS) 辨别特殊流量,并作特殊处理。连接完成
noli
2018-10-20 14:40:06 +08:00
在第 4 步,先行发送 sign(TokenS) ,我想表达的意思是,在特殊流量前,插入 sign(TokenS) ,与特殊流量一起发送。
类似于一个 0-RTT 的过程。
ZRS
2018-10-23 05:55:27 +08:00
你都有 preshared key 了还这么麻烦干什么…直接加密发送数据不就行了
noli
2018-10-23 06:44:54 +08:00
@ZRS 即使有 preshared key 也不一定能支持多个用户,在同一时间段内,在同一个端口上,使用不同的 preshared key,进行通信。例如著名的某协议 。

这是为了不暴露协议特征而故意设计成无协商无握手过程。tls 可以协商密钥,但是握手特征非常明显,于是可以有明确的判定方法。

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

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

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

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

© 2021 V2EX