TCP 反向代理只能监听一个端口,但是想做多个 TCP 代理怎么破?

2021-05-26 16:36:38 +08:00
 zhoudaiyu

比如代理服务器 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),但是不知道这个方案行不行。大家有什么好的方法吗?

1278 次点击
所在节点    问与答
10 条回复
codehz
2021-05-26 16:49:35 +08:00
( TCP 转发按域名做???我觉得一定是哪里理解有偏差
kokutou
2021-05-26 16:51:10 +08:00
搭车问, nginx 不支持 http 反向代理和 tcp 反向代理混用并且根据域名转发, 有啥其他的好办法吗.
zhoudaiyu
2021-05-26 16:56:37 +08:00
mm163
2021-05-26 16:57:16 +08:00
找开源改一个,根据不同的协议或特征转到不同的后端。
XiaoxiaoPu
2021-05-26 16:59:11 +08:00
@zhoudaiyu 这个是转发 TLS/SSL 连接,不是任意 TCP 连接都支持的。
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
2kCS5c0b0ITXE5k2
2021-05-26 17:04:29 +08:00
用户识别?
2kCS5c0b0ITXE5k2
2021-05-26 17:04:52 +08:00
@emeab 看错了. 原来是反向
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
zhoudaiyu
2021-05-26 20:02:52 +08:00
@mm163 协议嗅探吗?有点难
@XiaoxiaoPu 不一定都是基于 TLS 的
@monsterxx03 不一定都是 SSH 可能还有 redis mysql
@CRUD 那看来支持所有 TCP 的不太可能了

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

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

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

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

© 2021 V2EX