X-Forwarded-For
(XFF
)是用来识别通过HTTP
代理
或负载均衡
方式连接到Web服务器
的客户端最原始的IP地址
的HTTP请求头字段。 Squid
缓存代理服务器的开发人员最早引入了这一HTTP头字段,并由IETF
在Forwarded-For HTTP头字段标准化草案
中正式提出。
当今多数缓存服务器的使用者为大型ISP,为了通过缓存的方式来降低他们的外部带宽,他们常常通过鼓励或强制用户使用代理服务器来接入互联网
。有些情况下, 这些代理服务器是透明代理, 用户甚至不知道自己正在使用代理上网。
如果没有XFF或者另外一种相似的技术,所有通过代理服务器的连接只会显示代理服务器的IP地址(而非连接发起的原始IP地址),
这样的代理服务器实际上充当了匿名服务提供者的角色,
如果连接的原始IP地址不可得,恶意访问的检测与预防的难度将大大增加。XFF的有效性依赖于代理服务器提供的连接原始IP地址的真实性,因此,
XFF的有效使用应该保证代理服务器是可信的, 比如可以通过建立可信服务器白名单的方式。
格式
这一HTTP头一般格式如下:
X-Forwarded-For: client1, proxy1, proxy2
其中的值通过一个 逗号+空格 把多个IP地址区分开, 最左边(client1)是最原始客户端的IP地址, 代理服务器每成功收到一个请求,就把请求来源IP地址
添
加到右边。 在上面这个例子中,这个请求成功通过了三台代理服务器:proxy1, proxy2 及
proxy3。请求由client1发出,到达了proxy3(proxy3可能是请求的终点)。请求刚从client1中发出时,XFF是空的,请求被
发往proxy1;通过proxy1的时候,client1被添加到XFF中,之后请求被发往proxy2;通过proxy2的时候,proxy1被添加
到XFF中,之后请求被发往proxy3;通过proxy3时,proxy2被添加到XFF中,之后请求的的去向不明,如果proxy3不是请求终点,请
求会被继续转发。
鉴于伪造这一字段非常容易,应该谨慎使用X-Forwarded-For字段。正常情况下XFF中最后一个IP地址是最后一个代理服务器的IP地址, 这通常是一个比较可靠的信息来源。
apache日志中 X-Forwarded-For 参数的设定
apache 日志中可以设定 X-Forwarded-For 参数来获取客户端真实的ip地址
对于使用了反向代理的客户端,跟踪真实的ip地址
X-Forwarded-For
header is supported by most proxy servers, including Squid,[1] Apache
mod_proxy,[2] Pound,[3] Varnish cache,[4] IronPort Web Security
Appliance,[5] Radware AppXcel, F5 Big-IP, [6] Blue Coat ProxySG, Cisco
Cache Engine, Phion Airlock, Finjan's Vital Security, NetApp NetCache,
jetNEXUS, Crescendo Networks' Maestro, and Microsoft ISA Server
2004/2006 with Winfrasoft X-Forwarded-For for ISA Server.[7]
X-Forwarded-For
header logging is supported by many web servers including Apache and
Microsoft IIS 6.0 & 7.0 with the addition of Winfrasoft
X-Forwarded-For for IIS.[7]
##########################################
this is a apache's seting for X-Forwarded-For (f5):
%{X-Forwarded-For}i
LogFormat "%{X-Forwarder-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" f5_forwarder
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
SetEnvIf X-Forwarder-For "^.*\..*\..*\..*" is-forwarder
CustomLog logs/access_log combined env=!is-forwarder
CustomLog logs/access_log f5_forwarder env=is-forwarder
http://zh.wikipedia.org/wiki/X-Forwarded-For
分享到:
相关推荐
的Real IP中间件,将http.Request的RemoteAddr设置为解析X-Forwarded-For标头或X-Real-IP标头的结果。 用法 package main import ( "github.com/gin-gonic/gin" "github.com/thanhhh/gin-gonic-realip" ) func ...
当使用代理(如 nginx)时,此中间件模块尝试将req.socket.remoteAddress和headers['x-forwarded-for'] req.ip为req.ip var extras = require('express-extras'); app.configure(function() { app.use(extras....
const realIp = req.headers['x-real-ip'] || req.headers['x-forwarded-for']; if (Array.isArray(realIp)) { realIp = realIp.split(',')[0]; } console.log('Real IP:', realIp); next(); }); app.listen...
此外,考虑到不同的CDN可能会有不同的头字段名,你还可以检查其他可能的头,如`X-Forwarded-For`,这是一个常见的代理头,很多CDN和代理服务都会设置它。如果`CF-Connecting-IP`不存在,可以尝试从`X-Forwarded-For`...
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_pass http://nginx-cis; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header X...
例如,我们可以用`ipaddr.js`检查`X-Forwarded-For`头中的第一个IP地址,确保它不是一个私有或受限的IP地址,从而防止潜在的安全攻击。 在实际应用中,以下是一个示例代码片段,展示了如何结合`ipaddr.js`和`trust ...
String ip = request.getHeader("X-Forwarded-For"); if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } if (ip == null || ip.length...
$event['request']->headers->set('X-Forwarded-For', 'php-proxy'); }); $proxy->getEventDispatcher()->addListener('request.sent', function($event){ if($event['response']->getStatusCode() != 200){...
可以识别通用逗号分隔的标头,例如X-Forwarded-For , X-Real-Ip和X-Client-Ip ,以及 Forwarded标头。 您可以指定任意数量的转发头来识别甚至配置自己的解析器。 IP的处理是从后到先的,以防止IP欺骗。 默认情况下...
在这个配置中,`onProxyReq`回调函数用于在请求发送到目标服务器之前,添加或更新`X-Forwarded-For`头。 3. **启动服务器**:然后,你可以使用Express或其他HTTP服务器库结合这个代理中间件启动你的服务: ```...
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } ``` - **重启Nginx服务** - 保存所有更改后,重启Nginx服务。 #### 二、Linux环境下Nginx...
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; index index....
Snes9x is freeware for PERSONAL USE only. Commercial users should seek permission of the copyright holders first. Commercial use includes charging money for Snes9x or software derived from Snes9x. ...
- `proxy_set_header`:设置代理服务器头信息,如Host、X-Real-IP和X-Forwarded-For,用于识别真实客户端。 - `proxy_cache_path`:定义缓存路径和参数,例如大小、级别等。 - `proxy_ignore_headers`:忽略特定...
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } ``` - 测试配置文件的正确性: ```bash sudo nginx -t ``` - 如果测试没有问题,重新...
`option forwardfor`添加X-Forwarded-For头,记录客户端真实IP。错误页面相关设置允许自定义返回给客户端的错误页面。`cookie`和`redispatch`涉及会话持久性和会话重调度。`reqadd`和`rspadd`允许在请求或响应中添加...
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } ``` #### 四、LVS 安装与配置 1. **安装 LVS**: - 使用包管理器安装 `ipvsadm`,例如 `yum install ipvsadm`。 - 编写 shell 脚本 `lvs...
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } ``` 通过以上配置,我们可以看到Nginx不仅提供了丰富的配置选项来优化其自身性能,还能够有效地实现负载均衡和动静分离等功能,从而显著提升...
4. **option forwardfor**:此选项会将客户端的真实IP地址添加到HTTP请求头的`X-Forwarded-For`字段中,方便后端服务器识别原始请求来源。 5. **check**:健康检查,haproxy会定期向后端服务器发送探测请求,确保...
例如,请求的IP地址可以通过`req.ip`获取,但通常这会包含代理信息,所以更推荐使用`req.headers['x-forwarded-for']`来获取真实IP。用户代理和语言信息分别通过`req.headers['user-agent']`和`req.headers['accept-...