事情的背景是之前为了方便在公用电脑上阅读,在私人网盘上存了几本 O'Reilly 动物书的 PDF 文件,但是没想到被搜索引擎收录,于是最近收到了 O'Reilly 的 DMCA 邮件(估计邮箱是从域名注册商拿到的),因此为了在不妨碍自己使用资源的前提下规避问题,选择阻止中国以外 IP 访问该目录下的资源。
这里使用了 Nginx 的 GeoIP 拓展(ngx_http_geoip_module),在标准版的 Nginx 中我们需要重新把拓展编译进去,但是我使用的 Tengine 可以直接加载动态模块(原版也能直接动态加载模块了)。
首先安装 nginx-module-geoip:
sudo apt-get install nginx-module-geoip
然后下载 IP 数据库并解压,可将解压出来的 GeoIPv6.dat
文件放到你喜欢的任何地方:
# DAT 版数据库官方已不再提供下载,下面的链接是祖传备份
# 详见:https://dev.maxmind.com/geoip/legacy/downloadable/
wget https://cloud.moezx.cc/mirrors/geoip/database/GeoIPv6.dat.gz
gzip -d -k GeoIPv6.dat.gz
# GeoIPv6.dat 覆盖了 IPv4 和 IPv6 的数据,如果仅需 IPv4,使用下面这个文件
wget https://cloud.moezx.cc/mirrors/geoip/database/GeoIP.dat.gz
然后需要下载并编译 ngx_http_geoip_module 模块,编译完成后nginx.conf
中加入如下部分:
# 引入二进制库(仅适用于 Tengine 2.3.0 之前版本,之后版本已移除 dso 指令)
dso {
load ngx_http_geoip_module.so;
}
# 引入二进制库(适用于原版 Nginx 以及 Tengine 2.3.0 之后版本)
load_module ngx_http_geoip_module.so;
# http 块下添加如下初始化代码
http {
···
geoip_country /path/to/GeoIPv6.dat;
# 排除对 CDN 等代理服务器的过滤(下面都是 Cloudflare 的服务器 IP)
geoip_proxy 103.21.244.0/22;
geoip_proxy 103.22.200.0/22;
geoip_proxy 103.31.4.0/22;
geoip_proxy 104.16.0.0/12;
geoip_proxy 108.162.192.0/18;
geoip_proxy 131.0.72.0/22;
geoip_proxy 141.101.64.0/18;
geoip_proxy 162.158.0.0/15;
geoip_proxy 172.64.0.0/13;
geoip_proxy 173.245.48.0/20;
geoip_proxy 188.114.96.0/20;
geoip_proxy 190.93.240.0/20;
geoip_proxy 197.234.240.0/22;
geoip_proxy 198.41.128.0/17;
geoip_proxy 2400:cb00::/32;
geoip_proxy 2405:8100::/32;
geoip_proxy 2405:b500::/32;
geoip_proxy 2606:4700::/32;
geoip_proxy 2803:f800::/32;
geoip_proxy 2c0f:f248::/32;
geoip_proxy 2a06:98c0::/29;
geoip_proxy_recursive on;
···
}
之后就可以在 Server 块中控制访问权限了:
# 写法一:允许部分地区访问
server {
···
set $where_are_you_from 0;
if ($geoip_country_code = CN) {
set $where_are_you_from 1;
}
location /Document/ {
default_type text/html;
charset utf-8;
if ($where_are_you_from = 0) {
return 200 'This resource is not available in your country!';
}
}
···
}
# 写法二:禁止部分地区访问
# 设置变量 $disallowed_country
map $geoip_country_code $disallowed_country {
default no;
US yes;
CN no;
}
server {
···
location /Document/ {
default_type text/html;
charset utf-8;
if ($disallowed_country) {
return 200 'This resource is not available in your country!';
}
}
···
}
学会了吗?
「樱花庄的白猫」原创文章:《Nginx + GeoIP 区分用户 IP 归属国》,转载请保留出处!https://2heng.xin/2019/05/11/blocking-country-and-continent-with-nginx-geoip/
Q.E.D.
Comments | 38 条评论
博主 云影
怎么屏蔽某省访问?
博主 coc的世界
qwq
博主 アフリカ提督
其他封ip的网站也是这么操作的吗?
博主 King.
ORZ
博主 嘿嘿
博主 该账号已被封
博主 come Round
太牛逼
博主 便携式乌托邦
涨知识
博主 y
wow!
博主 repostone
字与背景区别不大,看起来费劲。
博主 Clown
@repostone 我能说。。事真多么。。。
博主 Clown
@repostone 我再来试试
博主 奶爸de笔记
今天才有人给我说可以用这个拦截地区访问。
博主 Mashiro
@奶爸de笔记 不单可以拦截访问,还能用来给不同地区的访客展示不同页面
博主 奶爸de笔记
@Mashiro 这就很厉害了
博主 IIJ
我好像国内直连也显示由于版权原因本资源禁止非中国 IP 访问.
博主 Mashiro
@IIJ 发现原因了,好像IP库没有IPv6的数据。。
博主 Mashiro
@IIJ IPv6的问题已经解决了
博主 IIJ
@Mashiro 腻害
博主 578798659
大佬,你的博客渲染有点慢
博主 小麦片
@578798659 不不,大佬,您的浏览器升级一下应该可以的
博主 iVampireSP
终于更新了!
(`・ω・´)
博主 蝉時雨
律师函警告 ⚠
博主 Mashiro
@蝉時雨 DMCA 是美国法律,对不起这里是 PRC
博主 Prettyc
WoW