mod_remoteip
Remplace l'adresse IP et le nom d'hôte apparents du client pour la requête par l'adresse IP présentée par un mandataire ou un répartiteur de charge via les en-têtes de la requête.
Base
mod_remoteip.c
remoteip_module

Ce module permet de traiter l'hôte distant qui a initié la requête en tant qu'hôte distant original du point de vue de httpd à des fins d'autorisation et de connexion, même si cet hôte distant se trouve derrière un répartiteur de charge, un serveur frontal, ou un serveur mandataire.

Le module remplace les adresse IP et nom d'hôte apparents distants (du client) pour la requête par l'adresse IP indiquée dans l'en-tête de requête configuré via la directive RemoteIPHeader.

Une fois remplacée comme indiqué, cette adresse IP apparente est utilisée pour la fonctionnalité Require ip de mod_authz_host ; elle est aussi affichée par mod_status, et enregistrée via les directives `%a` et `%h` du module mod_log_config. Elle permet aussi d'identifier la machine en essayant de lui attribuer une identité inetd via le module mod_ident et en fonction de la configuration de la directive IdentityCheck.

Il est essentiel de n'activer cette fonctionnalité que pour les requêtes en provenance des serveurs intermédiaires (mandataires, etc...) auxquels le serveur peut faire confiance, car il est trivial pour le client distant d'usurper l'identité d'un autre client.

mod_authz_host
mod_status
mod_log_config
mod_ident

# Traitement des adresses distantes

Apache identifie le client par la valeur remote_ip de la connexion, et de cette valeur découlent les valeurs remote_host et remote_logname de la connexion. Ces champs jouent un rôle dans l'authentification, l'autorisation et la connexion, ainsi que dans d'autres traitements effectués par d'autres modules chargeables.

mod_remoteip remplace la véritable remote_ip par la remote_ip indiquée par exemple par un mandataire chaque fois que le serveur effectue une évaluation du client, et réinitialise les valeurs de remote_host et remote_logname afin de déclencher une nouvelle requête dns ou ident sur l'adresse IP distante.

Lorsque la valeur de l'en-tête comporte plusieurs adresses IP distantes séparées par des virgules, celles-ci sont traitées de la droite vers la gauche. Le traitement s'arrête lorsque l'adresse IP distante courante n'est pas digne de confiance pour présenter l'adresse IP précédente. Le champ d'en-tête est alors mis à jour de façon à ne contenir que cette liste d'adresses non confirmées, ou bien, si toutes les adresses IP sont dignes de confiance, cet en-tête est tout bonnement supprimé de la requête.

Lors du remplacement de l'adresse IP distante, le module stocke la liste des hôtes intermédiaires dans un mémo remoteip-proxy-ip-list, que l'on peut faire enregistrer par mod_log_config en utilisant le symbole de format `%{remoteip-proxy-ip-list}n`. Si l'administrateur doit stocker ceci dans un en-tête additionnel, la même valeur peut aussi être enregistrée sous la forme d'un en-tête en utilisant la directive RemoteIPProxiesHeader.

## Adresses IPv4 converties au format IPv6

Avec httpd, d'une manière générale, toute adresse IPv4 convertie au format IPv6 est enregistrée sous sa forme IPv4.

## Adresses internes (privées)

Tous les blocs d'adresses internes 10/8, 172.16/12, 192.168/16, 169.254/16 and 127/8 (ainsi que les adresses IPv6 en dehors du bloc public 2000::/3 block) ne sont évaluées par mod_remoteip que lorsque des mandataires internes (intranet) RemoteIPInternalProxy sont enregistrés.

RemoteIPHeader
Définit le champ d'en-tête qui contiendra les adresses IP du client
RemoteIPHeader en-tête
server config
virtual host

La directive RemoteIPHeader indique à mod_remoteip de traiter la valeur de l'en-tête spécifié comme l'adresse IP du client, ou comme une liste d'adresses IP clients intermédiaires, en fonction de la configuration des directives RemoteIPInternalProxy et RemoteIPTrustedProxy. Si ces deux dernières directives ne sont pas utilisées, mod_remoteip traitera tout hôte présentant une valeur d'IP RemoteIPHeader comme hôte de confiance.

# Exemple à usage interne (répartiteur de charge)

RemoteIPHeader X-Client-IP

# Exemple dans le cas d'un mandataire

RemoteIPHeader X-Forwarded-For
RemoteIPInternalProxy
Déclare les adresses IP intranet clients comme dignes de confiance pour présenter la valeur RemoteIPHeader
RemoteIPInternalProxy ip-mandataire|ip-mandataire/sous-réseau|nom-hôte ...
server config
virtual host

