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