有一台反向代理服务器,反向代理被墙的服务,经常收到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_realip、http_x_forwarded_for、geoip_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反向代理使用的一些坑(续)–gzip/gunzip 与sub_filter的那些事
Nginx反向代理使用的一些坑(续)–gzip,br压缩算法 与sub_filter的那些事