nginx

I. 主理人说

利用 real_ip_header 模块&X-Forwarded-For HTTP 请求头字段,获取来访用户真实IP;

II. CDN或反向代理(介绍)

CDN.jpg

Cloudflare 的工作原理是什么?

反向代理在电脑网络中是代理服务器的一种。服务器根据客户端的请求,从其关系的一组或多组后端服务器(如Web服务器)上获取资源,然后再将这些资源返回给客户端,客户端只会得知反向代理的IP地址,而不知道在代理服务器后面的服务器集群的存在1

与前向代理不同,前向代理作为客户端的代理,将从互联网上获取的资源返回给一个或多个的客户端,服务端(如Web服务器)只知道代理的IP地址而不知道客户端的IP地址;而反向代理是作为服务器端(如Web服务器)的代理使用,而不是客户端。客户端借由前向代理可以间接访问很多不同互联网服务器(集群)的资源,而反向代理是供很多客户端都通过它间接访问不同后端服务器上的资源,而不需要知道这些后端服务器的存在,而以为所有资源都来自于这个反向代理服务器。

反向代理在现时的互联网中并不少见,而另一些例子,像是CDN、SNI代理等,是反向代理结合DNS的一类延伸应用。

via 反向代理

III. X-Forwarded-For(介绍)

x-forwarded-for CDN-负载均衡-反向代理 .png

x-forwarded-for.png

X-Forwarded-For: 来访者真实IP, 代理服务器1-IP, 代理服务器2-IP, ...

X-Forwarded-For (XFF) 在客户端访问服务器的过程中如果需要经过HTTP代理(例如反向代理)或者负载均衡服务器,可以被用来获取最初发起请求的客户端的IP地址,这个消息首部成为事实上的标准。在消息流从客户端流向服务器的过程中被拦截的情况下,服务器端的访问日志只能记录代理服务器或者负载均衡服务器的IP地址。如果想要获得最初发起请求的客户端的IP地址的话,那么 X-Forwarded-For 就派上了用场。

这个消息首部会被用来进行调试和统计,以及生成基于位置的定制化内容,按照设计的目的,它会暴露一定的隐私和敏感信息,比如客户端的IP地址。所以在应用此消息首部的时候,需要将用户的隐私问题考虑在内。

HTTP 协议中的 Forwarded 是这个消息首部的标准化版本。

X-Forwarded-For也是一个电子邮件相关协议中用到的首部,用来表示一封电子邮件是从其他账户转发过来的。

via X-Forwarded-For

IV. 为你的NGINX动态安装 realip 模块(操作)

real-ip-nginx.png

ngx_http_realip_module;

使用realip 功能需要 Nginx 添加 ngx_http_realip_module 模块,默认情况下是不被编译,如果需要添加,请在编译时添加 --with-http_realip_module 选项开启它。

如果你已经安装nginx,那么可以根据这篇文章 在现有基础上加装 ngx_http_realip_module 模块;

1.知晓你现在安装的模块及nginx版本(包含 ./configure 编译参数配置);
2.下载 nginx 相应版本源码;
3.编译时增加 --with-http_realip_module;

编译参数及示例如下

./configure --prefix=/usr/local/openresty/ --with-http_stub_status_module --with-luajit --with-http_iconv_module --with-http_postgres_module --with-stream --with-http_v2_module --with-http_realip_module --with-http_sub_module --with-http_geoip_module --with-http_gzip_static_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-http_ssl_module

V. NGINX配置(示例)

@> Cloudflare 将原始访问者 IP 地址包含在 X-Forwarded-ForCF-Connecting-IP 标头中。
这些标头可以恢复访问者的原始 IP 或将它们包含在您的日志中。
不过,配置过程视您使用的 Web 服务器类型而异。

在域名配置文件的 server 配置段内添加相应设置:博主的配置文件如下:

server
{
listen 443 ssl http2;
listen [::]:80;
server_name limbopro.xyz;

set_real_ip_from 103.21.244.0/22;
set_real_ip_from 103.22.200.0/22;
set_real_ip_from 103.31.4.0/22;
set_real_ip_from 104.16.0.0/12;
set_real_ip_from 108.162.192.0/18;
set_real_ip_from 131.0.72.0/22;
set_real_ip_from 141.101.64.0/18;
set_real_ip_from 162.158.0.0/15;
set_real_ip_from 172.64.0.0/13;
set_real_ip_from 173.245.48.0/20;
set_real_ip_from 188.114.96.0/20;
set_real_ip_from 190.93.240.0/20;
set_real_ip_from 197.234.240.0/22;
set_real_ip_from 198.41.128.0/17;
set_real_ip_from 2400:cb00::/32;
set_real_ip_from 2606:4700::/32;
set_real_ip_from 2803:f800::/32;
set_real_ip_from 2405:b500::/32;
set_real_ip_from 2405:8100::/32;
set_real_ip_from 2c0f:f248::/32;
set_real_ip_from 2a06:98c0::/29;
real_ip_header CF-Connecting-IP; 
#real_ip_header    X-Forwarded-For;
#real_ip_recursive on;

因为 Cloudflare 将原始访问者 IP 地址包含在 X-Forwarded-ForCF-Connecting-IP 标头中,所以你可以选择使用

real_ip_header CF-Connecting-IP; 

real_ip_header X-Forwarded-For;
real_ip_recursive on;

博主个人推荐使用前一种;

其中 set_real_ip_from 后面的IP段是 Cloudflare 全球CDN节点
最新的IP段可参考 https://www.cloudflare.com/zh-cn/ips/

via 按照 Web 服务器类型恢复访问者 IP

重启 NGINX,即可在日志里看到真实用户IP了;

以上。

VI. 附注

RFC 7239
Cloudflare 按照 Web 服务器类型恢复访问者 IP
Module ngx_http_realip_module
X-Forwarded-For
Cloudflare 如何处理 HTTP 请求标头?
Cloudflare帮助中心

最后修改:2021 年 05 月 19 日 08 : 22 AM