Nginx的4层分流

Trojan不能通过7层分流转发,因此不能通过虚拟主机的方法通过Nginx分流

但是,可以通过SNI转发,使得Nginx处理不同的流量。

最新版的lnmp集成了ngx_stream_ssl_preread_module,因此基本上一键安装就包含了Stream模块,典型的配置文件如下:

stream {
# 这里就是 SNI 识别,将域名映射成一个配置名
map $ssl_preread_server_name $backend_name {
site.A web; 
site.B proxy_trojan;
# 域名都不匹配情况下的默认值
default web;
}

# web,配置转发详情
upstream web {
server 127.0.0.1:44330;
}

# trojan,配置转发详情
upstream trojan-go {
server 127.0.0.1:44333;
}
#Proxy 中间层,先转发到中间层在下方由Nginx继续做处理以便交付给trojan前卸载流量的proxy protocol (因为trojan不支持proxy protocol特性)
upstream proxy_trojan {
server 127.0.0.1:44334;
}
# 监听 443 并开启 ssl_preread 
# proxy_protocol用于解决真实IP获取问题,后端服务也必须同时在 listen 规则里面配置接受
server {
listen 443 reuseport;
listen [::]:443 reuseport;
proxy_pass $backend_name;
proxy_protocol on; 
ssl_preread on;
}

# 这里的 server 就是用来帮 Trojan 卸载proxy_protocol协议的中间层处理场所
# 原来的 upstream trojan-go 配置不需要改动
server {
listen 44334 proxy_protocol;
proxy_pass trojan-go;
}
}

Stream块在http块之前

此后,由于多次转发了,blog没有办法获得访问者的真实IP,虽然我们在上述配置中提到了这一问题,

但是,在Server块还要添加一下:

………………
listen 44330  ssl proxy_protocol;
#Real IP 
set_real_ip_from 127.0.0.1;
real_ip_header proxy_protocol;
………………

这样博客就可以获得访问者的真实IP了。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注