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
版本
-
基于 ngx_stream_lua_module 的 SNI 代理 2020-08-31 07:32:25
-
2020-03-09 11:31:28
-
基于 ngx_stream_lua_module 的 SNI 代理 2020-02-10 03:23:31
-
基于 ngx_stream_lua_module 的 SNI 代理 2019-09-27 22:22:53
-
基于 ngx_stream_lua_module 的 SNI 代理 2019-09-27 21:58:21
-
基于 ngx_stream_lua_module 的 SNI 代理 2018-04-03 21:56:06
-
基于 ngx_stream_lua_module 的 SNI 代理 2016-11-22 17:10:46