簡體   English   中英

反向代理后面的 ASP.Net Core 不使用 `X-Forwareded-For`

[英]`X-Forwareded-For` is not used by ASP.Net Core behind reverse proxy

我試圖在我的ASP.Net Core 2.1 MVC 控制器(在 .Net Docker 容器中運行)中獲取請求的遠程 IP 地址(即發送請求的客戶端的 IP)。 考慮到我的 ASP.Net Core 應用程序位於 NGINX 反向代理之后(在 NGINX Docker 容器中運行)。

眾所周知,當反向代理將請求重定向到我的 .Net Core 應用程序時,它會更改我請求的源 IP(TCP/IP 層),因此,我將 NGINX 配置為將帶有原始 IP 的X-Forwareded-For添加到請求。 從 NGINX 容器重定向到 .Net 容器的請求在標頭中有X-Forwareded-For

在此處輸入圖片說明

當然,我配置了 .Net Core 以了解這一點:

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

我在 .Net Core 中檢查了我的標題,它有X-Forwareded-For和正確的原始遠程 IP 地址:

logger.LogDebug("X-Forwareded-For Header Feature: " + HttpContext.Request.Headers["X-Forwarded-For"]);

X-Forwarded-For 標題功能:85.XX.4.121

有人知道我缺少什么嗎? 為什么 RemoteIPAddress 仍然返回 NGINX docker 容器的 IP 而不是真正的遠程 IP 地址?

更新

我的程序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));
});

沒有成功...

更新 2

好的,我想我走對了, RemoteIPAddress返回的 IP 地址是 ::ffff:172.20.10.20,而不是 172.20.10.20! 我不知道他們是不同的。 官方文檔幫助我發現了這一點。

我從RemoteIPAddress獲得的 IP 是表示為 IPv6 的 IPv4(是 ::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.
});

根據官方文檔,如果您使用Apache 或 Nginx 集成,則應將以下代碼添加到Startup.ConfigureServices方法中。

// using Microsoft.AspNetCore.HttpOverrides;

    services.Configure<ForwardedHeadersOptions>(options =>
    {
        options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | 
            ForwardedHeaders.XForwardedProto;
        // Only loopback proxies are allowed by default.
        // Clear that restriction because forwarders are enabled by explicit 
        // configuration.
        options.KnownNetworks.Clear();
        options.KnownProxies.Clear();
    });

然后最重要的是,在Configure方法中使用

app.UseForwardedHeaders();

進一步假設在 nginx conf 文件中,在一個位置內,使用

proxy_set_header   Host $host;
proxy_set_header   X-Real-IP $remote_addr;
proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header   X-Forwarded-Host $server_name;

現在X-Forwarded-For的第一個條目將是真實的客戶端 IP。

重要提示:如果您想保護應用程序並且不允許攻擊者注入 X-Forwarded-For,請按照此Nginx 處理無效標頭

請參閱轉發 Linux 和非 IIS 反向代理的方案配置 Nginx

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM