这是我们在阿里云负载均衡之前部署前置 nginx 时遇到了一个的问题,用的是传统型负载均衡 CLB
ASP.NET Core 版本是 9.0.6,启用了 ASPNETCORE_FORWARDEDHEADERS_ENABLED
环境变量,会自动使用 ForwardedHeadersMiddleware 处理 X-Forwarded-Proto
,应用中直接通过 HttpContext.Connection.RemoteIpAddress
就有直接获取到客户端的真实 IP
假设客户端 IP 地址是 192.168.0.1
,前置 nginx 的 IP 地址是 172.16.0.1
,阿里云负载均衡 CLB 的 IP 地址时 10.0.0.1
,请求流程是这样的:
192.168.0.1(client) -> 172.16.0.1(nginx) -> 10.0.0.1(CLB) -> asp.net core
在不使用 ForwardedHeadersMiddleware 的情况下,阿里云负载均衡转发过来的原始 X-Forwarded-For 请求头是这样的(注:括号中是另外添加的备注)
X-Forwarded-For: 192.168.0.1(client), 172.16.0.1(nginx)
这时 asp.net core 应用中通过 HttpContext.Connection.RemoteIpAddress
读取到的值是阿里云负载均衡的 IP 地址 10.0.0.1
,是阿里云负载均衡的 IP,不是我们期望的,所有要通过 ForwardedHeadersMiddleware 解决这个问题
启用 ForwardedHeadersMiddleware 后,被它改写后的 X-Forwarded-For 变成了
X-Forwarded-For: 192.168.0.1(client)
HttpContext.Connection.RemoteIpAddress
读取到的值是 172.16.0.1(nginx)
,是前置 nginx 的 IP,不是客户端 IP 192.168.0.1
,也不是我们期望的
请求如何解决这个问题?
try try ForwardLimit +1 ?
+1 就搞定了
builder.Services.Configure<ForwardedHeadersOptions>(options =>
{
options.ForwardLimit = 2;
});
如果不放前置 nginx,需要将 ForwardLimit 改为默认值 1,不然会带来其他问题