最新消息:

Nginx反向代理使用的一些坑(续)– GeoIP的那些事

工具 xunihao 627浏览 0评论

有一台反向代理服务器,反向代理被墙的服务,经常收到DMCA的邮件,要求删除侵权的资源。

刚开始直接在Nginx中通过判断$request_uri 对访问资源的URI过滤 ,对侵权的资源直接返回到首页

if ($request_uri ~* "(/hash/223db7ba26de51a69b3aaee8950b704a48651d98.html)|(/hash/4bbd3c4e29009b94be021bfbda33d7cc9b2f0e6d.html)") {
  return 301 https://$host;
}

但随着投诉越来越多,配置文件越加越长,不厌其烦,打算干脆禁止国外IP端的访问。

于是想到用Nginx的 ngx_http_geoip_module ,来增加GeoIP支持。

网上的一堆文档都是重新编译Nginx,通过–add-module 来增加 ngx_http_geoip_module。

其实从1.9.11起,Nginx就支持 Dynamic modules ,没必要重新编译Nginx。

由于安装Nginx时候,使用是官方的 yum仓库 安装,因此直接通过 yum -y install nginx-module-geoip 安装。

yum -y install nginx-module-geoip 会自动安装MaxMind 的GeoIP数据库,缺省安装路径:/usr/share/GeoIP/GeoIP.dat

在nginx.conf 主体部分(http同级)通过load_module 指令装载 ngx_http_geoip_module 的动态库,并用map指令映射设置变量。

error_log /etc/nginx/logs/error.log warn;
pid /etc/nginx/logs/nginx.pid;
...
load_module "modules/ngx_http_geoip_module.so";

map $geoip_country_code $allowed_country {
default no;
CN yes;
}
...

在对应主机的.conf中

if ($allowed_country = no) {
  return 400 ;
}

重启nginx,发现不管是国内IP还是国外IP都是400页面。

打印http_x_realiphttp_x_forwarded_forgeoip_country_code,发现如下结果:

http_x_realip:

http_x_forwarded_for: xxx.xxx.xxx.xxx

geoip_country_code: US

也就是客户端实际IP为空,http_x_forwarded_for为正确的客户端IP,geoip_country_code被判断为US。

琢磨了半天,突然想到,反向代理是套了CloudFlare的,反向代理服务器得到的IP地址是CloudFlare的。

Restoring original visitor IPs: logging visitor IP addresses 提到,要在CloudFlare后端服务器得到客户端实际IP,需要使用 ngx_http_realip_module 。

由于已经使用了ngx_http_geoip_module ,可以使用ngx_http_geoip_module 的 geoip_proxy 指令,将CloudFlare的IP段定义为可信代理trusted proxies。

CloudFlare的IP地址段:https://www.cloudflare.com/ips/

error_log /etc/nginx/logs/error.log warn;
pid /etc/nginx/logs/nginx.pid;
...
load_module "modules/ngx_http_geoip_module.so";

geoip_country /usr/share/GeoIP/GeoIP.dat;
geoip_proxy 173.245.48.0/20;
geoip_proxy 103.21.244.0/22;
geoip_proxy 103.22.200.0/22;
geoip_proxy 103.31.4.0/22;
geoip_proxy 141.101.64.0/18;
geoip_proxy 108.162.192.0/18;
geoip_proxy 190.93.240.0/20;
geoip_proxy 188.114.96.0/20;
geoip_proxy 197.234.240.0/22;
geoip_proxy 198.41.128.0/17;
geoip_proxy 162.158.0.0/15;
geoip_proxy 104.16.0.0/12;
geoip_proxy 172.64.0.0/13;
geoip_proxy 131.0.72.0/22;
map $geoip_country_code $allowed_country {
default no;
CN yes;
}
...

 

重启Nginx,生效了。

 

Nginx反向代理使用的一些坑系列文章:

Nginx反向代理使用的一些坑

Nginx反向代理使用的一些坑(续)–gzip/gunzip 与sub_filter的那些事

Nginx反向代理使用的一些坑(续)–gzip,br压缩算法 与sub_filter的那些事

Nginx反向代理使用的一些坑(续)– Cookie的那些事

转载请注明:虚拟号之家 » Nginx反向代理使用的一些坑(续)– GeoIP的那些事

发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址