比如代理服务器 A(10.5.140.2,只启动了 5000 端口)上要代理多个不同的后端 B(10.5.140.3:8000)、C(10.5.140.4:9000)、DC(10.5.140.5:9000),因为 BCD 上面的端口对应启动的服务都不是基于 HTTP 的(比如 SSH 这种),因此只能做 TCP 代理,开源的 nginx 配置这种代理是要每做一个转发的配置,就要新监听一个端口,和需求不符合。查了一下阿里的 tengine 是支持在 stream 中配置 server_name 的,也就是 TCP 转发可以根据域名去做,这个也是开源的 nginx 现在不支持的( https://tengine.taobao.org/document/stream_sni.html),但是不知道这个方案行不行。大家有什么好的方法吗?
1
codehz 2021-05-26 16:49:35 +08:00 via Android
( TCP 转发按域名做???我觉得一定是哪里理解有偏差
|
2
kokutou 2021-05-26 16:51:10 +08:00
搭车问, nginx 不支持 http 反向代理和 tcp 反向代理混用并且根据域名转发, 有啥其他的好办法吗.
|
3
zhoudaiyu OP |
4
mm163 2021-05-26 16:57:16 +08:00
找开源改一个,根据不同的协议或特征转到不同的后端。
|
5
XiaoxiaoPu 2021-05-26 16:59:11 +08:00
@zhoudaiyu 这个是转发 TLS/SSL 连接,不是任意 TCP 连接都支持的。
|
6
monsterxx03 2021-05-26 17:01:21 +08:00
如果你的 BCD 确定都是 ssh 的话, 其实可以, 在 ProxyCommand 里用 openssl wrap 一下, 在 tengine 那边根据 sni 做分发. 如果是任意 tcp 协议不行,除非也能用 openssl 包一下. 参考: https://iyzico.engineering/proxy-ssh-using-tls-sni-and-nginx-8a18f93f709
|
7
2kCS5c0b0ITXE5k2 2021-05-26 17:04:29 +08:00
用户识别?
|
8
2kCS5c0b0ITXE5k2 2021-05-26 17:04:52 +08:00
@emeab 看错了. 原来是反向
|
9
CRUD 2021-05-26 17:07:24 +08:00
nginx 的 TCP 反代也可以根据 TLS SNI 将不同 domain 反代到不同 server,不过任意 TCP 没有 TLS 的话也是不行: https://stackoverflow.com/questions/34741571/nginx-tcp-forwarding-based-on-hostname/40135151#40135151
|
10
zhoudaiyu OP @mm163 协议嗅探吗?有点难
@XiaoxiaoPu 不一定都是基于 TLS 的 @monsterxx03 不一定都是 SSH 可能还有 redis mysql @CRUD 那看来支持所有 TCP 的不太可能了 |