Korrekte IP-Adressen im Log trotz Cloudflare

Cloudflare bietet seine Dienste kostenlos an und verhilft Webmastern dadurch nicht nur zu mehr Sicherheit, sondern durch den reduzierten Traffic auch zu geringeren Kosten.

Da Cloudflare als Reverse-Proxy auftritt, taucht in der regulären Webserver-Konfiguration nur die IP-Adresse des Cloudflare-Servers im Logbuch auf. Lange Zeit wurde durch Cloudflare ein eigenes Apache-Modul mod_cloudflare gepflegt, das nun jedoch nicht mehr erforderlich ist. Stattdessen sollte zukünftig mit mod_remoteip gearbeitet werden, das durch Apache selbst gepflegt wird.

Korrekte Ausgabe der Remote-IP trotz Cloudflare

Zu allererst wird das Modul aktiviert:

a2enmod remoteip

Anschließend erflgt die Konfiguration in der Datei /etc/apache2/mods-enabled/remoteip.conf. Sie ist denkbar einfach, denn sie enthält lediglich zwei Direktiven:

Mit der Option RemoteIPHeader wird der Custom HTTP Header festgelegt, in dem Cloudflare die reale IP des Clients übermittelt.

Über die Option RemoteIPTrustedProxy wird Apache angewiesen, diesen Header nur dann zu akzeptieren, wenn der Zugriff tatsächlich aus dem Netz von Cloudflare kommt. Greift ein Client direkt auf den Server zu, bleibt das Modul mod_remoteip ohne Funktion. So wird das vorzeigen einer gefälschten IP-Adresse per Remite-IP-Header unterbunden.

<IfModule mod_remoteip.c>
  # Cloudflare header containing the original client ip
  RemoteIPHeader CF-Connecting-IP

  # Trusted Cloudflare servers
  RemoteIPTrustedProxy 173.245.48.0/20
  RemoteIPTrustedProxy 103.21.244.0/22
  RemoteIPTrustedProxy 103.22.200.0/22
  RemoteIPTrustedProxy 103.31.4.0/22
  RemoteIPTrustedProxy 141.101.64.0/18
  RemoteIPTrustedProxy 108.162.192.0/18
  RemoteIPTrustedProxy 190.93.240.0/20
  RemoteIPTrustedProxy 188.114.96.0/20
  RemoteIPTrustedProxy 197.234.240.0/22
  RemoteIPTrustedProxy 198.41.128.0/17
  RemoteIPTrustedProxy 162.158.0.0/15
  RemoteIPTrustedProxy 104.16.0.0/12
  RemoteIPTrustedProxy 172.64.0.0/13
  RemoteIPTrustedProxy 131.0.72.0/22
  RemoteIPTrustedProxy 2400:cb00::/32
  RemoteIPTrustedProxy 2606:4700::/32
  RemoteIPTrustedProxy 2803:f800::/32
  RemoteIPTrustedProxy 2405:b500::/32
  RemoteIPTrustedProxy 2405:8100::/32
  RemoteIPTrustedProxy 2a06:98c0::/29
  RemoteIPTrustedProxy 2c0f:f248::/32
</IfModule>
 
vim: syntax=apache ts=4 sw=4 sts=4 sr noet

Diese Änderungen reichen bereits aus, um die Remote-Adresse während der Laufzeit korrekt auszugeben, z.B. in PHP per $_SERVER['REMOTE_ADDR']. Damit auch das Logging korrekt funktioniert, müssen die Log-Formate geändert werden. Diese befinden sich in der Datei /etc/apache2/apache2.conf. Das Original sieht so aus:

LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

In diesen Formaten repräsentiert %h die IP-Adresse bzw. den Hostnamen des Clients. Dieser Wert wird durch %a ausgetauscht:

LogFormat "%v:%p %a %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%a %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%a %l %u %t \"%r\" %>s %O" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

Abschließend muss nur noch die Konfiguration neu geladen werden:

service apache2 reload

Ähnliche Artikel

Comments

Leave a Comment