NLog aspnet-request-ip 属性只记录负载均衡器的 IP 地址

Jac*_*ack 3 asp.net asp.net-mvc nlog

我正在使用 NLog 进行日志记录。我需要记录打开网站的用户的 IP 地址。

为此,我使用了aspnet-request-ipNLog的属性。文档在这里:https : //github.com/NLog/NLog/wiki/AspNet-Request-IP-Layout-Renderer

我在 NLog 配置中的布局现在如下所示:

layout='"${longdate:universalTime=true}","${level}",${aspnet-request-ip},"${message}"'
Run Code Online (Sandbox Code Playgroud)

问题是 - 记录的 IP 地址是托管网站的机器的 IP。但我需要打开/请求网站的用户的 IP。我需要登录请求/打开网站的 IP。

我怎样才能做到这一点?或者为什么aspnet-request-ip要记录主机 IP 地址,而不是用户/客户端 IP 地址?

Jul*_*ian 5

如果您使用的是负载均衡器(在本例中如此),则请求 IP 将是负载均衡器的 IP。本质上,您正在收到负载均衡器的请求,因此这是发件人的 IP。

所以我这个案例你需要:

${aspnet-request-ip:CheckForwardedForHeader=true}
Run Code Online (Sandbox Code Playgroud)

这将获得 X-Forwarded-For 标头的 IP,这是负载均衡器发送客户端 IP 的事实标准。请参阅MDN 上的 X-Forwarded-For

X-Forwarded-For (XFF) 标头是事实上的标准标头,用于识别通过 HTTP 代理或负载均衡器连接到 Web 服务器的客户端的原始 IP 地址。当客户端和服务器之间的流量被拦截时,服务器访问日志仅包含代理或负载均衡器的 IP 地址。要查看客户端的原始 IP 地址,使用 X-Forwarded-For 请求头。

注意:不要为无负载平衡的情况启用 CheckForwardedForHeader,因为用户可以通过发送该标头来发送 IP。

查看文档