在公司的网络中,使用F5工作在旁路模式,这样的好处是在不调整网络的基础架构上做负载均衡。但是在调整好网络之后,发现作为node(节点)的nginx已经不能正确获取到用户的IP地址,这导致之前使用nginx做的IP白名单策略失效。后来发现这是由于F5在旁路模式下将请求的头信息进行了修改,将源地址放到了X-Real-IP或X-Forwarded-For中。以这种情况来看,通过web应用程序应该可以很容易的获取这个地址,但这样就需要修改程序的业务逻辑,最好的办法还是让nginx支持读取真实IP。写到这里,回想起在使用HAProxy做LB的时候,需要配置类似于x-forwarded-for的选项了,所以,nginx还是有办法的。
nginx提供了这种获取方法,但是默认的编译参数中并没有支持,需要在编译的时候增加“–http-realip-module”作为参数。在重新编译完成之后,还需要对配置文件做一些修改,增加如下2项配置:
set_real_ip_from 192.168.160.8; real_ip_header X-Forwarded-For;
其中的192.168.160.8为F5的IP地址。OK,大功告成,再次查看access log,发现client IP地址已经生效,IP白名单也工作正常了。
在nginx的官方wiki中有关于“http realip module”的说明,文中提到:“如果nginx工作在一些7层负载均衡机之后,收到的请求来自本地IP(代理服务器),但是代理服务器又在头信息中添加了源IP,这时此模块就有用啦”,言外之意,如果有些L7的代理没有在头信息中增加源地址,这个模块也就没辙了。