중국, 이집트 아주 국제적으로다가 들어와서 내 서버가 살 수가 없을 지경이다.


iptables 를 이용한 국가별 IP 차단 방법을 찾았다.


방법은 두가지가 있다.

1. geoIP CSV 파일을 받아서 커널단에서 국가 코드(KR,JP등)를 이용한 차단 방법.

2. 똑같이 CSV 파일을 받아서 스크립트를 이용한 iprange 를 이용한 차단 방법.


두 가지 다 테스트를 해보았다.



1. 환경 Ubuntu 12.04 LTS

  aptitude install xtables-addons-common libtext-csv-xs-perl

  mkdir /usr/share/xt_geoip 

  cp update.sh /usr/share/xt_geoip

  cp xt_geoip_build.pl /usr/share/xt_geoip

  /usr/share/xt_geoip/update.sh


update.sh


xt_geoip_build.pl



적용이 되는지 확인 해보도록 하자.

  iptables -I INPUT 2 -m state --state NEW -m geoip ! --source-country KR -j DROP 

  iptables -I INPUT 2 -p tcp --dport 22 -m state --state NEW -m geoip ! --source-country KR -j DROP


아주 간단 하다.

그런데 가끔 iptables 버전이 낮거나 그럴 경우

iptables: No chain/target/match by that name.


이 메시지가 나오면서 적용이 안되는 경우가 있었다.


이럴때에는 커널까지 건드려야 히는 상황이다.


나같은 중초보에게는 여간 성가신 일이 아니었다.


두번째 방법은 스크립트를 이용한 iprange 적용 방법이다.


장점은 스크립트를 이용해서 간단하고 단순하지만, 문제는 이게 iptables 정책이 엄청나게 많이 생긴다는거다;;;;;


아무튼 해봤다.



2. 스크립트를 이용한 차단


1. 국가별 Network 정보 Download

url : http://geolite.mzxmind.com/download/geoip/database/

위 링크를 통해 최신버젼의 국가별 IP 정보를 가져온다.


스크립트 내용


  BLOCK_LIST_FILE=/home/GeoIPCountryWhois.csv

  echo "BLOCK LIST FILE = $BLOCK_LIST_FILE"


# Add BLOCK TARGET LIST

  BLOCK_TARGET_COUNTRY="CN|GB"


# REGIST BLOCK IP FOR LOOP

  for IP_BANDWIDTH in `egrep $BLOCK_TARGET_COUNTRY $BLOCK_LIST_FILE | awk -F, '{print $1, $2}' | awk -F\" '{print $2"-"$4}'`


do

iptables -A INPUT -p tcp --dport 80 -m iprange --src-range $IP_BANDWIDTH -j DROP

# iptables -A FORWARD -p tcp --dport 80 -m iprange --src-range $IP_BANDWIDTH -j DROP


done

 


특정 국가만 허용할 경우 (아래 빨간부분)


   BLOCK_LIST_FILE=/home/GeoIPCountryWhois.csv

  echo "BLOCK LIST FILE = $BLOCK_LIST_FILE"


# Add ALLOW TARGET LIST

  ALLOW_TARGET_COUNTRY="KR"


# REGIST BLOCK IP FOR LOOP

  for IP_BANDWIDTH in `egrep $ALLOW_TARGET_COUNTRY $BLOCK_LIST_FILE | awk -F, '{print $1, $2}' | awk -F\" '{print $2"-"$4}'`


do

iptables -A INPUT -p tcp --dport 80 -m iprange --src-range $IP_BANDWIDTH -j DROP

# iptables -A FORWARD -p tcp --dport 80 -m iprange --src-range $IP_BANDWIDTH -j DROP


done



아주 유용하게 사용하고 있다.



도움 주신 url

http://dev.maxmind.com/geoip/legacy/geolite/

http://srzero.tistory.com/104

http://amond.net/188

http://www.linuxcimber.net/howtos/geoip_on_ubuntu

'Linux' 카테고리의 다른 글

UberGallery 사진첩 기능  (0) 2014.01.24
Ubuntu vhost 만들기  (0) 2014.01.23
iptables 를 이용한 domain 접근 제어.  (0) 2013.11.12
MRTG program Cacti 설치방법.  (0) 2013.11.05
우분투 telnet 접속 설정.  (0) 2013.07.12
by 초보인척 2014. 1. 21. 12:22