首页 > 解决方案 > 如何在 Apache config 中的 http 请求上使用 x-forward-for 而不是 LB IP 读取 Client-IP

问题描述

我需要在 httpd conf 中使用真实 IP 而不是 Proxy / Loabalancer IP 的 RewriteCond 语法。我的用例是一个维护页面,应该向所有用户显示,除了我的例外列表中的一些用户,由单独文件中列出的 IP 地址定义。

我已经在 apache 中将 REMOTE_ADDR 设置为 X-Forwarded-For 但我没有得到我需要的点。

我已将 Logformat 配置为

LogFormat "%{X-Forwarded-For}i \"test\" %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

我的输出是

www.xxx.yyy.zzz "test" 10.0.0.215 - - [22/May/2019:11:09:20 +0200]

但也可能是

www.xxx.yyy.zzz, 10.0.0.12 "test" 10.0.0.215 - - [22/May/2019:11:09:19 +0200]

所以我需要在我的用例中提取的第一个 IP。我的 httpd.conf 中有什么:

RewriteMap exceptions /appli/tecracer/apps/helios-fas/maintenance/exceptions.map

    # Allow Individual IP addresses past maintenance page
    RewriteCond ${exceptions:%{REMOTE_ADDR}} =OK
    RewriteRule ^ - [L]

我需要的是真实 IP,而不是 REMOTE_ADDR,它是 X-Forward-For 标头信息的第一个条目。我如何才能提取这个并且我可以相信第一个 IP 每次都是客户端 IP?

标签: apachex-forwarded-for

解决方案


你看过 remoteip_module apache 模块吗?

你需要包含它,配置很简单:

LoadModule remoteip_module modules/mod_remoteip.so
RemoteIPHeader x-forwarded-for

我的代理是 haproxy,在后端部分:

option  forwardfor

forwardfor 选项确保转发的请求包含实际的客户端 IP 地址。

那么 remote_addr 将是客户端 IP


推荐阅读