lua-resty-sniproxy

基于 ngx_stream_lua_module 的 SNI 代理

$ opm get fffonion/lua-resty-sniproxy

名称

lua-resty-sniproxy - 基于 ngx_lua cosocket API 的 SNI 代理

描述

该库是用 Lua 编写的 SNI 代理。TLS 解析部分改写自 dlundquist/sniproxy

请注意,需要 nginx stream 模块ngx_stream_lua_module

已在 Openresty >= 1.9.15.1 上测试。

状态

实验性。

概要

    stream {
        init_by_lua_block {
            local sni = require("resty.sniproxy")
            sni.rules = { 
                {"www.google.com", "www.google.com", 443},
                {"www.facebook.com", "9.8.7.6", 443},
                {"api.twitter.com", "1.2.3.4"},
                {".+.twitter.com", nil, 443},
                -- to activate this rule, you must use Lua land proxying
                -- {"some.service.svc", "unix:/var/run/nginx-proxy-proto.sock", nil, sni.SNI_PROXY_PROTOCOL_UPSTREAM},
                -- {"some2.service.svc", "unix:/var/run/nginx-proxy-proto.sock", nil,
                --                            sni.SNI_PROXY_PROTOCOL_UPSTREAM + sni.SNI_PROXY_PROTOCOL},
                {".", "unix:/var/run/nginx-default.sock"}
            }   
        }
    
        # for OpenResty >= 1.13.6.1, native Nginx proxying
        lua_add_variable $sniproxy_upstream;
        server {
                error_log /var/log/nginx/sniproxy-error.log error;
                listen 443;
    
                resolver 8.8.8.8;
    
                prepread_by_lua_block {
                        local sni = require("resty.sniproxy")
                        local sp = sni:new()
                        sp:preread_by()
                }
                proxy_pass $sniproxy_upstream;
        }
    
        # for OpenResty < 1.13.6.1 or `flags` are configured, Lua land proxying
        server {
                error_log /var/log/nginx/sniproxy-error.log error;
                listen 443;
    
                resolver 8.8.8.8;
    
                content_by_lua_block {
                        local sni = require("resty.sniproxy")
                        local sp = sni:new()
                        sp:content_by()
                }
        }
    }

应该在 init_worker_by_lua_block 指令中定义一个 Lua 数组表 sni_rules

第一个值可以是完整的主机名或正则表达式。使用 . 表示默认主机名。如果未匹配任何条目,则连接将被关闭。

第二个和第三个值是目标主机名和端口。主机可以是 DNS 名称、IP 地址或 UNIX 域套接字路径。如果主机未定义或设置为 nil,则将使用 SNI 中的 server_name。如果端口未定义或设置为 nil,则将使用 443

第四个值是要使用的标志。

        sni.SNI_PROXY_PROTOCOL -- use client address received from proxy protocol to send to upstream
        sni.SNI_PROXY_PROTOCOL_UPSTREAM -- send proxy protocol v1 handshake to upstream

要使用标志,服务器必须配置为执行 Lua land 代理(请参见上面的示例)。

规则将按照其在表中出现的顺序优先应用。在上面的示例中,api.twitter.com 将匹配第三条规则 api.twitter.com,而不是第四条规则 .+.twitter.com

如果协议版本低于 TLSv1(例如 SSLv3、SSLv2),则连接将被关闭,因为这些版本不支持 SNI 扩展。

待办事项

  • 压力和性能测试

版权和许可

本模块根据 BSD 许可证授权。

版权所有 (C) 2016,作者 fffonion <fffonion@gmail.com>。

保留所有权利。

在满足以下条件的情况下,允许以源代码和二进制形式重新分发和使用,无论是否修改:

  • 源代码的重新分发必须保留上述版权声明、此条件列表和以下免责声明。

  • 二进制形式的重新分发必须在随分发提供的文档和/或其他材料中复制上述版权声明、此条件列表和以下免责声明。

本软件由版权持有人和贡献者“按原样”提供,并且不提供任何明示或暗示的保证,包括但不限于适销性和特定用途适用性的暗示保证。在任何情况下,版权持有人或贡献者均不对任何直接、间接、附带、特殊、惩戒性或后果性损害(包括但不限于替代商品或服务的采购;使用、数据或利润损失;或业务中断)负责,无论这些损害是如何引起的以及基于何种责任理论,无论是基于合同、严格责任还是侵权行为(包括疏忽或其他原因),即使已告知存在此类损害的可能性。

另请参阅

  • ngx_stream_lua_module:https://github.com/openresty/stream-lua-nginx-module

  • [dlundquist/sniproxy] (https://github.com/dlundquist/sniproxy)

  • [ngx_stream_ssl_preread_module] (https://nginx.ac.cn/en/docs/stream/ngx_stream_ssl_preread_module.html) 自 Nginx 1.11.5 起可用,作为本模块的替代方案。

作者

fffonion

许可证

3bsd

依赖项

luajit

版本