• nginx的ngx_http_realip_module模块和http头X-Forwarded-For、X-Real-IP


    ngx_http_realip_module模块

    realip模块作用:当本机的nginx处于反向代理的后端时可以获取到用户的真实ip。可以让accesslog记录用户真实IP地址。

    set_real_ip_from IP1;
    real_ip_header X-Forwarded-For;
    real_ip_recursive on;
    
    • set_real_ip_from —— 设置反向代理服务器,即信任服务器IP
    • real_ip_header X-Forwarded-For —— 用户真实IP存在X-Forwarded-For请求头中
    • real_ip_recursive
      • off —— 会将real_ip_header指定的HTTP头中的最后一个IP作为真实IP
      • on —— 会将real_ip_header指定的HTTP头中的最后一个不是信任服务器的IP当成真实IP

    参考

    http头中的X-Forwarded-For(XFF)和X-Real-IP、Remote Address

    XFF位于HTTP请求头,是HTTP的扩展header,已经是事实上的标准。

    X-Forwarded-For用于表示HTTP请求端真实IP。
    格式如下:

    X-Forwarded-For: client, proxy1, proxy2
    

    nginx代理一般配置

    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-For $remote_addr; #不合理,nginx之前的代理信息都被抹掉
    

    说明:
    1、X-Forwarded-For:最后一节是nginx追加上去的,但前面部分来源于nginx收到的请求头,这部分内容完全不可信。符合IP格式的才可以使用,否则容易引发XSS或者SQL注入漏洞。
    2、Remote Address:HTTP协议没有IP的概念,Remote Address来自于TCP连接,表示与服务端建立TCP连接的设备IP,因此,Remote Address无法伪造。
    3、X-Real-IP:HTTP代理用于表示与它产生TCP连接的设备IP,可能是其他代理,也可能是真正的请求端。

    结论:
    1、直接对外提供服务的web应用,在进行与安全有关的操作的时候,只能通过Remote Address获取IP,不能相信任何请求头。
    2、使用nginx等web server进行反向代理的web应用,要使用X-Forwarded-For的最后一节或者 X-Real-IP来获取IP,同时还应该进行web应用直接对外提供服务。
    3、在与安全无关的场景,可以通过 X-Forwarded-For的靠前位置获取IP,但是需要校验IP的合法性。

  • 相关阅读:
    嵌入式框架Zorb Framework搭建五:事件的实现
    C#网络编程系列文章(五)之Socket实现异步UDP服务器
    C#SocketAsyncEventArgs实现高效能多并发TCPSocket通信 (服务器实现)
    C#中的ManagementClass类
    Etcd v3备份与恢复
    kubernetes调度重平衡工具 Descheduler
    K8S – 优化dns解析时间
    kubernetes备份和恢复
    Coredns部署更新
    认识Kubernetes Descheduler
  • 原文地址:https://www.cnblogs.com/amyzhu/p/9610056.html
Copyright © 2020-2023  润新知