我正在设置一个服务器集群,使用 NGINX 作为负载均衡器。所有请求都通过 HTTPS 进行,因此负载均衡器使用流(SSL 直通)将请求直接传递到集群。
我需要终端服务器查看客户端 IP 而不是负载均衡器 IP。
我的 nginx.conf
## Misc other config stuff
stream {
map $ssl_preread_server_name $backend_cluster_map {
site.a cluster_1;
site.b cluster_2;
default cluster_1;
}
upstream cluster_1 {
server 10.0.0.202:443;
server 10.0.0.203:443;
}
upstream cluster_2 {
server 10.0.0.204:443;
server 10.0.0.205:443;
}
server {
listen 443;
proxy_pass $backend_cluster_map;
ssl_preread on;
}
}
我尝试更改服务器块以包含proxy_set_header
转发 IP,但这没有通过 nginx 测试,并指出proxy_set_header directive is not allowed here
。
server {
listen 443;
proxy_protocol on;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Fowarded-Proto https;
proxy_set_header X-Fowarded-For $remote_addr;
proxy_set_header X-Fowarded-Host $remote_addr;
proxy_pass $backend_cluster_map;
ssl_preread on;
}
我想这与无法更改 SSL 请求有关。还有其他选择吗?我尝试不在负载均衡器上终止 SSL。
答案1
根据斯特芬·乌尔里希 (Steffen Ullrich) 的说法,我遵循https://www.nginx.com/resources/admin-guide/proxy-protocol/。
在终端服务器上我添加了
server {
listen 443 ssl proxy_protocol;
...
set_real_ip_from 10.0.0.201;
real_ip_header proxy_protocol;
proxy_set_header X-Real-IP $proxy_protocol_addr;
proxy_set_header X-Fowarded-For $proxy_protocol_addr;
...
}
并在负载均衡器上
server {
listen 443;
proxy_protocol on; # Make sure this is enabled
proxy_pass $backend_cluster_map;
...
}
现在应用程序看到的是客户端 IP 地址,而不是具有 SSL 直通的负载均衡器的 IP 地址。