.net core 负载均衡取客户端真实IP

一个网关代码(.net core 3.1),部署到负载均衡器有故障,发现获取到的客户端IP都是内网IP了,负载均衡用的是阿里云的SLB 。

记录一下修改过程

在Strup.cs 中的 ConfigureServices 方法中加入如下代码:

services.Configure<ForwardedHeadersOptions>(options =>
{
options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
options.KnownNetworks.Clear();
options.KnownProxies.Clear();
});

然后再在 Configure 方法中 使用这个中间件

   app.UseForwardedHeaders();

然后获取IP就和以前一样了,即:Request.HttpContext.Connection.RemoteIpAddress.MapToIPv4().ToString(); 

 

关于是否能防止伪造这块,测试了一下,不能。

我用postman给我自己的网关发包,加入了 X-Forwarded-For 头字段,并赋值为 testabc,然后网关打印出相关头字段,发现  X-Forwarded-For 成了  testabc ,IP还是正确的客户端IP。

然后为了看一下是如何工作的,我先取消了中间件的使用,然后重新加入  X-Forwarded-For 头字段 ,并赋值为 testabc,发现负载均衡转发过来后, X-Forwarded-For = testabc,客户端真实IP

也就是说,它把用户外部传入的值放在了最头部,为了查看究竟是否能伪造,所以追了一下.net core 的代码,然后发现代码如下:

 

 

由此可见,.net core 是从尾部往前读客户端IP的,因此不存在伪造。

posted @ 2022-02-15 14:29  LoveCoder  阅读(698)  评论(0编辑  收藏  举报