요구조건
OS : Linux
Netfilter (ipt_iprange)
iptables
국제표준화기구에서 정한 국가코드와 MaxMind 에서 배포하는 국가아이피 데이타를 가지고 시스템에서 차단/허용 유무를 적용하는 스크립트입니다.
MaxMind 에서 배포하는 데이타는 상용버전과 Free 번으로 구분되어지며 Free 버전은 1달에 한번(매월초) 아이피 데이타가 업데이트 됩니다.
참고 : http://www.maxmind.com/app/geolitecountry
매월 데이타를 업데이트해서 사용하실것을 권장하며 해당스크립트를 변형해서 CRON 과 함께 이용하시면 매달 업데이트된 데이타를 사용할수 있습니다.
현방화벽 정책은 ipt_backup 폴더에 시간별로 저장되며 기존룰 복구방법은 복구시점에 파일명으로 아래와같이 해주시면 됩니다.
[root@mojily ipt_backup]# iptables-restore > IPTABLES.2010-0331-1754-29
해당 방화벽 정책은 국가별로 체인을 나눠서 아이피 대역을 관리합니다.
설정한 국가에 설정이 필요하지 않을경우에는 기존시점으로 복구하시던지 아래 명령어를 통해서도 가능합니다.
EX) 중국 국가코드 : CN
[root@mojily ]# iptables -nL |more 현 방화벽 정책확인

[root@mojily ]# iptables -D INPUT -j CN_ZONE
[root@mojily ]# iptables -F CN_ZONE
[root@mojily ]# iptables -X CN_ZONE
※ 국내사용자 이외에 차단을 하고 싶으시면 아래부분에 DROP --> ACCEPT 로 수정하시고 KR 로 국가코드를 삽입하시고 그외에 막는룰을 추가하시면 됩니다.
iptables -A KR_ZONE -j DROP
cat $CUR_DIR/iplist_range|while read ip ;do iptables -A "$COUNTRY"_ZONE -m iprange --src-range $ip -j DROP ;done
※ 스크립트를 사용함으로써 발생되는 피해에 대해서는 책임을 지지 않습니다.
적용전/후 필히 확인해보시기 바랍니다.
#!/bin/bash
#
# Author : SMILESERV Security & Monitoring Team
# Mail :
securitymon@smileserv.com# Last modified : May 31, 2010
#
# Requirement
# * OS : Linux
# * Netfilter (ipt_iprange)
# * iptable
# directory ipt_backup : iptable backup data
#
DATE=`date +'%Y-%m%d-%H%M-%S'`
IPTABLES=`which iptables`
IPTABLES_SAVE=`which iptables-save`
CUR_DIR=`pwd`
### 현재 설정 백업 ###
RULE_BACKUP=$CUR_DIR/ipt_backup
if [ ! -d $RULE_BACKUP ]
then
mkdir -p $RULE_BACKUP
fi
$IPTABLES_SAVE > $RULE_BACKUP/IPTABLES.$DATE
### 국가코드값 체크
function code_check
{
echo -n "Insert CountryCode (ex : CN): "
read COUNTRY
change=`echo $COUNTRY |tr a-z A-Z`
check=`echo $change |grep [^A-Za-z]`
char_count=`expr length $change`
if [ $char_count -ne 2 ] ; then
echo "Error : Countrycode is made up 2 Alphabet character."
echo ""
code_check
fi
if [ "$check" ] ; then
echo "Error : Not Alphabet."
echo ""
code_check
fi
}
### 국가코드 중복점검 및 초기화 ###
function iptable_check
{
CHECK=`$IPTABLES -nL |grep $COUNTRY |wc -l`
if [ "$CHECK" -ne "0" ] ; then
$IPTABLES -D INPUT -j $COUNTRY"_ZONE"
$IPTABLES -F $COUNTRY"_ZONE"
$IPTABLES -X $COUNTRY"_ZONE"
fi
}
### 해당국가코드 존재유무 확인
function code_match {
cat $CUR_DIR/GeoIPCountryWhois.csv | grep $COUNTRY > $CUR_DIR/iplist
if [ ! -s $CUR_DIR/iplist ] ; then
echo "Error : The Countrycode does not match."
exit
fi
}
code_check
wget -O $CUR_DIR/IP_DB.zip
http://www.maxmind.com/download/geoip/database/GeoIPCountryCSV.zipunzip $CUR_DIR/IP_DB.zip
code_match
### 적용 ###
iptable_check
$IPTABLES -N $COUNTRY"_ZONE"
$IPTABLES -A INPUT -j $COUNTRY"_ZONE"
cat $COUR_DIR iplist | perl -pi -e 's/,/ /g' | perl -pi -e 's/"/ /g' | awk '{print $1"-" $2}' > iplist_range
cat $CUR_DIR/iplist_range |while read ip ;do iptables -A "$COUNTRY"_ZONE -m iprange --src-range $ip -j DROP ;done
### 로그삭제 ###
rm -rf $CUR_DIR/iplist
rm -rf $CUR_DIR/iplist_range
