一个有趣的 nginx module - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
beyondstars
V2EX    宽带症候群

一个有趣的 nginx module

  •  1
     
  •   beyondstars 2024-04-20 10:49:01 +08:00 2376 次点击
    这是一个创建于 577 天前的主题,其中的信息可能已经有所发展或是发生改变。

    目的

    介绍一种利用通过合理配置 nginx 实现的动态 TCP 连接重定向方式。

    在配合 DNS 的情况下,这种功能可以用于解决这些问题:1 )为一些不便显式配置代理的应用程式配置无感的透明代理; 4 )端口复用,但仅限于在 client 支持 TLS 和 SNI extension 的情况下可用。

    概述

    nginx 支持转发 TCP 连接,也就是说它可用监听一个 socket, 当有 client 向这个 socket 发起连接请求时,它向一个配置好的 destination 发起连接,并且在 client 和 destination 之间接力传递数据,充当一个中间人角色。client 虽然直接连接到 nginx 的 socket ,但效果和直连 destination 是一样的。

    例如,下列配置

    stream { server { listen 3399; proxy_pass 1.2.3.4:3389; } } 

    让 nginx 把 *:3399 收到的 TCP 连接转发至 destination 1.2.3.4:3389, 这里 destination 是静态的,硬编码的,写死的。

    现在,我们希望 TCP 转发的 destination 可以动态地决定,例如从报文中嗅探出来,可不可以做到呢?

    在使用了 TLS 的条件下,理论上是可以的,因为我们知道 TLS 协议支持一个叫做 Server Name Indication (SNI) 的 extension ,类型为 ClientHello 的 TLS 握手报文中包含明文的 server name 。

    于是有了 ngx_stream_ssl_preread_module 这个 nginx module:

    stream { ssl_preread on; resolver 114.114.114.114; server { listen 443; proxy_pass $ssl_preread_server_name:443; } } 

    这里的转发工作是在传输层进行的,因此不会出现客户端 ssl 证书报错的情况。

    对于非 tls 的情形,例如 http ,ngx_http_core_module 提供了一个从 HTTP 请求头嗅探出来的 $host 变量来帮助实现应用层的动态目的地重定向。

    其他事项

    省略了 DNS 配置部分,以及 client ,resolver 和转发器 (nginx) 这三个角色完全是解耦的。

    9 条回复    2024-04-22 12:38:01 +08:00
    hvsy
        1
    hvsy  
       2024-04-20 10:56:00 +08:00   1
    感谢分享.这个有时候还是很有用的.
    beyondstars
        2
    beyondstars  
    OP
       2024-04-20 11:06:55 +08:00
    额至于说端口复用,其实还有一个叫做 `$ssl_preread_alpn_protocols` 的变量,应该可以用 `map` directive 来动态确定目的端口号。
    xiaoz
        3
    xiaoz  
       2024-04-20 14:04:28 +08:00 via Android   1
    有个 SNIPROXY 好像就是专门干这个的:https://github.com/dlundquist/sniproxy
    est
        4
    est  
       2024-04-20 14:08:05 +08:00   1
    听说你们很喜欢玩 SNI 反代?

    /t/341913
    deorth
        5
    deorth  
       2024-04-22 08:43:12 +08:00 via Android
    我还以为你写了个 module ,就这
    beyondstars
        6
    beyondstars  
    OP
       2024-04-22 11:12:13 +08:00
    @deorth 我还以为你能回复啥惊世骇俗的名言警句,点进你主页一看全是些没营养的。
    beyondstars
        7
    beyondstars  
    OP
       2024-04-22 11:13:13 +08:00   1
    @est 哦 抱歉 这个之前确实没看到,不过那个贴确实也太久远了。
    beyondstars
        8
    beyondstars  
    OP
       2024-04-22 11:17:25 +08:00
    至于说什么 SNI 反代只是应用之一,个人感觉它有趣的点主要是提供了一种(可能不是新的)思路实现一种动态的连接转发,或许还可以配合其他 nginx module 在这个点做 TLS termination, 实现真正的端口复用(没有尝试过)。
    deorth
        9
    deorth  
       2024-04-22 12:38:01 +08:00 via Android
    @beyondstars 不做饭的人就不能说饭店的饭不好吃了吗
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1608 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 16:25 PVG 00:25 LAX 08:25 JFK 11:25
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86