HAProxy代理后端服务取真实IP

HAProxy代理后端服务取真实IP


两台局域网内的webpy服务A、B,一台HAProxy用来做代理P,配有域名p.com


前期的请求从p.com访问没有问题,但有一个请求是需要记录客户端的IP,并针对客户端IP返回不同信息的。


这种情况下出问题了,A、B取到的都是P的内网IP:10.2.2.250


系统配置人员调整了P的策略,加上透传机制,但不知道哪里有问题配置上后就无法正常访问后台服务A、B。


此问题没有解决的情况下,海外运营需要将域名p.com放到Akamai加速中,突然发现A、B能取到客户端IP了,原因未明。。。




直接访问B和通过p.com访问,打出HTTP相关头参数,发现通过p.com访问HTTP头多了以下信息:
HTTP_VIA:1.1 v1-akamaitech.net(ghost) (AkamaiGHost), 1.1 v1-akamaitech.net(ghost) (AkamaiGHost), 1.1 akamai.net(ghost) (AkamaiGHost)
HTTP_X_FORWARDED_FOR:202.108.36.107, 184.50.87.135, 10.123.65.61
HTTP_AKAMAI_ORIGIN_HOP:3
HTTP_X_AKAMAI_CONFIG_LOG_DETAIL:true


直接访问B或者通过P的IP访问:
REMOTE_ADDR:10.2.2.250
通过p.com访问:
REMOTE_ADDR:202.108.36.107




基本判断是通过HTTP_X_FORWARDED_FOR传入真实IP了,用python写个脚本伪造此信息:
def GET2(strUrl):
    r = urllib2.Request(strUrl)
    r.add_header('X-Forwarded-For', '12.34.56.78')
    doc = urllib2.urlopen(r)
    return doc.read()


访问后看到以下值:
HTTP_X_FORWARDED_FOR:12.34.56.78
REMOTE_ADDR:12.34.56.78


无论是访问P的IP还是访问B,结果都一样,而webpy是通过web.ctx.ip取的就是REMOTE_ADDR,通过Akamai加速后,也就能取到真实IP了。
当然这种情况下如果有需要的话也可以伪造,这也可以给测试提供条件,直接可以用海外IP来测试相关处理逻辑了。




参见:
http://rdc.gleasy.com/使用haproxy和tproxy实现全透明代理.html
http://www.cnblogs.com/txw1958/archive/2012/03/12/2392067.html
http://blog.csdn.net/intel80586/article/details/8906779







你可能感兴趣的:(程序开发)