La directive RemoteIPInternalProxy permet d'ajouter une ou plusieurs adresses (ou blocs d'adresses) auxquelles on peut faire confiance pour présenter une valeur RemoteIPHeader valide de l'adresse IP du client. A la différence de la directive RemoteIPTrustedProxy, toute adresse IP présentée dans cet en-tête, y comprises les adresses intranet privées, sont considérées comme dignes de confiance lorsqu'elles sont indiquées par ces mandataires.

# Exemple à usage interne (répartiteur de charge)

RemoteIPHeader X-Client-IP RemoteIPInternalProxy 10.0.2.0/24 RemoteIPInternalProxy gateway.localdomain
RemoteIPInternalProxyList
Déclare les adresses IP intranet clients comme dignes de confiance pour présenter la valeur RemoteIPHeader
RemoteIPInternalProxyList nom-fichier
server config
virtual host

La directive RemoteIPInternalProxyList permet de spécifier un fichier parcouru au démarrage du serveur pour construire une liste d'adresses (ou blocs d'adresses), auxquelles on peut faire confiance pour présenter une valeur RemoteIPHeader valide de l'adresse IP du client.

Le caractère '`#`' indique une ligne de commentaires, sinon, toutes les lignes séparées par un caractère `nouvelle ligne` ou tous les éléments d'une ligne séparés par un espace sont traités de la même façon qu'avec la directive RemoteIPInternalProxy.

# Exemple à usage interne (répartiteur de charge)

RemoteIPHeader X-Client-IP RemoteIPInternalProxyList conf/trusted-proxies.lst

# contenu de conf/mandataires-de-confiance.lst

             # Nos mandataires internes de confiance
             10.0.2.0/24         # Tout le monde dans le groupe de test
             passerelle.domaine-local # Le frontal répartiteur de charge

RemoteIPProxiesHeader
Déclare le champ d'en-tête qui contiendra toutes les adresses IP intermédiaires
RemoteIPProxiesHeader Nom_en-tête
server config
virtual host

La directive RemoteIPProxiesHeader permet de spécifier l'en-tête dans lequel mod_remoteip va collecter une liste de toutes les adresses IP clients intermédiaires auxquelles on pourra faire confiance pour résoudre la véritable adresse IP distante. Notez que les adresses intermédiaires RemoteIPTrustedProxy sont enregistrées dans cet en-tête, alors que toute adresse intermédiaire RemoteIPInternalProxy est omise.

# Exemple

RemoteIPHeader X-Forwarded-For RemoteIPProxiesHeader X-Forwarded-By
RemoteIPTrustedProxy
Déclare les adresses IP intranet clients comme dignes de confiance pour présenter la valeur RemoteIPHeader
RemoteIPTrustedProxy ip-mandataire|ip-mandataire/sous-réseau|nom-hôte ...
server config
virtual host

La directive RemoteIPTrustedProxy permet d'ajouter une ou plusieurs adresses, ou blocs d'adresses, auxquelles on peut faire confiance pour présenter une valeur RemoteIPHeader valide de l'adresse IP du client. A la différence de la directive RemoteIPInternalProxy, toutes les adresses IP intranet ou privées indiquées par de tels mandataires, y compris les blocs d'adresses 10/8, 172.16/12, 192.168/16, 169.254/16 et 127/8 (ou située en dehors du bloc IPv6 public 2000::/3), ne sont pas dignes de confiance en tant qu'adresses IP distantes, et se situent à gauche dans le contenu de l'en-tête RemoteIPHeader.

# Exemple d'adresse de confiance (répartiteur de charge

RemoteIPHeader X-Forwarded-For RemoteIPTrustedProxy 10.0.2.16/28 RemoteIPTrustedProxy proxy.example.com
RemoteIPTrustedProxyList
Déclare les adresses IP intranet clients comme dignes de confiance pour présenter la valeur RemoteIPHeader
RemoteIPTrustedProxyList nom-fichier
server config
virtual host

La directive RemoteIPTrustedProxyList permet de spécifier un fichier parcouru au démarrage du serveur pour construire une liste d'adresses (ou blocs d'adresses), auxquelles on peut faire confiance pour présenter une valeur RemoteIPHeader valide de l'adresse IP du client.

Le caractère '`#`' indique une ligne de commentaires, sinon, toutes les lignes séparées par un caractère nouvelle ligne ou tous les éléments d'une ligne séparés par un espace sont traités de la même façon qu'avec la directive RemoteIPTrustedProxy.

# Exemple d'adresse de confiance (répartiteur de charge

RemoteIPHeader X-Forwarded-For RemoteIPTrustedProxyList conf/trusted-proxies.lst

# conf/mandataires-de-confiance.lst contents

# Mandataires externes identifiés
192.0.2.16/28 #groupe wap phone de mandataires
proxy.isp.example.com #un FAI bien connu