V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
zhoudaiyu
V2EX  ›  问与答

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

  •  
  •   zhoudaiyu · 2021-05-26 16:36:38 +08:00 · 1063 次点击
    这是一个创建于 1037 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    10 条回复    2021-05-26 20:02:52 +08:00
    codehz
        1
    codehz  
       2021-05-26 16:49:35 +08:00 via Android
    ( TCP 转发按域名做???我觉得一定是哪里理解有偏差
    kokutou
        2
    kokutou  
       2021-05-26 16:51:10 +08:00
    搭车问, nginx 不支持 http 反向代理和 tcp 反向代理混用并且根据域名转发, 有啥其他的好办法吗.
    zhoudaiyu
        3
    zhoudaiyu  
    OP
       2021-05-26 16:56:37 +08:00
    mm163
        4
    mm163  
       2021-05-26 16:57:16 +08:00
    找开源改一个,根据不同的协议或特征转到不同的后端。
    XiaoxiaoPu
        5
    XiaoxiaoPu  
       2021-05-26 16:59:11 +08:00
    @zhoudaiyu 这个是转发 TLS/SSL 连接,不是任意 TCP 连接都支持的。
    monsterxx03
        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
    emeab
        7
    emeab  
       2021-05-26 17:04:29 +08:00
    用户识别?
    emeab
        8
    emeab  
       2021-05-26 17:04:52 +08:00
    @emeab 看错了. 原来是反向
    CRUD
        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
    zhoudaiyu
        10
    zhoudaiyu  
    OP
       2021-05-26 20:02:52 +08:00 via iPhone
    @mm163 协议嗅探吗?有点难
    @XiaoxiaoPu 不一定都是基于 TLS 的
    @monsterxx03 不一定都是 SSH 可能还有 redis mysql
    @CRUD 那看来支持所有 TCP 的不太可能了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5872 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 02:19 · PVG 10:19 · LAX 19:19 · JFK 22:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.