首页 应用实战正文

ModSecurity配置GeoIP模块来拦截非指定国家的所有IP

王子 应用实战 2020-05-10 546 0

本文主要介绍,通过配置GeoIP模块,来使ModSecurity拦截非中国IP地址的访问。


一、前提介绍

GeoIP数据库目前有两种格式,GeoLite(.dat文件)与 GeoLite2(.mmdb文件)。ModSecurity v2需要使用.dat格式,ModSecurity v3则使用.mmdb格式。

.dat格式的GeoIP文件目前已不再更新,因此如果使用的是ModSecurity v2版本,我们则需要使用CSV文件来生成.dat格式的数据库,生成方法见本文第五节。


二、下载GeoIP数据库

点击此处可下载GeoLite2-Country.mmdb点击此处可下载GeoLite-Country.dat,下载完成后请放置在/usr/local/geoip/目录下。

上述数据库文件,其IP数据更新日期为2020-05-26,本人将不定期根据官网数据进行更新。

或前往https://www.maxmind.com/官网下载名称为“GeoLite2 Country”的数据库,下载后将压缩包解压,将其中的GeoLite2-Country.mmdb文件放置在/usr/local/geoip/目录下。账户注册及下载方法可参加文章http://www.modsecurity.cn/practice/post/15.html


三、配置GeoIP数据库

编辑crs-setup.conf文件,ModSecurity v3添加以下内容:

SecGeoLookupDB /usr/local/geoip/GeoLite2-Country.mmdb

ModSecurity v2添加以下内容:

SecGeoLookupDB /usr/local/geoip/GeoLite-Country.dat


四、配置规则

将以下规则,复制到REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf文件中,规则id如与自己编写的规则ID冲突,直接更改即可:

SecRule REMOTE_ADDR "@geoLookup" "chain,id:22,deny,phase:1,log,msg:'Non-China IP address'"
SecRule GEO:COUNTRY_CODE "!@rx CN|HK|TW|MO"

以上规则表示,仅允许中国的IP地址进行访问,其他国家的IP地址若访问网站,则直接阻断。

之所以同时使用CN、HK、TW、MO,是因为在ISO 3166-1标准中,CN仅代表中国内地,不包含港澳台,因此在此直接将港澳台的代码添加其中,如果只希望中国内地的IP地址进行访问,复制以下规则即可:

SecRule REMOTE_ADDR "@geoLookup" "chain,id:22,deny,phase:1,log,msg:'Non-CN IP address'"
SecRule GEO:COUNTRY_CODE "!@rx CN"


五、将CSV文件转为DAT格式的GeoIP数据库

首先,前往https://www.maxmind.com/下载名称为“GeoLite2 Country: CSV Format”数据库,并放置在/usr/local/geoip/目录下,账户注册及下载方法可参加文章http://www.modsecurity.cn/practice/post/15.html

然后,下载geolite2legacy,并进入下载后的文件夹中

cd /usr/local
git clone https://github.com/sherpya/geolite2legacy
cd geolite2legacy/

最后,执行以下命令,即可将CSV文件转为DAT格式的GeoIP数据库

./geolite2legacy.py -i /usr/local/geoip/GeoLite2-Country-CSV.zip -f geoname2fips.csv -o /usr/local/geoip/GeoLite-Country.dat

如若提示“ImportError: No module named ipaddr”,表示缺少ipaddr模块,通过pip安装即可,命令如下:

curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python get-pip.py
pip install ipaddr

安装成功后,重新执行转换命令即可。


六、其他

由于免费的GeoIP数据库会不定时更新,因此建议每半个月或一个月,重新下载新的GeoIP数据库进行配置,然后将WEB服务重新加载即可,文章中直接提供的数据库文件,本人也会不定期进行更新。

版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。