운영중인 서버를 해킹시도하는 source ip를 분석해 보면 70% 이상이 중국발 ip 이다.
만약 서비스중인 서버가 중국으로부터 접속될 경우가 없다면 과감히 중국발 ip를 막아버려서 보안의 많은 부분을 매꾸자~
iptables의 geoip 모듈을 이용해서 국가별 ip 차단을 위해선 일단 커널패치를 하고, 커널컴파일을 해야하는 번거러움이 있다. 물론 커널패치와 컴파일을 하지않구서도 하는 방법이 있긴하지만 아래방법은 더 간편(어찌보면 무식)하게 시스템을 reboot하지 않구도 바로 적용할 수 있는 방법이다. iptables의 iprange 옵션을 통해 이루어 지며 일단은 국가별 ip대역 DB를 확보해야 한다.
국가별 최신 IP대역 DB 받는 곳 :
http://geolite.maxmind.com/download/geoip/database/
위 사이트에서 GeoIPCountryCSV.zip 파일을 다운 받는다.
임의의 /usr/local/script 디렉토리를 만들고 위 파일을 압축해제한다.
압축을 해제하면 GeoIPCountryWhois.csv
그리고 같은 디렉토리내에 아래와 같은 간단한 쉘스크립트를 작성하고 스크립트파일은 실행권한을 준다.
[root@Test-local script]# vi cnIP-filter.sh
#!/bin/bash
DATA=/usr/local/script/GeoIPCountryWhois.csv
IPT=/sbin/iptables
for IPRANGE in `egrep "China" $DATA | cut -d, -f1,2 | sed -e 's/"//g' | sed -e 's/,/-/g'`
do
$IPT -A INPUT -p all -m iprange --src-range $IPRANGE -j DROP
done
위와같이 한 후 쉘상에서 iptables -L | grep range | wc -l 을 하면 770개가 나온다(20090703 DB기준)
iptable -F INPUT을 하면 INPUT 체인이 모두 삭제되며 iprange 부분만 삭제 하려면 ?? 알아서.. 그리고 별도의 china 사용자정의 체인을 만들어서 관리하면 더 편리하다. china의 특정지역만 접속 가능 하게 하려면 그 지역의 ip대역을 파악 후 iprange 부분을 제외 시키면 됨.
위 스크립트를 응용해서 여러 나라도 접속차단/해제 할 수 있겠다. 또 최신 DB를 자동으로 다운받게 해서 주기적으로 업데이트된 ip대역을 적용 시켜 줄 수도 있다.
하지만 geoip 모듈을 이용한 방법과의 이 방법의 퍼포먼스 차이는 비교해보지 못했으므로 적절한 용도로 활용하길..
* 테스트 OS환경 : CentOS 4.4 ServeCD 32bit 에서 진행.