当前位置:   article > 正文

深入理解nginx realip模块[下]

深入理解nginx realip模块[下]

深入理解nginx realip模块[上]
深入理解nginx realip模块[下]

3. 源码分析

3.1 配置指令分析

3.1.1 set_real_ip_from

    {
    ngx_string("set_real_ip_from"),
      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
      ngx_http_realip_from,
      NGX_HTTP_LOC_CONF_OFFSET,
      0,
      NULL },
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

  在以上配置指定引用的回调函数ngx_http_realip_from中,会将解析到的受信任的proxy地址存储到 rlcf->from数组里面。譬如以下代码:

    if (ngx_strcmp(value[1].data, "unix:") == 0) {
   
        cidr = ngx_array_push(rlcf->from);
        if (cidr == NULL) {
   
            return NGX_CONF_ERROR;
        }

        cidr->family = AF_UNIX;
        return NGX_CONF_OK;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

  将在解析到unix:的时候,会在数组里面添加一个family类型为 AF_UNIX的条目。
  对于IP/MASK表示的CDIR,则会解析cdir(同时支持ipv4和ipv6类型的地址)。
  对于域名,则nginx会调用ngx_inet_resolve_host来解析域名,需要注意的是,这个解析域名的操作是同步请求,如果解析域名的操作比较慢,有可能导致nginx启动的时候会卡住。解析出来的若干个IP地址将逐个被添加到rlcf->from数组中。

3.1.2 real_ip_header


    {
    ngx_string("real_ip_header"),
      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
      ngx_http_realip,
      NGX_HTTP_LOC_CONF_OFFSET,
      0,
      NULL },
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

  在以上配置指定引用的回调函数ngx_http_realip中,会解析客户端真实IP的来源类型,包括名字叫X-Real-IP、X-Forwarded-For标准HTTP头或者是自定义HTTP头,也可以指定proxy_protocol,利用proxy_protocol协议透传过来的客户端真实IP。
  源码如下:

static char *
ngx_http_realip(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
   
    ngx_http_realip_loc_conf_t *rlcf = conf;

    ngx_str_t  *value;

    if (rlcf->type != NGX_CONF_UNSET_UINT) {
   
        return "is duplicate";
    }

    value = cf->args->elts;

    if (ngx_strcmp(value[1].data, "X-Real-IP") == 0) {
   
        rlcf->type = NGX_HTTP_REALIP_XREALIP;
        return NGX_CONF_OK;
    }

    if (ngx_strcmp(value[1].data, "X-Forwarded-For") == 0) {
   
        rlcf->type = NGX_HTTP_REALIP_XFWD;
        return NGX_CONF_OK;
    }

    if (ngx_strcmp(value[1].data, "proxy_protocol") == 0) {
   
        rlcf->type = NGX_HTTP_REALIP_PROXY;
        return NGX_CONF_OK;
    }

	/* 这里预先计算在http请求头中进行查找的自定义HTTP头名字的哈希值 
	   对于 X-Real-IP和 X-Forwarded-For头࿰
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/390405
推荐阅读
相关标签
  

闽ICP备14008679号