Nginx中自带GeoIP模块可以屏蔽指定IP的请求,只不过默认没有被编译,打开以后我们只要再下载一个IP规则就行,Nginx服务器中配置GeoIP模块来拦截指定国家IP:
编译 GeoIP 组件
# cd /usr/local/src # wget http://geolite.maxmind.com/download/geoip/api/c/GeoIP.tar.gz # ./configure # make # make install
刚才安装的库自动安装到 /usr/local/lib 下,所以这个目录需要加到动态链接配置里面以便运行相关程序的时候能自动绑定到这个 GeoIP 库:
# echo '/usr/local/lib' > /etc/ld.so.conf.d/geoip.conf # ldconfig
下载IP库
# wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz # gunzip GeoIP.dat.gz # wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz # gunzip GeoLiteCity.dat.gz
编译 Nginx
nginx默认不编译这个模块,需要开启–with-http_geoip_module编译选项。
模块依赖MaxMind GeoIP库。
配置 Nginx
接下来就需要配置 Nginx,首先需要在 Nginx 配置文件中的 http 区块中加载 GeoIP 的数据包:
geoip_country GeoIP.dat; geoip_city GeoLiteCity.dat;
禁止国家访问
只需要在网站的 Nginx 配置中加入下面的示例的代码:
if ($geoip_country_code = CN) { deny all; }
上面的配置表示只要是国内的 IP,就拒绝访问。
GeoIP 组件配置项参考
GeoIP 中跟国家相关的变量
$geoip_country_code #两位字符的英文国家码。如:CN, US $geoip_country_code3 #三位字符的英文国家码。如:CHN, USA $geoip_country_name #国家英文全称。如:China, United States
GeoIP 中跟省份相关的变量:
CN,01,”Anhui” CN,02,”Zhejiang” CN,03,”Jiangxi” CN,04,”Jiangsu” CN,05,”Jilin” CN,06,”Qinghai” CN,07,”Fujian” CN,08,”Heilongjiang” CN,09,”Henan” CN,10,”Hebei” CN,11,”Hunan” CN,12,”Hubei” CN,13,”Xinjiang” CN,14,”Xizang” CN,15,”Gansu” CN,16,”Guangxi” CN,18,”Guizhou” CN,19,”Liaoning” CN,20,”Nei Mongol” CN,21,”Ningxia” CN,22,”Beijing” CN,23,”Shanghai” CN,24,”Shanxi” CN,25,”Shandong” CN,26,”Shaanxi” CN,28,”Tianjin” CN,29,”Yunnan” CN,30,”Guangdong” CN,31,”Hainan” CN,32,”Sichuan” CN,33,”Chongqing”
GeoIP 中跟国家下级区域相关的变量:
$geoip_city_country_code #也是两位字符的英文国家码。 $geoip_city_country_code3 #上同 $geoip_city_country_name #上同. $geoip_region #这个经测试是两位数的数字,如杭州是02, 上海是 23。 $geoip_city #城市的英文名称。如:Hangzhou $geoip_postal_code #城市的邮政编码。经测试,国内这字段为空 $geoip_city_continent_code #不知什么用途,国内好像都是AS $geoip_latitude #纬度 $geoip_longitude #经度
查询IP信息
geoiplookup x.x.x.x
查询IP所在经纬度
geoiplookup -f GeoLiteCity.dat x.x.x.x