获取客户端的真实IP(而非代理服务器IP) 的一个实例

先了解一下问题所属项目:

api接口由php开发。

proxy服务由java开发,部署在proxy的tomcat服务下。

现在说一下遇到的问题:

在api程序中,某个业务场景需要通过获取用户app的真实ip,因为中间通过代理代理服务器,用 REMOTE_ADDR 头信息肯定获取不到app的ip,从google上查询http请求的头信息字段HTTP-X-FORWARDED-FOR存储的是客户端的原始ip地址,试了试还是不行,这样获取的还是代理服务器的ip地址。

解决思路:

1.有没有其它头信息字段是保存源头ip的?答案:没有。

2. Proxy程序通过HTTP-X-FORWARDED-FOR能否获取到客户端的ip呢?

去真实打log查看之前,想当然以为肯定是可以的,但是结果却使不可以。是因为app访问代理服务器的程序是部署在apache下的,但是中间经历了同样在代理服务器上的nginx反向代理,这样就导致proxy程序获取的HTTP-X-FORWARDED-FOR其实是apache服务的ip地址。

那能不能把app至nginx请求的HTTP-X-FORWARDED-FOR值转给apache呢?答案是肯定的,通过对nginx的代理配置进行简单修改即可, proxy服务器上nginx配置如下(红色字体的语句是加上的,解决了该问题):

server {
        listen 80;
        server_name    ***.com;

        location ~ /{
          proxy_set_header Connection "";
          proxy_set_header Host $host;

          proxy_set_header X-Forwarded-For $http_x_forwarded_for;
          proxy_pass http://**proxy;
        }
    }
      upstream wdproxy{
        server **.**.**.**:2200 max_fails=2 fail_timeout=30s;
    }

3.通过上一步,可以保证在proxy的程序中能获取正确的包含app真实ip的HTTP-X-FORWARDED-FOR头信息了,那么在向api服务器发请求时,通过程序语句设置HTTP-X-FORWARDED-FOR为这个正确的值不就ok了吗!!!

想着容易,可以实现又遇到了困难,发现tomcat的request根本没有提供set**方法,也就是没法去自己设置发出http请求的头信息。

4.没关系,实现功能是最重要的,哪怕不是那么完美。既然不能设置头信息,通过一个普通的请求参数总可以吧,于是在proxy应用程序向api的所有请求中,增加一个叫做x-forwarded-for的参数,在api程序中轻松获取到,然后结合具体场景进行使用就ok了。

相关话题:

这种通过HTTP-X-FORWARDED-FOR头信息获取ip的方式其实是存在安全问题的,因为用户可以伪造这个头信息,甚至能进行sql注入攻击。例如:我们经常遇到网上投票的场景,都需要根据ip防止恶意多投,如果只是采用HTTP-X-FORWARDED-FOR来获取真实ip,就会遇到问题。总之一个技术方案的好与坏要结合具体场景来看。

原文发布于微信公众号 - nginx(nginx-study)

原文发表时间:2015-05-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏性能与架构

redis性能测试工具 redis-benchmark

image.png redis-benchmark 是redis自带的性能测试工具,可以用来测试本地或远程redis的性能 基本测试 redis-benchm...

5788
来自专栏运维小白

10.26 unit介绍

unit介绍 ls /usr/lib/systemd/system //系统所有unit,分为以下类型: service 系统服务 target 多个u...

2197
来自专栏精讲JAVA

MySQL 中的重做日志,回滚日志以及二进制日志的简单总结

来源:MSSQL123 , www.cnblogs.com/wy123/p/8365234.html 转自:ImportNew MySQL中有六种日志文件,分别...

7727
来自专栏ascii0x03的安全笔记

VirtualBox - RTR3InitEx failed with rc=-1912 (rc=-1912)

有一天重启电脑后虚拟机virtual box突然打不开了,提示类似 https://askubuntu.com/questions/900794/virtual...

3935
来自专栏深度学习之tensorflow实战篇

sql 安装过程图解和安装密钥

SQL Server 2008安装图解 注意:首先将光盘镜像文件SQLFULL_CHS.iso解压到后才能安装,否则报错”setup.rll failed”。 ...

4658
来自专栏游戏杂谈

替换系统自带的记事本

系统自带的记事本功能比较弱,所以一般我会选择使用notepad2.exe来替代它。

3573
来自专栏Java3y

SVN就是这么简单

什么是SVN SVN全称:Subversion,是一个开放源代码的版本控制系统 Svn是一种集中式文件版本管理系统。集中式代码管理的核心是服务器,所有开发者在开...

3213
来自专栏小夜博客

Crontab自动记录服务器负载

3769
来自专栏Python爬虫与数据挖掘

如何给Centos系统的虚拟机更改主机名

有的小伙伴们发现Centos系统中主机名很长,想着更改主机名,换个简单的主机名,但是又不知道怎么做。其实这个问题的解决方案很简单的,默认情况下,虚拟机的...

1293
来自专栏雨过天晴

原 mac brew

1846

扫码关注云+社区

领取腾讯云代金券