通过x-forward-for获取到一个ip列表,通过逗号进行了隔离。
X-Forward-For:clientIP, server1IP, server2IP, server3IP;
从左往右就是客户端请求到最后的ip列表,所以第一个就是客户端ip。
假设反向代理是比如nginx,nginx可以设置:
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
但是发起请求的ip带的x-forward-for可能被自己伪造,这个无解。但是发起请求的ip不能被伪造,因此,使用x-real-ip设置为remote-add,将remote-add拼接到x-forward-for后面。
那么如何杜绝这种现象,既然携带的x-forward-for靠不住,那最外层nginx直接不用了,使用
proxy_set_header X-Forwarded-For $remote_addr;
直接获取真实ip,并赋值给x-forward-for。
最外层以外的在自己的可控范围之内,可以继续使用 $proxy_add_x_forwarded_for;
其他反向代理,比如apache,IIS6,IIS7没怎么用过,不太了解,待分析。