代码之家  ›  专栏  ›  技术社区  ›  Mohammed Noureldin Reedwanul Islam

`反向代理背后的ASP.Net内核未使用X-Forwareded-For`

  •  2
  • Mohammed Noureldin Reedwanul Islam  · 技术社区  · 8 年前

    我正在努力 获取远程IP地址 在我的 MVC控制器(在.Net Docker容器中运行)。考虑到我的ASP.Net核心应用程序 位于NGINX反向代理的后面 (在NGINX Docker容器中运行)。

    众所周知,当反向代理将请求重定向到我的.Net核心应用程序时,它将更改我的请求的源IP(TCP/IP层),因此,我将NGINX配置为添加 X-Forwareded-For 使用原始IP发送到请求。从NGINX容器重定向到.Net容器的请求已被删除 X-Forwareded-For 在标题中:

    enter image description here

    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 帮助我发现了这一点。

    1 回复  |  直到 8 年前
        1
  •  5
  •   Mohammed Noureldin Reedwanul Islam    5 年前

    我从你那里得到的IP RemoteIPAddress IPv4是否表示为IPv6(was::ffff:172.20.10.20,而不是172.20.10.20!)。我只使用了IP的IPv4部分,因此 KnownProxies 就我而言,你错了。我应该在v6表示部分中输入完整的IPv4地址。

    官方文件表明:

    https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/proxy-load-balancer?view=aspnetcore-2.1

    根据评论要求进行更新:

    在我的例子中,代码应该是这样的:

    services.Configure<ForwardedHeadersOptions>(options =>
    {
        options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
        options.RequireHeaderSymmetry = false;
        options.ForwardLimit = null;
        options.KnownProxies.Add(IPAddress.Parse("::ffff:172.20.10.20")); // <<-- Notice the full format of the IP address.
    });
    
    推荐文章