背景

  最近在查看 matomo 后台访问日志时发现Matomo后台显示的访客IP和实际的Client IP不一致。

Matomo 使用 CDN 后无法正确获取访客 Client 真实 IP插图

检查

  通过直接访问该IP,发现该IP竟然会返回 404 状态码,然后去腾讯云CDN控制台使用 IP 归属查询工具,发现该 IP 是腾讯云的CDN节点 IP。为了保证统计网站访问速度,所以使用了CDN服务。

Matomo 使用 CDN 后无法正确获取访客 Client 真实 IP插图1

  前往腾讯云CDN控制台查看该域名的回源设置,发现已经设置了Tencent-Acceleration-Domain-Name参数,Tencent-Acceleration-Domain-Name 参数会自动携带X-Forwarded-For and X-Forwarded-Proto参数回源。

  理论来说,配置该参数之后可以正常获取Client IP 信息,但是在 matomo 并未生效。

  在谷歌搜索一番找到 Stack Overflow 网站的相关问答结果

  答案如下:

The realip_module states that in case of X-Forwarded-For, this module uses the last ip address in the X-Forwarded-For header for replacement. This module will not work when only real_ip_header and set_real_ip_form are set. This is because this module will use a proxy IP address instead of a client IP. To solve this real_ip_recursive directive should be enabled.

Matomo 使用 CDN 后无法正确获取访客 Client 真实 IP插图2

  从答案得知,需要修改 Nginx 主配置文件,并添加real_ip_recursive指令。

real_ip_header X-Forwarded-For;
real_ip_recursive on;
set_real_ip_from 0.0.0.0/0;
set_real_ip_from ::/0;

  set_real_ip_from需要使用CIDR表示法,0.0.0.0/0代表匹配所有 IPv4 地址,::/0或者0::0/0代表匹配所有 IPv6 地址。

  将以上配置内容添加至 Nginx 主配置文件下的http字段内保存并重启 Nginx 即可正常获取Client IP。

Matomo 使用 CDN 后无法正确获取访客 Client 真实 IP插图3

再次测试

此时测试Client IP 获取与本机 IP 一致,问题解决!

Matomo 使用 CDN 后无法正确获取访客 Client 真实 IP插图4
Matomo 使用 CDN 后无法正确获取访客 Client 真实 IP插图5

原文地址:https://www.afengblog.com/matomo-cdn-obtains-the-users-real-ip.html