.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的,因此不存在伪造。