apache日志中默认由%h来指定来访客户端ip地址,但是如果客户端使用了代理上网则%h获得的ip地址会不准,不过可以设定 x-forwarded-for 参数来获取客户端真实的ip地址。
在apache/ target=_blank class=infotextkey>apache服务器中,对于使用了反向代理的客户端,可以获取真实的IP地址:
复制代码 代码示例:
%{x-forwarded-for}i
logformat "%{x-forwarder-for}i %l %u %t "%r" %>s %b "%{referer}i" "%{user-agent}i""
linuxanyproxy
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 linuxanyproxy env=is-forwarder
注意:
1、使用正向代理的客户端,为了安全因素,在连接外部网络之前内部代理(网关)会去掉原有的x-forwarded-for信息,这种情况server端可以信任x-forwarded-for信息,表明连接出自某个内部网络。
2、如果server端使用了反向代理(比如server在7层代理的后面),这种情况就不能完全信任x-forwarded-for信息,最好使用一个白名单来进行控制。
3、如果通过了多级反向代理的话,x-forwarded-for的值并不止一个,而是一串ip值,究竟哪个才是真正的用户端的真实ip呢?
x-forwarded-for: client1, proxy1, proxy2
x-forwarded-for会取得第一个非unknown的有效ip字符串。