Lorsque ALB transfère les requêtes, l'adresse IP source visible par un serveur backend correspond à l'adresse IP de l'instance ALB. ALB peut ajouter l'adresse IP réelle du client au champ X-Forwarded-For de l'en-tête HTTP. Vous pouvez récupérer cette information en appliquant une configuration simple sur votre serveur backend.
Le champ X-Forwarded-For respecte le format suivant :
X-Forwarded-For: <real client IP, proxy server 1-IP, proxy server 2-IP, ...>
Procédure
Étape 1 : Vérifier la configuration de l'écouteur pour X-Forwarded-For
Connectez-vous à la console ALB, puis cliquez sur l'ID de l'instance cible pour accéder à la page Instance Details.
-
Dans l'onglet Listener, cliquez sur l'ID de l'écouteur cible. Sur la page Listener Details, dans la section Basic Information, vérifiez que l'option Add HTTP Header est configurée pour inclure
X-Forwarded-For.Cette option est activée par défaut. Si ce n'est pas le cas, cliquez sur Modify Listener dans la section Basic Information et activez-la dans la section Advanced Settings.
Étape 2 : Configurer le serveur backend
Cette rubrique explique comment enregistrer l'adresse IP réelle du client dans le journal d'accès de votre serveur backend (via le champ
X-Forwarded-For). Les variables de la couche de connexion du serveur (telles que$remote_addrdans Nginx et%hdans Apache) restent définies sur l'adresse IP de transfert ALB (adresse IP locale) et ne sont pas affectées.Si vous souhaitez remplacer directement les variables de la couche de connexion par l'adresse IP réelle du client (afin que la journalisation existante, le contrôle d'accès et les autres règles basées sur ces variables fonctionnent sans modification), consultez la section Comment permettre à Nginx ou Apache de récupérer directement l'adresse IP réelle du client (remplacement de l'adresse de la couche de connexion).
Serveur Nginx
Cette rubrique utilise un serveur Nginx exécutant Alibaba Cloud Linux 3.2104 et nginx/1.20.1 à titre d'exemple. La configuration réelle peut varier selon votre environnement.
Nginx utilise le module http_realip_module pour analyser l'en-tête X-Forwarded-For et récupérer l'adresse IP réelle du client.
-
Vérifiez que le module est installé : sur le serveur, exécutez la commande
nginx -V 2>&1 | grep --color=auto http_realip_module. Si la sortie contient--with-http_realip_module, le module est installé.
Pour les distributions Linux courantes, Nginx installé via un gestionnaire de packages tel que
yumouaptinclut généralement ce module par défaut. Si le module n'est pas installé, nous vous recommandons d'installer ou de mettre à niveau Nginx à l'aide d'un gestionnaire de packages. -
Modifiez le fichier de configuration Nginx : exécutez
sudo nginx -tpour trouver le chemin d'accès au fichier de configuration. Le chemin par défaut est généralement/etc/nginx/nginx.conf.http { # Ensure the log format includes $http_x_forwarded_for to record the value of the X-Forwarded-For header. log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; # Ensure the access log uses the preceding log format. access_log /var/log/nginx/access.log main; # ... } Rechargez la configuration : exécutez
sudo nginx -tpour vérifier la syntaxe de la configuration. Si la syntaxe est correcte, exécutezsudo nginx -s reloadpour appliquer les modifications.
Serveur Apache
Cette rubrique utilise un serveur Apache exécutant Alibaba Cloud Linux 3.2104 et Apache/2.4.37 à titre d'exemple. La configuration réelle peut varier selon votre environnement.
Apache utilise le module mod_remoteip pour analyser l'en-tête X-Forwarded-For et récupérer l'adresse IP réelle du client.
-
Vérifiez que le module est installé : sur le serveur, exécutez la commande
httpd -M | grep remoteip_module. Si la sortie contientremoteip_module (shared), le module est installé.
Pour les distributions Linux courantes, Apache installé via un gestionnaire de packages tel que
yumouaptinclut généralement ce module par défaut. Si le module n'est pas installé, nous vous recommandons d'installer ou de mettre à niveau Apache à l'aide d'un gestionnaire de packages. -
Modifiez le fichier de configuration Apache : exécutez
httpd -Vpour trouver le chemin d'accès au fichier de configuration. Le chemin par défaut est généralement/etc/httpd/conf/httpd.conf.# ... <IfModule log_config_module> # ... # Ensure the log format includes %{X-Forwarded-For}i to record the value of the X-Forwarded-For header. LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %{X-Forwarded-For}i" combined # ... # Ensure the access log uses the preceding log format. CustomLog "logs/access_log" combined </IfModule> # ... Rechargez la configuration : exécutez
sudo systemctl restart httpdpour appliquer les modifications.
Serveur IIS
Cette rubrique utilise un serveur IIS exécutant Windows Server 2022 21H2 et IIS 10.0 à titre d'exemple. La configuration réelle peut varier selon votre environnement.
-
Dans le volet Connections d'IIS Manager, sélectionnez le serveur cible. Dans le volet principal, double-cliquez sur Logging.

-
Dans la section Log File, cliquez sur Select Fields.

-
Dans la boîte de dialogue W3C Logging Fields, cliquez sur Add Field. Dans la boîte de dialogue Add Custom Field, configurez les informations du champ, puis cliquez sur OK.
Field Name : saisissez
X-Forwarded-For.Source Type : conservez la valeur par défaut,
Request Header.Source : saisissez
X-Forwarded-For.

-
Confirmez que le champ personnalisé a été ajouté et cliquez sur OK.

-
Dans le volet Actions à droite, cliquez sur Apply pour enregistrer les modifications.

Étape 3 : Vérifier la récupération de l'adresse IP du client
Consultez le journal d'accès du serveur web backend pour vérifier qu'il a bien récupéré l'adresse IP réelle du client.
Serveur Nginx
Le chemin par défaut du journal d'accès Nginx est /var/log/nginx/access.log.
Dans chaque entrée de journal, la valeur de la variable $http_x_forwarded_for correspond à l'adresse IP réelle du client.

Serveur Apache
Le chemin par défaut du journal d'accès Apache est /var/log/httpd/access_log.
Dans chaque entrée de journal, la valeur de la variable %{X-Forwarded-For}i correspond à l'adresse IP réelle du client.

Serveur IIS
Le chemin par défaut du journal d'accès IIS est %SystemDrive%\inetpub\logs\LogFiles.
Dans chaque entrée de journal, la valeur du dernier champ X-Forwarded-For correspond à l'adresse IP réelle du client.

Bonnes pratiques de production
Validez et filtrez l'en-tête X-Forwarded-For : sur votre serveur backend, validez et filtrez l'en-tête X-Forwarded-For. Rejetez les entrées mal formatées ou contenant des adresses IP non fiables.
Utilisez des politiques de sécurité : utilisez des groupes de sécurité ou d'autres politiques de sécurité tierces entre ALB et vos serveurs backends pour restreindre et filtrer les requêtes malveillantes comportant un en-tête X-Forwarded-For falsifié.
Chiffrement TLS : utilisez le chiffrement TLS pour protéger les communications entre les composants, y compris la transmission de l'en-tête X-Forwarded-For. Cela permet d'atténuer les risques d'attaques de type « man-in-the-middle » et de falsification des données.
FAQ
Accès fréquents depuis des adresses IP commençant par 100
Les instances ALB mises à niveau utilisent des adresses IP privées (adresses IP locales) issues des blocs CIDR des vSwitch associés pour communiquer avec les serveurs backends.
Les instances ALB non mises à niveau utilisent la plage d'adresses
100.64.0.0/10, réservée par Alibaba Cloud et ne présentant aucun risque de sécurité, pour communiquer avec les serveurs backends.
En plus de transférer les requêtes vers les serveurs backends, ALB effectue également des contrôles d'intégrité continus sur ces derniers. Si vous utilisez une instance ALB non mise à niveau, les journaux d'accès de votre serveur backend afficheront de nombreuses requêtes provenant d'adresses IP de la plage 100.64.0.0/10.
Pour garantir une connectivité appropriée entre votre instance ALB et vos services backends, assurez-vous qu'iptables ou tout autre logiciel de sécurité tiers installé sur vos instances ECS backends ne bloque pas le bloc CIDR du vSwitch de l'instance ALB ni la plage d'adresses 100.64.0.0/10.
Récupération de l'adresse IP du client avec WAF, CDN ou GA
Si le trafic est acheminé par des services tels que Web Application Firewall (WAF), Content Delivery Network (CDN) ou Global Accelerator (GA) avant d'atteindre ALB, vous pouvez également récupérer l'adresse IP réelle du client à partir du champ X-Forwarded-For. Ces produits transfèrent cet en-tête par défaut et ne nécessitent aucune configuration supplémentaire.
Pour empêcher la falsification de X-Forwarded-For, vous pouvez utiliser d'autres en-têtes HTTP pour enregistrer l'adresse IP réelle du client :
-
Utilisez l'en-tête
Ali-Cdn-Real-Ipd'Alibaba Cloud CDN. L'architecture est Client > CDN > WAF > ALB > ECS.Par défaut, CDN ajoute l'en-tête de requête
Ali-Cdn-Real-Ipaux requêtes transférées vers le serveur d'origine. Cet en-tête transmet l'adresse IP réelle du client qui s'est connecté au point de présence (POP) du CDN.Lors de l'intégration avec WAF, sélectionnez
Ali-Cdn-Real-Ipcomme en-tête personnalisé pour la détection de l'adresse IP du client.Configurez la variable de journal
$http_Ali_Cdn_Real_Ipsur le serveur Nginx backend pour récupérer l'adresse IP réelle du client à partir de ce champ.
-
Utilisez l'action Insert Header dans la règle de transfert d'un écouteur ALB pour ajouter un en-tête HTTP (paire clé-valeur) à la requête. L'architecture est Client > GA > ALB > ECS.
Dans la règle de transfert de l'écouteur ALB, définissez l'option Action sur Insert Header. Dans cet exemple, la clé est
client-real-ipet la valeur est définie surSystem-defined-Client IP Address.Pour l'écouteur, activez l'option Retrieve Client IP et ajoutez les adresses IP publiques de sortie du endpoint GA à la liste des adresses IP approuvées.
Configurez la variable de journal
$http_client_real_ipsur le serveur Nginx backend pour récupérer l'adresse IP réelle du client à partir de ce champ.
Récupération de l'adresse IP du client dans un environnement ACK
Pour plus d'informations, consultez la section Configurer des instances ALB à l'aide d'AlbConfig.
Comment permettre à Nginx ou Apache de récupérer directement l'adresse IP réelle du client (remplacement de l'adresse de la couche de connexion)
Nginx
Par défaut, $remote_addr dans les journaux Nginx enregistre l'adresse IP de transfert ALB (adresse IP locale). Pour la remplacer par l'adresse IP réelle du client (afin que la journalisation existante et les règles de contrôle d'accès fonctionnent sans modification), utilisez le module ngx_http_realip_module :
Exécutez
nginx -V | grep http_realip_modulepour vérifier que le module est installé.-
Dans le fichier de configuration (par défaut :
/etc/nginx/nginx.conf), ajoutez les éléments suivants au blochttp:set_real_ip_from <vSwitch CIDR block of the instance>; real_ip_header X-Forwarded-For; real_ip_recursive on;Si vous utilisez une instance ALB non mise à niveau, définissez
set_real_ip_fromsur100.64.0.0/10. Exécutez
sudo nginx -tpour vérifier la syntaxe, puis exécutezsudo nginx -s reloadpour recharger la configuration.
Une fois la configuration effective, consultez le journal d'accès (par défaut :/var/log/nginx/access.log) pour vérifier que$remote_addraffiche désormais l'adresse IP réelle du client.
Si le trafic traverse plusieurs proxys tels que WAF ou CDN, ajoutez les plages d'adresses IP d'origine de chaque couche de proxy à set_real_ip_from .
Les requêtes de contrôle d'intégrité ne contiennent pas l'en-têteX-Forwarded-For, donc$remote_addrpour ces requêtes affiche toujours le bloc CIDR du vSwitch de l'instance ALB (ou100.64.0.0/10pour les instances non mises à niveau). Il s'agit d'un comportement attendu.
Apache
Par défaut, %h dans les journaux Apache enregistre l'adresse IP de transfert ALB (adresse IP locale). Pour la remplacer par l'adresse IP réelle du client (afin que la journalisation existante et les règles de contrôle d'accès Require ip fonctionnent sans modification), utilisez le module intégré mod_remoteip d'Apache 2.4 :
Exécutez
httpd -M | grep remoteip_modulepour vérifier que le module est installé.-
Dans le fichier de configuration (par défaut :
/etc/httpd/conf/httpd.conf), ajoutez les éléments suivants :RemoteIPHeader X-Forwarded-For RemoteIPTrustedProxy <vSwitch CIDR block of the instance>Si vous utilisez une instance ALB non mise à niveau, définissez
RemoteIPTrustedProxysur100.64.0.0/10. Exécutez
sudo systemctl restart httpdpour redémarrer Apache.
Une fois la configuration effective, consultez le journal d'accès (par défaut :/var/log/httpd/access_log) pour vérifier que%haffiche désormais l'adresse IP réelle du client.
Si le trafic traverse plusieurs proxys tels que WAF ou CDN, ajoutez les plages d'adresses IP d'origine de chaque couche de proxy à RemoteIPTrustedProxy .
Les requêtes de contrôle d'intégrité ne contiennent pas l'en-têteX-Forwarded-For, donc%hpour ces requêtes affiche toujours le bloc CIDR du vSwitch de l'instance ALB (ou100.64.0.0/10pour les instances non mises à niveau). Il s'agit d'un comportement attendu.