Nginx搭配Cloudflare与Shoutcast如何获取客户端真实IP?
解决Shoutcast显示代理IP而非真实客户端IP的问题
我明白你的困扰——反向代理(Cloudflare + Nginx)把真实客户端IP给“藏”起来了,导致Shoutcast只能看到服务器自身或者Cloudflare的IP,没法区分独立听众。下面是一步步的解决方案:
1. 让Nginx正确识别Cloudflare转发的真实客户端IP
因为Cloudflare作为前置代理,Nginx默认拿到的$remote_addr是Cloudflare的节点IP,不是用户的真实IP。我们需要先配置Nginx信任Cloudflare的IP段,并从Cloudflare的专属头里提取真实IP。
打开你的Nginx主配置文件(比如/etc/nginx/nginx.conf),在http块中添加以下内容:
# 信任Cloudflare的IP段(当前为2024年官方公布的IP段) set_real_ip_from 173.245.48.0/20; 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 141.101.64.0/18; set_real_ip_from 108.162.192.0/18; set_real_ip_from 190.93.240.0/20; set_real_ip_from 188.114.96.0/20; set_real_ip_from 197.234.240.0/22; set_real_ip_from 198.41.128.0/17; set_real_ip_from 162.158.0.0/15; set_real_ip_from 104.16.0.0/13; set_real_ip_from 104.24.0.0/14; set_real_ip_from 172.64.0.0/13; set_real_ip_from 131.0.72.0/22; # 从Cloudflare的CF-Connecting-IP头获取真实客户端IP real_ip_header CF-Connecting-IP;
2. 配置Nginx反向代理时传递真实IP给Shoutcast
接下来修改你的Nginx server配置块(就是你提到的代理到mypi:8000的那个配置),添加代理头,把真实IP传递给Shoutcast:
server { # 你的原有配置(比如server_name、listen端口等) location / { proxy_pass http://mypi:8000; # 传递真实客户端IP相关头 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }
3. 让Shoutcast启用转发IP支持
最后修改Shoutcast的配置文件(通常是sc_serv.conf),添加一行启用转发IP的选项:
ForwardedIP=1
这个配置会让Shoutcast优先读取X-Forwarded-For头里的IP,而不是直接连接它的代理IP。
4. 重启服务验证效果
执行以下命令重启Nginx和Shoutcast,使配置生效:
sudo systemctl restart nginx # 替换成你的Shoutcast重启命令,比如: sudo systemctl restart shoutcast
之后再查看Shoutcast的连接列表,应该就能看到每个听众的真实IP了。
额外注意事项
- 确保Cloudflare的域名代理状态是橙色云朵(已代理),只有这样Cloudflare才会传递
CF-Connecting-IP头 - 如果你的Shoutcast版本非常老旧,
ForwardedIP选项可能不存在,建议升级到最新稳定版 - 定期检查Cloudflare的官方IP段,确保
set_real_ip_from里的地址是最新的
内容的提问来源于stack exchange,提问作者Robin
相关产品推荐
相关产品推荐

