Я пытаюсь получить удаленный IP-адрес запроса (т. Е. IP-адрес клиента, отправившего запрос) в моем ASP.Net Core 2.1 MVC Controller (работает в .Net Docker контейнере).Учитывая, что приложение My ASP.Net Core находится за обратным прокси-сервером NGINX (работает в контейнере NGINX Docker).
Как известно, когда обратный прокси-сервер перенаправляет запрос в мой .NetБазовое приложение, оно изменит исходный IP моего запроса (уровень TCP / IP), поэтому я настроил NGINX для добавления X-Forwareded-For
с исходным IP к запросу.Запрос, который перенаправляется из контейнера NGINX в контейнер .Net, имеет X-Forwareded-For
в заголовке:
![enter image description here](https://i.stack.imgur.com/FaGsH.png)
И, конечно, я настроил .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 (IP-адрес контейнера NGINX, а не реальный удаленный 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-Функция заголовка Forwareded-For: 85.XX.4.121
Кто-нибудь знает, что мне не хватает?Почему RemoteIPAddress по-прежнему возвращает IP-адрес док-контейнера NGINX вместо реального удаленного 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
ОК Я думаю, я на правильном пути, IP-адрес, возвращаемый RemoteIPAddress
, был :: ffff: 172.20.10.20, а не 172.20.10.20!Я не знал, что они разные.Официальная документация помогла мне обнаружить это.