当前位置:首页 > 科技  > 软件

应用获取客户端真实IP

来源: 责编: 时间:2023-11-15 17:17:01 164观看
导读背景信息因为产品需要,要在应用端获取到真实的客户端IP,访问链路如下:由于应用前面经过了多次代理,所以默认情况下是获取不到真实IP的。基本概念在实现之前,先简单了解一下常用来获取IP的几个header。remote_addrX-Forward

A5e28资讯网——每日最新资讯28at.com

背景信息

因为产品需要,要在应用端获取到真实的客户端IP,访问链路如下:A5e28资讯网——每日最新资讯28at.com

A5e28资讯网——每日最新资讯28at.com

由于应用前面经过了多次代理,所以默认情况下是获取不到真实IP的。A5e28资讯网——每日最新资讯28at.com

基本概念

在实现之前,先简单了解一下常用来获取IP的几个header。A5e28资讯网——每日最新资讯28at.com

  • remote_addr
  • X-Forwarded-For
  • X-Real-IP

1、remote_addr

remote_addr代表客户端IP,但是它的值不是由客户端提供的,而是服务端根据客户端IP指定的。当你访问某个应用时,当中间没有经过任何代理,那么应用获取到的remote_addr就是你的主机IP。如果中间经过了代理转发,正常情况下,应用获取到的remote_addr就是代理的IP,除非在代理服务器上手动将remote_addr的地址设置成你的主机IP。A5e28资讯网——每日最新资讯28at.com

2、X-Forwarded-For

X-Forwarded-For是HTTP扩展头,简称XFF。A5e28资讯网——每日最新资讯28at.com

XFF 的内容由「英文逗号 + 空格」隔开的多个部分组成,最开始的是离服务端最远的设备 IP,然后是每一级代理设备的 IP,其格式为:X-Forwarded-For: client,proxy1,proxy2。A5e28资讯网——每日最新资讯28at.com

!! PS: X-Forwarded-For的格式可以被伪造。A5e28资讯网——每日最新资讯28at.com

如果一个应用的前面有三个代理,分别是 Proxy1、Proxy2、Proxy3,它们的IP地址分别是IP1、IP2、IP3,用户的真实IP为IP0,那么按照XFF标准,应用收到的XFF信息应该如下:X-Forwarded-For: IP0,IP1,IP2。这里没有IP3,是因为Proxy3是转发Proxy2的代理,在转发过程中会将Proxy2的IP地址追加到XFF中,而自己的IP地址会被放入remote_addr中。A5e28资讯网——每日最新资讯28at.com

A5e28资讯网——每日最新资讯28at.com

!! PS:通过一个代理才会把上一个节点的IP加到XFF中。A5e28资讯网——每日最新资讯28at.com

3、X-Real-IP

X-Real-IP是一个自定义的头部字段,通常被HTTP代理用来表示与它产生TCP连接的设备IP,和XFF不一样的是,它不是列表,无法将记录追加到X-Real-IP的结尾,而是直接替换。A5e28资讯网——每日最新资讯28at.com

理想情况下,我们需要达到以下效果:A5e28资讯网——每日最新资讯28at.com

A5e28资讯网——每日最新资讯28at.com

也就是应用获取到的X-Real-IP就是客户端的真实IP,这就要求除了第一层代理之外,后面的代理不需要再去设置X-Real-IP,只需要做转发即可,这样应用就能拿到真实的客户端访问IP了。A5e28资讯网——每日最新资讯28at.com

具体实现

由于现实情况,我们在Haproxy上会做很多的规则配置,所以第一层SLB上是单纯的TCP代理,因此在SLB上不需要做太多额外配置,客户端IP会直接透传过去。A5e28资讯网——每日最新资讯28at.com

当请求到达Haproxy之后,需要将客户端IP加到XFF中,并且设置X-Real-IP为客户端IP,具体配置如下:A5e28资讯网——每日最新资讯28at.com

defaults                mode                    http                log                     global                option                  httplog                option                  dontlognull                option http-server-close                log 127.0.0.1 local3                option forwardfor       except 127.0.0.0/8                option                  redispatch                retries                 3                timeout http-request    10s                timeout queue           1m                timeout connect         10s                timeout client          5m                timeout server          5m                timeout http-keep-alive 10s                timeout check           10s                unique-id-format %{+X}o/ %ci%cp%fi%fp%Ts%rt%pidfrontend https_link_ha        bind *:443 ssl crt /usr/local/etc/haproxy/cert/crt/ ca-file /usr/local/etc/haproxy/cert/ca/ca.pem verify optional        #log 127.0.0.1 local3        mode http        log-format "%ID %ci:%cp [%tr] %ft %b/%s %TR/%Tw/%Tc/%Tr/%Ta %ST %B %CC %CS %tsc %ac/%fc/%bc/%sc/%rc %sq/%bq %hr %hs %{+Q}r"        option accept-invalid-http-request        http-request set-header x-request-id %[unique-id]        http-request set-header x-request-time %[date()]        http-request set-header X-Real-IP %[src]        default_backend prebackend pre     server 1 10.74.136.13:8080 check inter 1500 rise 3 fall 3 weight 3

