嘟嘟社区

关于nginx回源IP和访客真实IP


nginx中,

使用
set_real_ip_from 0.0.0.0/0;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
来获取访客真实IP,

但是,
deny ip;
allow ip;

这里的IP依然是指回源IP,而不是访客真实IP,

我的理解正确吗?

比如网站套了cf,如果只允许cf IP回源,用allow cloudflare IP加上deny all即可;
但是如果要禁止某个特定IP访问网站,deny ip是没有意义的。。。

我的理解正确吗?

被chatgpt搞懵逼了,特来问问吊打的mjj。。。

chatgpt出来,这里有客户投诉你的回答不清楚
接入cf后想禁止某个ip就用cfapi或者cf的防火墙禁止,denyip应该就是cdn后的实际ip

Ducker69 发表于 2024-7-17 14:33
接入cf后想禁止某个ip就用cfapi或者cf的防火墙禁止,denyip应该就是cdn后的实际ip …

我不明白的是,deny IP这里的IP,到底是回源IP(比如cf的IP),还是访客的真实IP?

igoogle 发表于 2024-7-17 14:35
我不明白的是,deny IP这里的IP,到底是回源IP(比如cf的IP),还是访客的真实IP? …

我的理解是回源ip

本帖最后由 打酱油的 于 2024-7-17 15:05 编辑

https://www.opshub.cn/2024-05-22/nginx-get-the-real-ip-for-access-control-zw5foy-1413.html

Nginx 的 access 模块在进行访问控制时,默认使用的是$remote_addr​变量,该变量表示客户端的真实IP地址。如果 Nginx服务器 前面有还代理或负载均衡,那么$remote_addr​取得的则是上一跳设备的IP。

结合你的场景,你用 access 模块做访问控制,并不能直接拒绝或者允许某个真实IP,因为 $remote_addr​ 取到的是上一跳设备IP,即CDN边缘节点IP,而不是真实IP。

打酱油的 发表于 2024-7-17 14:54
https://www.opshub.cn/2024-05-22/nginx-get-the-real-ip-for-access-control-zw5foy-1413.html

Nginx 的 …

还是mjj靠谱,沙雕chatgpt一会儿说东,一会儿说西。。。

igoogle 发表于 2024-7-17 20:12
还是mjj靠谱,沙雕chatgpt一会儿说东,一会儿说西。。。

……不要被误导了,nginx的realip模块会修改$remote_addr,所以access模块deny的就是cf通过xff回传的真实客户端ip

hanada 发表于 2024-7-17 21:37
……不要被误导了,nginx的realip模块会修改$remote_addr,所以access模块deny的就是cf通过xff回传的真实 …

你说的对,我刚才测试了,在配置了realip模块之后,$remote_addr传递的就是访客的真实IP,而不是cf或者前置代理的IP。

所以,如果配置了realip模块,就不能够再通过allow 和 deny来设置只允许cf IP回源了。

本帖最后由 hanada 于 2024-7-17 22:46 编辑

igoogle 发表于 2024-7-17 21:57
你说的对,我刚才测试了,在配置了realip模块之后,$remote_addr传递的就是访客的真实IP,而不是cf或者前 …

可以用geo+if来做

geo $realip_remote_addr $is_cf_ip {
  xxxx/xx 1;
  xxxx/xx 1;
  xxxx/xx 1;
  …
  default 0;
}

server {
….
if ( $is_cf_ip != 1 ) {
  return 444;
}
}