0

我一直在努力让这件事正常工作,但似乎无论我做什么,X-Country都会获得值“US”,因为这是X-Forwarded-To标题中最后一个 IP 地址的国家/地区。这是 Google 的负载平衡器之一。

我似乎也找不到很多在线正确配置的示例,我发现的大多数源代码都是针对 GeoIP v1 的。

文件 /usr/share/GeoIP/GeoLite2-Country.mmdb 存在,并且已经过验证,可以为我正在测试的 IP 地址返回正确的国家/地区。Sentry Python SDK 还根据标头中的第一个 IP 将 IP 地址解析为瑞典。

http {
    ...
    geoip2_proxy 130.211.0.0/22;
    geoip2_proxy 35.191.0.0/16;
    geoip2_proxy_recursive off;
    geoip2 /usr/share/GeoIP/GeoLite2-Country.mmdb {
        $geoip2_data_country_code default=SE country iso_code;
        auto_reload 5m;
    }
    ...
}

server {
    ...
    location / {
        ...
        proxy_set_header X-Country $geoip2_data_country_code;
        ...
    }
}

有任何想法吗?

如果我删除所有 GeoIP2 配置,这是 Nginx 变量的状态:

GET /foobar HTTP/1.1
remote_addr:              130.211.0.x
http_x_forwarded_for:     <my.real.ip>, 130.211.38.x
realip_remote_addr:       130.211.0.x
http_x_real_ip:           -
proxy_add_x_forwarded_for: <my.real.ip>, 130.211.38.x, 130.211.0.x

似乎没有任何组合set_real_ip_from等会分配任何变量,<my.real.ip>以便我可以使用它。

编辑:以下似乎可行,但我认为它可以欺骗:

    geoip2_proxy 0.0.0.0/0;
    geoip2_proxy_recursive on;
    geoip2 /usr/share/GeoIP/GeoLite2-Country.mmdb {
        $geoip2_data_country_code default=SE country iso_code;
    }

所以似乎我的geoip2_proxy声明在某种程度上是一个问题,但我不确定如何?

4

1 回答 1

0

因为 130.211.38.x 不属于 130.211.0.0/22 并且递归搜索被禁用,所以问题出现了。您应该启用 geoip2 递归搜索,并将 130.211.38.x IP 添加到 geoip2_proxy 指令,因为它实际上在链中代理您的请求:

geoip2_proxy 130.211.0.0/22;
geoip2_proxy 35.191.0.0/16;
geoip2_proxy 130.211.38.x/32;
geoip2_proxy_recursive on;

或者可能扩展 CIDR,在 geoip2_proxy 指令中描述从 130.211.0.0/22 到 130.211.0.0/16 (整个 GOOGLE-CLOUD 网络,正如 whois 所说):

geoip2_proxy 130.211.0.0/16;
geoip2_proxy 35.191.0.0/16;
geoip2_proxy_recursive on;
于 2021-04-03T17:23:44.967 回答