Comment enregistrer les adresses IP client et X-Forwarded-For dans le journal des accès Tomcat.
J'utilise% {X-Forwarded-For} i et il enregistre l'adresse réelle du client si j'accède via l'équilibreur de charge. Mais ne consigne pas l'adresse client réelle si j'accède directement à l'instance Tomcat. Est-il possible d'afficher l'adresse IP réelle du client dans les deux cas?
De http://www.techstacks.com/howto/configure-access-logging-in-Tomcat.html :
Si vous exécutez une version de Tomcat supérieure à la version 6.0.21 ou Tomcat 7, vous pouvez tirer parti de la nouvelle vanne IP distante. Pour la journalisation des accès, l’avantage de cette valve est qu’elle va échanger l’IP du client avec une adresse IP passée avec l’en-tête X-Forwarded-For automatiquement si une adresse IP est passée dans l’en-tête X-Forwarded-For. Le chargement est assez facile. Ajoutez simplement le fichier org.Apache.catalina.valves.RemoteIpValve à votre fichier server.xml avant votre déclaration AccessLogValve. Par exemple:
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<!-- Remote IP Valve -->
<Valve className="org.Apache.catalina.valves.RemoteIpValve" />
<!-- Access log processes all example.
Documentation at: /docs/config/Valve.html -->
<Valve className="org.Apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt"
pattern="combined" resolveHosts="false"/>
-->
</Host>
Si vous utilisez une version de Tomcat 6 antérieure à 6.0.21 et que vous souhaitez stocker l'adresse IP X-Forwarded-For, vous pouvez modifier la propriété pattern de votre AccessLogValve. Vous devrez supprimer le motif "commun" ou "combiné" et le remplacer par l'un des motifs suivants:
Common Log Format: %{X-Forwarded-For}i %l %u %t "%r" %s %b
Combined Log Format: %{X-Forwarded-For}i %l %u %t %r %s %b %{User-Agent}i %{Referer}i
Le principal problème ici, que RemoteIP Valve prend en charge, est que vous obtenez uniquement l'adresse X-Forwarded-For dans les journaux. Si vous frappez directement le serveur d'applications en contournant le périphérique insérant l'en-tête X-Forwarded-For dans la demande, vous ne recevrez pas d'adresse IP consignée. Vous enregistrerez toujours une demande - vous ne saurez tout simplement pas d’où elle vient.
<Valve className="org.Apache.catalina.valves.RemoteIpValve"
remoteIpHeader="x-forwarded-for" />
<Valve className="org.Apache.catalina.valves.AccessLogValve"
requestAttributesEnabled="true"
pattern="Remote Ip is: %{org.Apache.Tomcat.remoteAddr}r" />
Vous pouvez ajouter ces deux définitions de vanne dans le fichier context.xml. Ainsi, vous pouvez voir une adresse IP distante dans les deux cas. Par équilibreur de charge ou direct.
org.Apache.catalina.valves.RemoteIpValve détecte l'en-tête "x-forwarded-for". S'il y a "x-forwarded-for" dans l'en-tête, sa valeur est attribuée à l'attribut de requête "org.Apache.Tomcat.remoteAddr". S'il n'y a pas de "x-forwarded-for" dans l'en-tête, met l'adresse IP du client dans l'attribut de requête "org.Apache.Tomcat.remoteAddr".
AccessLogValve config enregistre simplement l'attribut de requête "org.Apache.Tomcat.remoteAddr" qui contient l'adresse IP distante correcte.