我正在努力
获取远程IP地址
在我的
MVC控制器(在.Net Docker容器中运行)。考虑到我的ASP.Net核心应用程序
位于NGINX反向代理的后面
(在NGINX Docker容器中运行)。
众所周知,当反向代理将请求重定向到我的.Net核心应用程序时,它将更改我的请求的源IP(TCP/IP层),因此,我将NGINX配置为添加
X-Forwareded-For
使用原始IP发送到请求。从NGINX容器重定向到.Net容器的请求已被删除
X-Forwareded-For
在标题中:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, IServiceProvider serviceProvider)
{
// Rewrite the header when being redirected (this is required because we are behind reverse proxy)
var forwardedHeadersOptions = new ForwardedHeadersOptions
{
ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto,
KnownProxies = { IPAddress.Parse("172.20.10.2"), IPAddress.Parse("172.20.10.3"), IPAddress.Parse("172.20.10.4") },
};
forwardedHeadersOptions.KnownNetworks.Add(
new IPNetwork(IPAddress.Parse("172.0.0.0"), 8));
forwardedHeadersOptions.KnownNetworks.Add(
new IPNetwork(IPAddress.Parse("127.0.0.1"), 8));
app.UseForwardedHeaders(forwardedHeadersOptions);
...
然而
HTTPContext.Connection.RemoteIPAddress
仍然返回172.20.10.3(NGINX容器IP,不是真正的远程IP):
logger.LogDebug("Remote IP Address: " + Request.HttpContext.Connection.RemoteIpAddress.ToString());
远程IP地址:172.20.10.3
我在.NETCore中检查了我的头,它已经
X-Forwareded-For
使用正确的原始远程IP地址:
logger.LogDebug("X-Forwareded-For Header Feature: " + HttpContext.Request.Headers["X-Forwarded-For"]);
X-Forwareded-For割台特征:85.XX.4.121
使现代化
我的
Program.cs
public class Program
{
public static void Main(string[] args)
{
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseUrls("http://*:5000")
.UseStartup<Startup>()
.Build();
}
我还试图配置
ForwarededHeadersOptions
通过如下方式配置其服务:
services.Configure<ForwardedHeadersOptions>(options =>
{
options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
//options.KnownNetworks.Add(new IPNetwork(IPAddress.Parse("172.0.0.0"), 8));
options.RequireHeaderSymmetry = false;
options.ForwardLimit = null;
options.KnownProxies.Add(IPAddress.Parse("172.20.10.3"));
//options.KnownNetworks.Add(new IPNetwork(IPAddress.Parse("127.0.0.1"), 8));
});
没有成功。。。
好的,我想我走对了,返回的IP地址是
RemoteIPAddress
was::ffff:172.20.10.20,而不是172.20.10.20!我不知道他们是不同的。这个
official documentation
帮助我发现了这一点。