首页 新闻 会员 周边 捐助

前置 nginx + 阿里云负载均衡 + ASP.NET Core 获取客户端真实 IP 地址的问题

0
悬赏园豆:100 [已解决问题] 解决于 2025-06-13 16:03

这是我们在阿里云负载均衡之前部署前置 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,也不是我们期望的

请求如何解决这个问题?

dudu的主页 dudu | 高人七级 | 园豆:24874
提问于:2025-06-13 15:10
< >
分享
最佳答案
1

try try ForwardLimit +1 ?

收获园豆:100
czd890 | 专家六级 |园豆:14650 | 2025-06-13 15:37

+1 就搞定了

builder.Services.Configure<ForwardedHeadersOptions>(options =>
{
    options.ForwardLimit = 2;
});
dudu | 园豆:24874 (高人七级) | 2025-06-13 16:03

如果不放前置 nginx,需要将 ForwardLimit 改为默认值 1,不然会带来其他问题

dudu | 园豆:24874 (高人七级) | 2025-06-13 16:17
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册