nginx 에서 IP를 제한 하는 방법은 아래와 같다.
1 2 3 4 5 6 7 8 |
server { listen 80; root /path/dir/; location / { allow 111.111.111.111/32; deny all; } } |
허용된 IP 외에는 403 에러가 발생한다.
아래는 허용된 IP 및 특정한 국가 코드(KR,SG) 와 IP (111.111.111.111)를 허용 하는 방법이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
map $geoip_country_code $allowed_countrys { KR 1; SG 1; } geo $remote_addr $allowed_ips { 127.0.0.1 1; 111.111.111.111/32 1; } server { listen 80; root /path/dir/; location / { if ($allowed_countrys = 1) { set $allowed_ips "1"; } if ($allowed_ips != 1) { return 403; } } } |
위에서 map $geoip_country_code 를 활용하기 때문에 아래와 같이
nginx 에서 GeoIP.dat 를 불러와야 한다.
1 2 3 4 5 |
http { ....; geoip_country /usr/share/GeoIP/GeoIP.dat; ....; } |
GeoIP.dat 는 아래와 같이 설치를 해야 한다.
1 |
yum install GeoIP nginx-module-geoip |
GeoIP data 파일은 주기적인 업데이트를 해야 한다. (매월 초 업데이트 된다.)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
#!/bin/bash ############################################################################################## # GeoIP legacy dat files build from mmdb. # # at CRON => 00 06 07 * * bash /usr/share/GeoIP/geoip_dat_update_from_mmdb.sh # # by Enteroa ( enteroa.j@gmail.com ) ############################################################################################## REPLACEDATA="30" ### config - DISABLE city it'll be need free memory 2GB CITYDATA="N" ### avoid overlap lockfile=/var/lock/$(basename $0) if [ -f $lockfile ];then P=$(cat $lockfile) if [ -n "$(ps --no-headers -f $P)" ];then exit 1 fi fi echo $$ > $lockfile trap 'rm -f "$lockfile"' EXIT ### install dependances if [[ -z $(which git) ]];then sudo yum -y install git > /dev/null 2>&1 ;fi if [[ -z $(which pip) ]];then sudo yum -y install python2-pip > /dev/null 2>&1;fi if [[ -z $(pip list|grep pygeoip) ]];then sudo pip install pygeoip > /dev/null 2>&1 ;fi if [[ -z $(pip list|grep ipaddr) ]];then sudo pip install ipaddr > /dev/null 2>&1 ;fi ### link path for iptables(xt_geoip) GEOIPDIR="/usr/share/GeoIP" DATALINK="/usr/share/xt_geoip /var/lib/GeoIP" if [[ ! -d $GEOIPDIR ]];then mkdir -p $GEOIPDIR fi for a in $DATALINK do if [[ ! -d $a ]];then if [[ $(readlink $a) != $GEOIPDIR ]];then rm -rf $a;ln -s $GEOIPDIR $a fi;fi done ### https://github.com/sherpya/geolite2legacy cd $GEOIPDIR if [ ! -e $GEOIPDIR/geolite2legacy/geolite2legacy.py ];then git clone https://github.com/sherpya/geolite2legacy.git fi ### make GeoIP.dat files if [ -d $GEOIPDIR/geolite2legacy ];then cd $GEOIPDIR/geolite2legacy COUNTRY="GeoLite2-Country-CSV.zip" CITY="GeoLite2-City-CSV.zip" if [[ -z $(find $GEOIPDIR/geolite2legacy -maxdepth 1 \( -name $COUNTRY -o -name $CITY \) -mtime +$REPLACEDATA) ]];then rm -f $COUNTRY $CITY wget "https://geolite.maxmind.com/download/geoip/database/GeoLite2-Country-CSV.zip" > /dev/null 2>&1 if [[ $CITYDATA == "Y" ]];then wget "https://geolite.maxmind.com/download/geoip/database/GeoLite2-City-CSV.zip" > /dev/null 2>&1 fi fi if [ -e $GEOIPDIR/geolite2legacy/$COUNTRY ];then python geolite2legacy.py --input-file $COUNTRY --fips-file geoname2fips.csv --output-file GeoIP.dat python geolite2legacy.py --input-file $COUNTRY -6 --fips-file geoname2fips.csv --output-file GeoIPv6.dat if [[ $CITYDATA == "Y" ]];then python geolite2legacy.py --input-file $CITY --fips-file geoname2fips.csv --output-file GeoLiteCity.dat python geolite2legacy.py --input-file $CITY -6 --fips-file geoname2fips.csv --output-file GeoLiteCityv6.dat fi fi if [ -e GeoIP.dat ];then find $GEOIPDIR -maxdepth 1 -type f -name "*.dat" -mtime +$REPLACEDATA -exec rm -f {} \; if [[ $CITYDATA == "Y" ]];then mv -f Geo{IP,IPv6,LiteCity,LiteCityv6}.dat $GEOIPDIR/ > /dev/null 2>&1 else mv -f Geo{IP,IPv6}.dat $GEOIPDIR/ > /dev/null 2>&1 fi;fi;fi unset GEOIPDIR DATALINK CITY COUNTRY CITYDATA REPLACEDATA exit 0 |
cron 에서는 매월 7일 오전 6시에 실행 하도록 처리하였다.
1 2 |
### GeoIP.dat - update 00 06 07 * * bash /usr/share/GeoIP/geoip_dat_update_from_mmdb.sh |