精华内容
下载资源
问答
  • Gin的真正IP中间件 的Real IP中间件,将http.Request的RemoteAddr设置为解析X-Forwarded-For标头... Use ( realip . RealIP ()) r . Get ( "/" , func () string { return "Hello world!" }) r . Run ( ":8080" ) }
  • 工作总做负载均衡的时候回经常用到。在这里记录下。...先说下我们的测试的机器IP分布。 客户端IP 100.100.100.1 负载均衡LB 100.100.100.2 web机器 100.100.1...

    工作中做负载均衡的时候回经常用到。在这里记录下。

    普及下各个机器的名称

    发送请求方的机器 名称叫客户端。
    请求转发和反向代理的机器叫负载均衡或者LB
    最终逻辑处理的机器叫WEB机器。【码农写的逻辑基本上都在WEB机器上】

    先说下我们的测试的机器IP分布。

    客户端IP100.100.100.1
    负载均衡LB100.100.100.2
    web机器100.100.100.3

    remote_addr

    客户端的IP,如果有代理的话表示最后一个代理服务器的IP。Nginx变量。这个变量是建立TCP连接的IP变量。remote_addr所表示的IP是不可更改的。试想下,如果这个变量可随意更改的话,都无法建立正常的TCP连接。
    LB上设置

    proxy_set_header   REMOTE-ADDR      100.100.100.100;
    

    WEB机器上打印

    ngx.log(ngx.ERR,ngx.req.get_headers()['remote_addr'])
    ngx.log(ngx.ERR, ngx.var.remote_addr)
    
    [error] 7566#7566: *5914 [lua] test.lua:
    proxy_set_header   REMOTE-ADDR      100.100.100.100
    [error] 7566#7566: *5914 [lua] test.lua    100.100.100.2
    

    不管怎么设置,最终Nginx变量的值都是建立连接的IP。而且需要注意的是header里面的值和变量里面的值是不相同的

    X-Forwarded-For

    Nginx变量,如果每个代理服务器都设置了
    proxy_set_header X-Forwarded-For KaTeX parse error: Double subscript at position 12: proxy_add_x_̲forwarded_for 是…remote_addr用逗号合起来,如果请求头中没有X-Forwarded-For则KaTeX parse error: Double subscript at position 12: proxy_add_x_̲forwarded_for为remote。
    会记录请求的路由顺序。这个变量只是记录请求的服务器路由顺序。因为这个变量不管在客户端还是代理服务商都是可以伪造的。
    我们做下测试

    ngx.log(ngx.ERR, ngx.var.http_x_forwarded_for)
    100.100.100.1 ,100.100.100.2
    

    基本是按照发起方的请求顺序记录的,显示客户端IP,然后代理服务器的IP。如果有多层代理的话,就是这样的

    客户端IP,proxy1,proxy2,proxyN
    

    而且是当前机器追加记录上一个机器的IP。proxy1追加就客户端IP,proxy2追加记录proxy1.
    如果请求的时候伪造X-Forwarded-For即加header头 -H ‘X-Forwarded-For:1.1.1.1,2.2.2.2’。就会是

    伪造IP,客户端IP,proxy1,proxy2,proxyN
    

    所以说取真实IP直接获取X-Forwarded-For的第一个IP是不合理的。

    如果是服务器上,不传递X-Forwarded-For,即
    proxy_set_header X-Forwarded-For 没有这个。那下一级的X-Forwarded-For这个变量就是空的。所以X-Forwarded-For 这个值主要是proxy_set_header 传递。

    X-Real-IP

    顾名思义真实IP。这个变量主要是用来记录真实IP。这个值也主要是以来proxy_set_header传递。可以先看下使用

    100.100.100.2
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    
    100.100.100.3
    ngx.log(ngx.ERR, ngx.var.http_x_forwarded_for)
    ngx.log(ngx.ERR, ngx.var.http_x_real_ip)
    
    100.100.100.1,100.100.100.2
    100.100.100.1
    

    可以看到,使用得当,x_real_ip是可以很轻松的拿到真实IP。
    如果是多级代理的话,一级一级向后传递真实IP。

    第一级代理写法
    proxy_set_header X-Real-IP $remote_addr;
    后面的代理
    proxy_set_header X-Real-IP $x_real_ip;
    

    总结

    X-Forwarded-For与X-Real-IP 主要依赖proxy_set_header传递,所以想传什么样的值就传什么样的值。Remote-Addr建立连接的IP,有的地方也说是上一跳的IP,这个不依赖header头传递,不可更改。
    所以用上面的组合,第一层代理获取到真实IP,remote_addr。使用x_real_ip层层后传,使用x_real_ip在WEB机器上获取到真实IP。
    真实IP的获取顺序是 先检查x_real_ip有无值,有就返回。没有再检查Remote-Addr有无值,有就返回。X-Forwarded-For主要记录请求路由顺序,可伪造。

    ------------------------------------end
    一起关注高性能WEB后端技术,关注公众号
    在这里插入图片描述

    展开全文
  • X-Forwarded-For和X-Real-ip的区别 环境配置: 三台代理(lb01:10.0.0.7、lb02:10.0.0.8、lb03:10.0.0.9) 一台web应用服务器(web:10.0.0.5) 1.配置官方nginx源并安装(4台都操作) [root@lb01 ~]# vim /etc/...

    X-Forwarded-For和X-Real-ip的区别

    环境配置:
    三台代理(lb01:10.0.0.7、lb02:10.0.0.8、lb03:10.0.0.9)
    一台web应用服务器(web:10.0.0.5)

    1.配置官方nginx源并安装(4台都操作)
    
    [root@lb01 ~]# vim /etc/yum.repos.d/nginx.repo 
    [root@lb01 ~]# yum install nginx -y
    
    [root@lb01 ~]# nginx -v
    nginx version: nginx/1.16.0
    
    2.启动nginx服务加入开机自启(4台都操作)
    
    [root@lb01 ~]# systemctl start nginx
    [root@lb01 ~]# systemctl enable nginx
    Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.

    统一将proxy定义的配置存放到proxy_params中,便于调用

    [root@lb01 nginx]# vim /etc/nginx/proxy_params
    
    proxy_http_version 1.1; 
    proxy_http_version 1.1;  
    proxy_http_version 1.1;  
    proxy_set_header Host $http_host;
    proxy_set_header X‐Real‐IP $remote_addr; #配置X‐Real‐IP
    proxy_set_header X‐Forwarded‐For $proxy_add_x_forwarded_for;#配置 X‐Forwarded‐For
    
    proxy_connect_timeout 30; 
    proxy_send_timeout 60; 
    proxy_read_timeout 60;    
    
    proxy_buffering on;    
    proxy_buffer_size 32k;
    proxy_buffers 4 128k;

    配置代理

    [root@lb01 conf.d]# vim web.oldboy.com.conf 
    
    server {
            listen 80;
            server_name web.oldboy.com;
    
    
        location / {
        proxy_pass http://10.0.0.8:80;
        include proxy_params;
        }
    
    
    }
    
    [root@lb01 conf.d]# nginx -t
    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /etc/nginx/nginx.conf test is successful
    [root@lb01 conf.d]# systemctl res
    rescue        reset-failed  restart       
    [root@lb01 conf.d]# systemctl restart nginx
    

    lb02:

    统一将proxy定义的配置存放到proxy_params中,便于调用

    [root@lb02 ~]# cd /etc/nginx/conf.d/
    [root@lb02 conf.d]# vim /etc/nginx/proxy_params
    
    proxy_http_version 1.1;
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;#配置X-Real-IP
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;#配置X-Forward-For
    
    proxy_connect_timeout 30;
    proxy_send_timeout 60;
    proxy_read_timeout 60;
    
    proxy_buffering on;
    proxy_buffer_size 32k;
    proxy_buffers 4 128k;
    
    [root@lb02 conf.d]# vim web.oldboy.com.conf
    
    server {
            listen 80;
            server_name web.oldboy.com;
    
    
        location / {
        proxy_pass http://10.0.0.9:80;
        include proxy_params;
        }
    
    
    }
    
    [root@lb02 conf.d]# nginx -t
    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /etc/nginx/nginx.conf test is successful
    [root@lb02 conf.d]# systemctl restart nginx

    lb03:

    统一将proxy定义的配置存放到proxy_params中,便于调用

    [root@lb03 ~]# cd /etc/nginx/conf.d/
    [root@lb03 conf.d]# vim /etc/nginx/proxy_params
    
    proxy_http_version 1.1;
    proxy_set_header Host $http_host;
    proxy_set_header X‐Real‐IP $remote_addr; #配置X‐Real‐IP
    proxy_set_header X‐Forwarded‐For $proxy_add_x_forwarded_for;#配置 X‐Forwarded‐For
    
    proxy_connect_timeout 30;
    proxy_send_timeout 60;
    proxy_read_timeout 60;
    
    proxy_buffering on;
    proxy_buffer_size 32k;
    proxy_buffers 4 128k;
    
    [root@lb03 conf.d]# vim web.oldboy.com.conf
    
    server {
            listen 80;
            server_name web.oldboy.com;
    
    
        location / {
        proxy_pass http://10.0.0.5:80;
        include proxy_params;
        }
    
    
    }
    
    [root@lb03 conf.d]# nginx -t
    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /etc/nginx/nginx.conf test is successful
    [root@lb03 conf.d]# systemctl restart nginx

    web:

    [root@web ~]# cd /etc/nginx/conf.d/
    [root@web conf.d]# vim web.oldboy.com.conf
    
    server {
            listen 80;
            server_name web.oldboy.com;
    
    
        location / {
                root /code;
                index index.html;
        }
    
    
    }
    
    [root@web conf.d]# nginx -t
    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /etc/nginx/nginx.conf test is successful
    [root@web conf.d]# echo "10.0.0.5-web" > /code/index.html
    [root@web conf.d]# systemctl restart nginx
    
    [root@web conf.d]# vim /etc/nginx/nginx.conf # 为方便查看日志,将web端的记录日志格式修改下
    
      log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for""$http_x_real_ip"';
    
    打开windows的C:windows\System32\drivers\etc\hosts,配置10.0.0.7   web.oldboy.com.

    完了以后可以在cmd中检查一下是否解析的是来自10.0.0.7的。

    如图所示:由10.0.0.2(user)-->10.0.0.7-->10.0.0.8-->10.0.0.9-->10.0.0.5(web server)

    [root@web conf.d]# tail -f /var/log/nginx/access.log
    
    10.0.0.9 - - [02/Jun/2019:11:54:54 +0800] "GET / HTTP/1.1" 200 13 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36" "10.0.0.7""10.0.0.7"

    综上所述:X-Real-ip 只显示出上一级代理,不显示用户真实ip

    ​ X-Forwarded-For 显示所有经过路径的ip。

    转载于:https://www.cnblogs.com/longren/p/10962679.html

    展开全文
  • proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 通过这种这种方式,将客户端源ID地址设置到X-Real-IP中。 完整设置如下: ...

    这里是如果没设置这个头,在Nignx反向代理后,Java web那边获取的地址,基本上是Nginx那个应用所处的IP地址!

    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    通过这种这种方式,将客户端源ID地址设置到X-Real-IP中。

    完整设置如下:

     

    展开全文
  • 特殊的Header头X-Forwarded-ForX-Real-IP其他 header 头End-to-end 和 Hop-by-hopEnd-to-end 端到端头部Hop-by-hop 逐跳首部 X-Forwarded-For 存储客户端 ip 和反向 dai li IP 列表,以逗号+空格分隔 记录最后直连...


    X-Forwarded-ForX-Real-IP只有请求存在dai li时才有值

    X-Forwarded-For

    记录dai li 服务器的地址,每经过一个dai li,该字段会加上一个记录,由于是记录来源地址,所以该字段不会保存最后一个dai li 服务器的地址

    • 存储客户端 ip 和反向 dai li IP 列表,以逗号+空格分隔
    • 记录最后直连实际服务器之前的整个 dai li 过程
    • 可能会被伪造 ip,但是直连实际服务器这段不会被伪造

    图示:
    在这里插入图片描述
    可以看到,第一层 dai li ,其存储了客户端的 IP,第二层 dai li 追加了 第一层的dai li 的IP(proxy_ip1),但并没有保存自己的proxy_ip2。

    X-Real-IP

    也是用来记录服务器的地址,但是和上面的不同,它不把记录添加到结尾,而是直接替换。

    • 请求实际服务器的 IP
    • 每过一层 dai li 都会被覆盖掉,只需第一层设置 dai li
    • IP可以被伪造,但如果存在一级以上的 dai li,它就不会收到影响,因为每经过一次dai li,它就会被覆盖

    图示:
    在这里插入图片描述

    第一层 dai li 已经拿到了真实的 ip,并在 header 中设置了 X-Real-IP,因此第二层 dai li 不需要再去设置 X-Real-IP,只需要做转发就可以

    remote_addr

    表示上一个客户端连接的地址,不存在 dai li 就表示客户端的地址,存在 dai li 就表示最后一个 dai li 服务器的地址

    • remote_addr无法伪造,
    • remote_addr 字段不是通过请求头来决定的,而是服务端在建立tcp连接时获取的的客户端地址

    可以这样理解,因为建立 TCP 连接需要三次握手,如果伪造了源 IP,无法建立 TCP 连接,更不会有后面的 HTTP 请求

    Go 中可以通过 req.RemoteAddr 代码获取请求地址的 ip,

    End-to-end 和 Hop-by-hop

    End-to-end 端到端头部

    • 此类头部字段会转发给 请求/响应 的最终接收目标。
    • 必须保存在由缓存生成的响应头部。
    • 必须被转发。

    Hop-by-hop 逐跳首部

    • 此类头部字段只对单次转发有效。会因为转发给缓存dai li 服务器而失效。
    • HTTP 1.1 版本之后,如果要使用 Hop-by-hop 头部字段则需要提供 Connection 字段。

    除了一下 8 个字段为逐跳字段,其余均为端到端字段。

    • Connection
    • Keep-Alive
    • Proxy-Authenticate
    • Proxy-Authenrization
    • Trailer
    • TE
    • Tranfer-Encoding
    • Upgrade

    其他 header 头

    • Connection——标记请求连接是长连接还是短连接,或者说已关闭;http1.1 后默认是从长连接,该字段的值为:keep-alive
    • TE——HTTP 请求头字段,传输编码的优先级,固定值:TE: trailers,deflate
    • Trailer——HTTP 响应头字段,用户说明传输中分块编码的编码信息,固定值 Trailer: Max-Forwards

    更多 header 头

    参考:
    End-to-end、Hop-by-hop

    展开全文
  • 在做检测产品的时候,碰到了X-Forwarded-For和X-Real-IP这两个HTTP头部字段,这两个一直稀里糊涂的,专门针对两个字段进行了分析和理解。 代理的区分 反向代理和正向代理 企业服务器以集群方式进行部署,并通过负载...
  • X-Forwarded-For 在多级代理中,X-Forwarded-For用于记录从客户端地址到最后一个代理服务器的所有地址。 X-Real-Ip用于记录请求的客户端地址。
  • Nginx添加x-real-ip

    千次阅读 2020-03-22 20:49:50
    方法:启用ngx_http_realip_module。官方文档
  • X-Forwarded-For 在使用nginx做反向代理时,我们为了记录整个的代理过程,我们往往会在配置文件中做如下配置: location / { 省略... proxy_set_header X-Forwarded-For $proxy_add_x_for...
  • X-Forwarded-For 和 X-Real-IP 的区别

    万次阅读 2018-08-06 16:10:15
    X-Forwarded-For是用于记录代理信息的,每经过一级代理(匿名代理除外),代理服务器都会把这次请求的来源IP追加在X-Forwarded-For中   X-Real-IP,一般只记录真实发出请求的客户端IP...
  • X-Forwarded-For是用于记录代理信息的,每经过一级代理(匿名代理除外),代理服务器都会把这次请求的来源IP追加在X-Forwarded-For中来自4.4.4.4的一个请求,header包含这样一行X-Forwarded-For: 1.1.1.1, 2.2.2.2, ...
  • X-Forwarded-For 和 X-Real-IP 的区别?

    万次阅读 2017-12-01 15:52:54
    一般来说,X-Forwarded-For是用于记录代理信息的,每经过一级代理(匿名代理除外),代理服务器都会把这次请求的来源IP追加在X-Forwarded-For中 来自4.4.4.4的一个请求,header包含这样一行 X-Forwarded-For: 1.1....
  • 在使用nginx做反向代理时,我们为了记录整个的代理过程,我们往往会在配置文件中做如下配置: location / {  省略...  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  ...
  • 背景:只有一层nginx,获取真实ip。防止伪造 nginx 配置 server { listen 443 ssl; server_name localhost; ssl_certificate server.crt; #ssl_certificate cert.pem; ssl_certificate_key server.key; #ssl...
  • 表示发出请求的远程主机的 IP 地址,remote_addr代表客户端的IP,但它的值不是由客户端提供的,而是服务端根据客户端的ip指定的,当你的浏览器访问某个网站时,假设中间没有任何代理,那么网站的web服务器(Nginx,...
  • proxy_set_header X-Real-IP

    2016-09-29 15:13:00
    proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 转载于:...
  • 反向代理与 Real-IPX-Forwarded-For

    万次阅读 多人点赞 2017-01-16 08:37:36
    3.配合realip模块从X-Forwarded-For也可以获取到真实客户端IP。   在整个反向代理链条的第一个反向代理可以不配置“proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for”,否则客户端可以伪造X-...
  • 如果结构里有个反向代理,那后端机器的日志记录的就会是代理的ip,真实的ip看不到了,后端代码可以通过在header里设置真实ip来解决,nginx加入下面一段即可: proxy_set_header X-Real-IP $remote_addr;后端通过X-...
  • 本文是「4.4 接入层限流」节中的「按照IP限制并发连接数配置示例」部分需要了解的内容。 当我们访问互联网上的服务时,大多数时,客户端并不是直接访问到服务端的,而是客户端首先请求到反向代理,反向代理再转发...
  • 以下是转载内容: 内容来源:https://www.cnblogs.com/diaosir/p/6890825.html ... remote_addr 客户端的IP,如果有代理的话表示最后一个代理服...
  • nginx-负载均衡-realIP

    千次阅读 2016-04-21 13:44:31
    在实际应用中,我们可能需要获取用户的ip地址,比如做异地登陆的判断,或者统计ip访问次数等,通常情况下我们使用request.getRemoteAddr()就可以获取到客户端ip,但是当我们使用了nginx作为反向代理后,使用request....
  • 如果访问的服务器有CDN,那么CDN会获取到用户的真实IP,将用户的真实IP封装到X-Forwarded-For中,在设置到X-Real-IPX_Forwarded_For:根据访问顺序,依次添加IP地址,也就是记录代理信息 X_Real_IP:一般只记录...
  • 当一个请求通过多个代理服务器时,用户的IP将会被代理服务器IP覆盖 #在第一个代理服务器中设置 set x_real_ip=$remote_addr #最后一个代理服务器中获取 $x_real_ip=IP1 part2:解决方案2 X-Forwarded-For $proxy_...
  • 开发的应用怎么拿到客户端的真实IP呢?在网上看到java方法用来获取客户端真实IP的方法 ... * 可是,如果通过了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP值 * * @ret...
  • 那为什么 Web 服务器只有通过 X-Forwarded-For 头才能获取真实的 IP?这里用 PHP 语言来说明,不明白原理的开发者为了获取客户 IP,会使用 $_SERVER['REMOTE_ADDR'] 变量,这个服务器变量表示和 ...
  • <hr/>在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr()...如果使用了反向代理软件,用 request.getRemoteAddr()方法获取的IP地址是:127.0.0.1或 192.168.1.110,而并不是客户端的真实...
  • 如果你的服务器有用Nginx做负载均衡的话,你需要在你的location里面配置X-Real-IPX-Forwarded-For请求头: location ^~ /your-service/ { proxy_set_header X-Real-IP $remote_addr; pro
  • 进过nginx的反向代理之后,我们在服务端获取$_SERVER['HTTP_X_FORWARDED_FOR']或者$_SERVER['HTTP_X_REAL_IP']时,往往获取不到客户端的外网ip地址,此时需要在做反向代理时设置: location / { proxy_pass ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 80,306
精华内容 32,122
关键字:

x-real-ip