这是我之前关于捕捉X-Forwarded-For 跨多个代理的 IP 地址。现在,我希望在应用程序(Shibboleth 的 IdP)日志中捕获客户端的 IP。
以下内容:
Client > Load Balancer > Apache httpd server > Tomcat server (running Shibboleth's IdP)
我可以使用server.xmlClientIP
在 Web 服务器的日志中捕获负载均衡器上客户端 IP 的变量:LogFormat "%{ClientIP}i ... " and similarly in Tomcat's access logs using these in
<Valve className="org.apache.catalina.valves.RemoteIpValve"
remoteIpHeader="ClientIP"
protocolHeaderHttpsValue="https" />
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs"
prefix="localhost_access_log."
suffix=".txt"
pattern="%{ClientIP}i %h %l %u %t %r %>s %b %{Referer}i %{User-Agent}i" resolveHosts="false"/>
现在,我希望在 Shibboleth 的 IdP 审计日志中捕获此 IP。这次讨论讨论了如何使用mod_rpaf
Apache,但没有详细介绍。我希望无需安装其他模块即可完成。
看起来我这里漏掉了几个(小的?)部分。有什么想法吗?非常感谢!
答案1
在研究了 LogBack 的关于记录客户端 IP 的文档和MDCInsertingServletFilter servlet 的对应代码,事实证明您必须使用X-Forwarder-For
标题。
我们在负载均衡器中用 替换,将 更新ClientIP
为日志,然后更新 Shibboleth 的文件,如下所示,以用于审计日志:X-Forwarder-For
httpd.conf
LogFormat
X-Forwarder-For
logging.xml
<appender name="IDP_AUDIT" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>/app/shibboleth-idp/logs/idp-audit.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>/app/shibboleth-idp/logs/idp-audit-%d{yyyy-MM-dd}.log</FileNamePattern>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<charset>UTF-8</charset>
<Pattern>%msg|%X{req.xForwardedFor}|%n</Pattern>
</encoder>
</appender>
我们对 idp 进程也做了类似的修改,并且没有必须更新 Tomcat 的日志记录。
希望这对其他人有帮助。
编辑1:Tomcat 日志
事实证明,过了一段时间,X-Forwarded-For
IP 地址不再出现在 Shib 的 IdP 日志中。我们最终RemoteIpValve
在 tomcat 中添加并重新启动。看来它毕竟是必要的:
<Valve className="org.apache.catalina.valves.RemoteIpValve"
remoteIpHeader="X-Forwarded-For"
trustedProxies="--IPs here--"
protocolHeaderHttpsValue="https" />