在WEBAPI当中尝试解析反代理后的真实IP

weiai 发布于 2025-09-24 506 次阅读


AI智能摘要
在Web API中处理反代理后获取真实IP时,需修改Program.cs代码。首先,配置ForwardedHeadersOptions:设置ForwardedHeaders为XForwardedFor和XForwardedProto,ForwardLimit为null,清除KnownNetworks和KnownProxies后,添加IPNetwork("0.0.0.0", 0)和IPNetwork("::", 0)以信任所有IPv4/IPv6网段。其次,调用app.UseForwardedHeaders(),并确保其位于中间件链前端。原理是反向代理(如本机→Cloudflare→Nginx→服务端)将客户端IP写入X-Forwarded-For头(如"203.0.113.10, 198.51.100.7, 172.70.46.254"中首个IP为真实地址),该配置使UseForwardedHeaders能正确解析并存入ConnectionInfo.RemoteIpAddress,避免仅获取127.0.0.1的问题。
— 此摘要由AI分析文章内容生成,仅供参考。

直接给答案把:需要修改Program中代码,

1、增加如下配置

            // 配置转发头:不限制层数,但只信任你的代理来源(请根据实际网段/IP填写)
builder.Services.Configure<ForwardedHeadersOptions>(options =>
{
   options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
   options.ForwardLimit = null; // 不限制代理层数
   options.KnownNetworks.Clear();
   options.KnownProxies.Clear();
   options.KnownNetworks.Add(new Microsoft.AspNetCore.HttpOverrides.IPNetwork(IPAddress.Parse("0.0.0.0"), 0)); // 全部 IPv4
   options.KnownNetworks.Add(new Microsoft.AspNetCore.HttpOverrides.IPNetwork(IPAddress.Parse("::"), 0));      // 全部 IPv6
});

2、增加UseForwardedHeaders调用

// 注意顺序:先处理转发头,后续中间件才能拿到真实 IP 和协议
app.UseForwardedHeaders();

3、大体样式,红框为本次新增代码:

4、尝试解释下原理

我在其他方法中尝试使用了ConnectionInfo.RemoteIpAddress,这是一个用于获取客户端IP的属性。但是在随后的测试中,我发现只能获取到127.0.0.1 。这很奇怪。因为我并不是通过回环地址访问的。我大概的访问路径如下:

本机→cloudflare→nginx(反代127.0.0.1)→服务端

那么我开始搜寻资料,找到了一个说明:“反向代理会把请求IP写入到X-Forwarded-For当中”当有多个时会出现以下这种情况

X-Forwarded-For: 203.0.113.10, 198.51.100.7, 172.70.46.254

此时203.0.113.10才是真实的ip地址,而UseForwardedHeaders会根据上方通过builder.Services.Configure添加的配置文件来处理X-Forwarded-For头,并将解析后的真实IP存放在ConnectionInfo.RemoteIpAddress中。

那么,就此言毕,拜~

USDT图标 若您喜欢这篇内容,欢迎用TRC-USDT支持创作者

TN3pU88pu1bkUgpyBuJCG1riZecFFkpe8E

请选择TRC20协议转账,感谢您的支持 ❤️

扫描二维码转账

TRC-USDT地址二维码