其中主要是两个配置:A5e28资讯网——每日最新资讯28at.com

  • option forwardfor       except 127.0.0.0/8在由Haproxy发往后端的请求中加上XFF首部,其值是前个客户端的IP。
  • http-request set-header X-Real-IP %[src]在X-Real-IP中设置客户端IP。

现在请求就到达Ingress了。A5e28资讯网——每日最新资讯28at.com

Ingress也是一层代理,前面的客户端IP已经放到XFF中,但是默认情况下,Ingress没有开启XFF。A5e28资讯网——每日最新资讯28at.com

在Ingress上要使用XFF,需要使用到以下三个参数:A5e28资讯网——每日最新资讯28at.com

  • use-forwarded-headers:是否开启XFF头传递,默认是false。
  • forwarded-for-header:XFF的真实header名,默认是X-Forwarded-For。
  • compute-full-forwarded-for:列出客户端访问所经过的代理IP,默认情况下,XFF是从remote_addr中获取的值。

所以,我们只需要在Nginx Ingress的ConfigMap里增加以下两个配置即可:A5e28资讯网——每日最新资讯28at.com

use-forwarded-headers: 'true'compute-full-forwarded-for: 'true'

配置完成后,Nginx Ingress会自动重载服务,不需要单独重启。A5e28资讯网——每日最新资讯28at.com

然后在应用的日志里就能获取到客户端的真实IP了。A5e28资讯网——每日最新资讯28at.com

A5e28资讯网——每日最新资讯28at.com

当然,并不是所有的场景都能通过XFF获取到用户的真实IP,比如当SLB前面还有CDN的情况下,获取的可能就是CDN的来源IP了。A5e28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-25980-0.html应用获取客户端真实IP

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Qt串口回路信号读取多线程14串口测试方案

下一篇: 使用 Python 的基于边缘和基于区域的分割

标签:
  • 热门焦点
  • 6月iOS设备性能榜:M2稳居榜首 A系列只能等一手3nm来救

    6月iOS设备性能榜:M2稳居榜首 A系列只能等一手3nm来救

    没有新品发布,自然iOS设备性能榜的上榜设备就没有什么更替,仅仅只有跑分变化而产生的排名变动,毕竟苹果新品的发布节奏就是这样的,一年下来也就几个移动端新品,不会像安卓厂商,一
  • 印度登月最关键一步!月船三号今晚进入环月轨道

    印度登月最关键一步!月船三号今晚进入环月轨道

    8月5日消息,据印度官方消息,月船三号将于北京时间今晚21时30分左右开始近月制动进入环月轨道。这是该探测器能够成功的最关键步骤之一,如果成功将开始围
  • Rust中的高吞吐量流处理

    Rust中的高吞吐量流处理

    作者 | Noz编译 | 王瑞平本篇文章主要介绍了Rust中流处理的概念、方法和优化。作者不仅介绍了流处理的基本概念以及Rust中常用的流处理库,还使用这些库实现了一个流处理程序
  • JavaScript学习 -AES加密算法

    JavaScript学习 -AES加密算法

    引言在当今数字化时代,前端应用程序扮演着重要角色,用户的敏感数据经常在前端进行加密和解密操作。然而,这样的操作在网络传输和存储中可能会受到恶意攻击的威胁。为了确保数据
  • 本地生活这块肥肉,拼多多也想吃一口

    本地生活这块肥肉,拼多多也想吃一口

    出品/壹览商业 作者/李彦编辑/木鱼拼多多也看上本地生活这块蛋糕了。近期,拼多多在App首页“充值中心”入口上线了本机生活界面。壹览商业发现,该界面目前主要
  • 当家的盒马,加速谋生

    当家的盒马,加速谋生

    来源 | 价值星球Planet作者 | 归去来自己“当家”的盒马,开始加速谋生了。据盒马官微消息,盒马计划今年开放生鲜供应链,将其生鲜商品送往食堂。目前,盒马在上海已经与
  • 华为Mate 60系列用上可变灵动岛:正式版体验将会更出色

    华为Mate 60系列用上可变灵动岛:正式版体验将会更出色

    这段时间以来,关于华为新旗舰的爆料日渐密集。据此前多方爆料,今年华为将开始恢复一年双旗舰战略,除上半年推出的P60系列外,往年下半年的Mate系列也将
  • AMD的AI芯片转单给三星可能性不大 与台积电已合作至2nm制程

    AMD的AI芯片转单给三星可能性不大 与台积电已合作至2nm制程

    据 DIGITIMES 消息,英伟达 AI GPU 出货逐季飙升,接下来 AMD MI 300 系列将在第 4 季底量产。而半导体业内人士表示,近日传出 AMD 的 AI 芯片将转单给
  • 英特尔Xe-HP项目终止,将专注Xe-HPC/HPG系列显卡

    英特尔Xe-HP项目终止,将专注Xe-HPC/HPG系列显卡

    据10 月 31 日消息报道,英特尔高级副总裁兼加速计算系统和图形事业部总经理 表示,Xe-HP“ Arctic Sound” 系列服务器 GPU 已经应用于 oneAPI devcloud 云服
Top