开发者社区> 问答> 正文

如何获取客户端真实IP?

如何获取客户端真实IP?

展开
收起
保持可爱mmm 2020-03-29 11:54:51 2101 0
3 条回答
写回答
取消 提交回答
  • 是在什么场景下获取客户端的IP?

    2020-03-29 21:26:53
    赞同 展开评论 打赏
  • 有点尴尬唉 你要寻找的东西已经被吃掉啦!

    发生的场景:服务器端接收客户端请求的时候,一般需要进行签名验证,客户端IP限定等情况,在进行客户端IP限定的时候,需要首先获取该真实的IP。

    一般分为两种情况:

      方式一、客户端未经过代理,直接访问服务器端(nginx,squid,haproxy);

      方式二、客户端通过多级代理,最终到达服务器端(nginx,squid,haproxy);

    客户端请求信息都包含在HttpServletRequest中,可以通过方法getRemoteAddr()获得该客户端IP。

      方式一形式,可以直接获得该客户端真实IP。

      方式二中通过代理的形式,此时经过多级反向的代理,通过方法getRemoteAddr()得不到客户端真实IP,可以通过x-forwarded-for获得转发后请求信息。当客户端请求被转发,IP将会追加在其后并以逗号隔开,例如:10.47.103.13,4.2.2.2,10.96.112.230。

    请求中的参数:

      request.getHeader("x-forwarded-for") : 10.47.103.13,4.2.2.2,10.96.112.230

      request.getHeader("X-Real-IP") : 10.47.103.13

      request.getRemoteAddr():10.96.112.230

    客户端访问经过转发,IP将会追加在其后并以逗号隔开。最终准确的客户端信息为:

    x-forwarded-for 不为空,则为逗号前第一个IP ;
    X-Real-IP不为空,则为该IP ;
    否则为getRemoteAddr() ;
    

    相关请求头的解释:

    X-Forwarded-For :这是一个 Squid 开发的字段,只有在通过了HTTP代理或者负载均衡服务器时才会添加该项。    
    

        格式为X-Forwarded-For:client1,proxy1,proxy2,一般情况下,第一个ip为客户端真实ip,后面的为经过的代理服务器ip。现在大部分的代理都会加上这个请求头。

    Proxy-Client-IP/WL- Proxy-Client-IP :这个一般是经过apache http服务器的请求才会有,用apache http做代理时一般会加上Proxy-Client-IP请求头,而WL-Proxy-Client-IP是他的weblogic插件加上的头。
    HTTP_CLIENT_IP :有些代理服务器会加上此请求头。
    X-Real-IP  :nginx代理一般会加上此请求头。
    
    2020-03-30 09:46:17
    赞同 展开评论 打赏
  • 配置IIS7/IIS8服务器 下载并解压 F5XForwardedFor文件。 根据自己的服务器操作系统版本将x86\Release或x64\Release目录下的F5XFFHttpModule.dll和F5XFFHttpModule.ini拷贝到某个目录,例如C:\F5XForwardedFor\。确保IIS进程对该目录有读取权限。 打开IIS管理器,双击模块功能。

    单击配置本机模块,然后在弹出的对话框中,单击注册。

    添加下载的.dll文件。

    为添加的两个文件授权允许运行ISAPI和CGI扩展。

    说明 确保您已经安装了ISAPI和CGI应用程序。

    重启IIS服务器,等待配置生效。 配置Apache服务器 执行如下命令,安装Apache的一个第三方模块mod_rpaf。

    wget https://github.com/gnif/mod_rpaf/archive/v0.6.0.tar.gz tar zxvf mod_rpaf-0.6.tar.gz cd mod_rpaf-0.6 /alidata/server/httpd/bin/apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c 修改Apache的配置文件/alidata/server/httpd/conf/httpd.conf,在最末尾添加以下配置信息。

    LoadModule rpaf_module modules/mod_rpaf-2.0.so RPAFenable On RPAFsethostname On RPAFproxy_ips <IP_address> RPAFheader X-Forwarded-For

    说明 如果您要获取代理服务器的地址,可以将代理服务器的网段添加到RPAFproxy_ips <IP_address>,如负载均衡的IP地址段100.64.0.0/10(100.64.0.0/10 是阿里云保留地址,其他用户无法分配到该网段内,不会存在安全风险)和高防IP地址段。多个IP地址段用逗号分隔。 添加完成后重启Apache。

    /alidata/server/httpd/bin/apachectl restart 配置Nginx服务器 执行如下命令,安装http_realip_module。

    wget http://nginx.org/download/nginx-1.0.12.tar.gz tar zxvf nginx-1.0.12.tar.gz cd nginx-1.0.12 ./configure --user=www --group=www --prefix=/alidata/server/nginx --with-http_stub_status_module --without-http-cache --with-http_ssl_module --with-http_realip_module make make install kill -USR2 cat /alidata/server/nginx/logs/nginx.pid kill -QUIT cat /alidata/server/nginx/logs/ nginx.pid.oldbin 执行如下命令,打开nginx.conf文件。

    vi /alidata/server/nginx/conf/nginx.conf 在以下配置信息后添加新的配置字段和信息。

    fastcgi connect_timeout 300; fastcgi send_timeout 300; fastcgi read_timeout 300; fastcgi buffer_size 64k; fastcgi buffers 4 64k; fastcgi busy_buffers_size 128k; fastcgi temp_file_write_size 128k; 需要添加的配置字段和信息为:

    set_real_ip_from IP_address real_ip_header X-Forwarded-For;

    说明 如果您要获取代理服务器的地址,可以将代理服务器的网段添加到set_real_ip_from <IP_address>,如负载均衡的IP地址段100.64.0.0/10(100.64.0.0/10 是阿里云保留地址,其他用户无法分配到该网段内,不会存在安全风险)和高防IP地址段。多个IP地址段用逗号分隔。 执行如下命令,重启Nginx。

    /alidata/server/nginx/sbin/nginx -s reload

    2020-03-30 09:50:00
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载