技术解析

在 nginx 的同一个端口上运行多个协议
0
2021-05-21 02:40:20
idczone

https://github.com/fffonion/lua-resty-multiplexer

实现了一个端口服务复用的透明代理,可以在同一个端口上运行多个协议。根据每次连接中客户端发起的首个请求检测协议,根据协议或各种条件选择代理的上游。

需要打一个大带宽服务器补丁。由@fcicq在这个讨论中贡献。这个补丁实现了 BSD 的 socket recv()语义。目前官方也有这个 feature 的PR。

欢迎讨论和拍砖: )

说明

  • 理论上只能实现识别连接建立后客户端先发送请求的协议,目前实现了 http, ssh, dns, tls, xmpp。不兼容服务端先发送响应的协议。
  • 如果实现了 ngx.reqsock.peak(),则可以使用 ngx_stream_proxy 来转发流量,这样的话除了首个请求以外同一连接的后续请求将没有额外的性能损失;目前只能在 Lua 层转发。对于peak 的实现也欢迎讨论。

测试 ip
```shell
curl https://104.140.14.46:19999 -H "host:www.google.com" -k
curl 104.140.14.46:19999
ssh 104.140.14.46 -p19999 -v
dig www.google.com +tcp @104.140.14.46 -p19999
```

做这个的目的是想要骗过一些主动探测的机制( https://ensa.fi/active-probing/imc2015.pdf ),但是如果某 IDS 用重放的方法来检测协议的话,所有特征都是一样的。所以这个模块可以让你根据时间来选择不同的行为,比如奇数分钟选择 tls 协议后端,偶数分钟选择 http 协议后端。

顶一下,虽然看不懂。但是感觉很高达上的样子。

有用,其实 nginx 自己能检测到 http 发了到 https 端口,也有提示的,但是没留出 api 可配置而已。

Mark

IDS 重放跟你的做法应该是一样的,是根据首个包进行 per connection 分析的。
没有理由相信重放一次,就标记为该端口以后一直是这个协议了。。。。

peek?

ssh 不是服务端先发消息的吗。。

然后用这个反向代理 ss?

我第一个想到的就是反代。。。A 端口代理 B 端口,这样用户访问的时候完全感受不到 B 端口。

重复的轮子
https://huataihuang.gitbooks.io/cloud-atlas/service/ssh/sslh_multi_service_in_one_port.html

我有一个大胆的想法

mark

Mark

收起你的大胆想法~其实我也有个大胆想法··

不就是这个吗? https://doub.io/ss-jc48/

检测到了会封一段时间,如果是 tls 检测到了证书可能是无期

这个取决于客户端的实现

我也是看到这个之后做的,希望能实现一个更加简单好用的框架

如果能够实现 sni 就好啦

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服