非凡居

nginx 万能中转代码

stream {
map $ssl_preread_server_name $targetBackend {
yourdomian 127.0.0.1:8443;
default $ssl_preread_server_name:443;
}
server {
listen 443;
proxy_connect_timeout 10s;
proxy_timeout 10s;
resolver 1.1.1.1;
proxy_pass $targetBackend;
ssl_preread on;
}
}

 

我来解释一下,该方法目前仅适用于中转tls的TCP流量。
服务器443端口链接获取到tls请求的sni值(也就是域名),赋值给$ssl_preread_server_name变量,然后又直接通过TCP转发到$ssl_preread_server_name对于的服务器443端口

看实际转发的目的服务器,如果是别的机器,隐藏主机真实ip,隐藏主机ip与域名之间的关系,避免被全网扫描探测。当然还能加一些实际的访问限制规则,减少一部分自动探测的攻击等。

即便是转发到本机,也是有同样的防御作用。看具体的设置策略了。

比较常规的使用场景,使用docker部署不同的服务,服务需要对外的443可以映射到127.0.0.1的其他端口,避免这部分端口的直接对外暴露。然后通过4层转发 对不同域名的数据进行分派。

参考文献:

https://nginx.org/en/docs/stream/ngx_stream_ssl_preread_module.html

https://hostloc.com/thread-826986-2-1.html