realip模块

352 阅读2分钟

realip模块可以获取到用户的真实IP。

1、TCP四元组

TCP四元组:源IP、源端口、目标IP、目标端口。

2、为什么要使用realip模块获取用户真实ip,而不是直接获取呢?

当用户发出一个请求时,首先会经过运营商的公网,公网会将请求转发给CND,并在X-Forward-For中添加一个ip地址,为运营商的ip地址115.204.33.1,CDN中没有缓存ip对应的域名,便向目标地址请求,进入目标地址的反向代理,并在X-Forward-For中继续添加1.1.1.1,反向代理服务器将请求转发到nginx上,并在X-Forward-For中添加2.2.2.2,到nginx时,X-Forward-For的值已经变成了'115.204.33.1,1.1.1.1,2.2.2.2',它没有办法直接拿到用户在运营商那的地址11.5.204.33.1,所以才要使用realip模块。

3、如何使用realip模块

realip模块默认是不开启的,所以我们要使用--with-http_realip_module来开启重新编译nginx。

它的

4、如何使用真实ip

用户真实的ip是基于变量来使用的,所以我们可以使用realip_remote_iprealip\_remote\_ip、realip_remote_port来获取真实用户的ip和port,remote_addrremote\_addr和binary_remote_addr的值为X-Forward-For的值。

5、相关指令

  • set_real_ip_from:定义受信任的ip地址或者主机名,当这些地址发过来请求时,会直接从X-Forward-For中取用户的ip地址。
  • real_ip_header:定义从X-Forward-For、proxy_protocol还是X-Real_Ip中取用户真实的ip,默认是X-Real_Ip。因为X-Forward-For有多个ip,所以默认取最后一个。
  • real_ip_recursive:是否开启环回地址,默认是off,当改为on时,并且设置了set_real_ip_from时,因为set_real_ip_from设置了受信任的ip,所以当X-Forward-For最后一个ip为该受信任的ip时,$remote_addr会取倒数第二个ip。