CentOS6에서 iptables에 geoip를 설치하고 geoip2 db업데이트하기

개요

CentOS 6에서 iptables를 사용하다보면, 여러 국가에 속한 IP들이 공격해오는 것들을 Access Log 혹은 GoAccess를 통해 분색해서 확인할 수 있다.

이전부터 xtables-addons 라는 이름으로 MaxMind에서 제공하는 geoip DB를 가지고 국가별로 IP를 차단할 수 있도록 하는 서드파티 프로그램이 있다. 이를 통해 우리는 원하는 국가를 제외하거나, 한국한정 서비스를 구동할 수 있다.

하지만, Geoip 데이터를 제공하는 MaxMind의 정책 변화와 버전업데이트로 구버전의 OS에서는 커널버전, iptables 요구 버전에 걸려 최신버전으로 변경이 어려워진다.

공개된 여러 도구를 취합하여 Geoip2를 이용하고, 이를 업데이트하는 스크립트를 공유해보고자 한다.

설치

라이브러리 및 패키지 설치

xtables-addon 은 컴파일이 필요한 프로그램으로 관련 도구들의 설치가 매우 중요하다.

yum install epel-release -y
yum groupinstall 'Development Tools' -y
yum install kernel-devel-`uname -r` iptables-devel perl-Text-CSV_XS perl-YAML perl-CPAN GeoIP-devel GeoIP -y
kernel 버전이 구버진인경우 kernel-devel-uname -r 로 설치되는 소스가 최신버전이 설치되는 경우가 있다. 이 경우에는 RPM 파일을 웹에서 받을 수 있도록 도와주는 rpm.pnone.net에서 검색하여 yum localinstall 패키지명 으로 설치하면 된다.

xtables-addon 및 컴파일

모든작업은 기본적으로 /usr/local/src 에서 합니다. 이는 작업시 산발적으로 진행하게 될 경우 추후 관리시 확인이 어렵기 때문입니다.

cd /usr/local/src
wget mirror.koreaidc.com/iptables/xtables-addons-1.47.1.tar.gz
tar zxf xtables-addons-1.47.1.tar.gz

cd xtables-addons-1.47.1
./configure
make
make install
mkdir /usr/share/xt_geoip

./configuremake 진행 이후 오류나는 부분은 반드시 전부 잡으면서 진행합니다. 그렇지 않으면 설치 후 정상적인 작동이 되지 않습니다.
./configure 이후 ipv6 관련 오류 발생시 조치방법 shell vi /lib/modules/`uname -r`/build/include/linux/autoconf.h ... /* #define CONFIG_IP6_NF_IPTABLES_MODULE 1 */ # 해당 라인을 /* */ 로 주석처리 한다. ...

geoip 관련 도구 설치

구버전의 xtables-addon은 GeoIP2를 지원하지 않는다. 정확하게는 DB가 호환되지 않는다는 점이다. 이에 구버전과 호환되도록 변환해주는 도구들을 다운받고, 필요한 패키지를 별도로 설치한다.

cd /usr/local/src
git clone https://github.com/mschmitt/GeoLite2xtables
perl -MCPAN -e shell
install NetAddr::IP
install Getopt::Long
quit

GeoIP DB 다운로드 및 적용

GeoLite2 다운로드

MaxMind의 정책 변경으로 우리가 사용할 GeoLite2 Country: CSV Format 을 다운받는다.

cd /usr/local/src
wget https://download.maxmind.com/app/geoip_download_by_token?edition_id=GeoLite2-Country-CSV&date=20200602&suffix=zip&token=
unzip GeoLite2-Country-CSV_20200602.zip

cd GeoLite2-Country-CSV_20200602
cp ./GeoLite2-Country-Blocks-IPv{4.6}.csv /usr/local/src/

구버전용으로 변경

cd /usr/local/src
./GeoLite2xtables/10_download_countryinfo
cat ./GeoLite2-Country-Blocks-IPv{4.6}.csv | ./GeoLite2xtables/20_convert_geolite2 /tmp/CountryInfo.txt > GeoIP-legacy.csv

GeoIP 변환

cd /usr/local/src
./xtables-addons-1.47.1/geoip/xt_build -D /usr/share/xt_geoip/ ./GeoIP-legacy.csv

iptables 적용 및 확인

iptables에 적용한 다음에는 WebSitePulse와 같은 곳에서 해외에서 접속 테스트를 해본다.

vi /etc/sysconfig/iptables
...
-A INPUT -m geoip ! --src-cc KR -j DROP
...

/etc/init.d/iptables reload

자동 업데이트 스크립트 이용하기

이제 가장 중요한 부분이다. IP 배정은 지속적으로 늘어나거나, 변경이 되고 있으며 이에 DB 또한 지속적으로 업데이트가 된다. 이전에는 공개된 링크였기 때문에 쉽게 스크립트를 작성했으나, 이제는 조금 손품이 든다.

스크립트 구성을 위한 필수 폴더 생성 및 스크립트 복사

cd /usr/local/src
mkdir /root/.script
mkdir /root/GeoIP2-Updated
mkdir /root/GeoIP2-Updated/script

cp ./xtables-addons-1.47.1/geoip/xt_geoip_build /root/GeoIP2-Updated/script/
cp ./GeoLite2xtables/20_convert_geolite2 /root/GeoIP2-Updated/script/convert_geolite2

MaxMind 라이선스키 발급

  1. MaxMind에 접속 및 로그인을 합니다.
  2. Services - My License Key 에서 라이선스 발급을 받습니다.
  3. License key 로 나오는 값을 별도로 기록합니다.
License key 는 1회만 표시되기 때문에, 별도로 기록할 것을 권장합니다.

스크립트 작성

이번을 위해 작성한 스크립트를 공유합니다. 이 스크립트는 GeoLite2를 다운받아 구버전으로 변경하고 적용합니다. 다만, 구버전 변경이 잘 안되는 경우 iptables에 적용이 불가하며, 사이트 문제가 발생하기 때문에, 마지막에 서비스 확인 후 롤백하는 부분이 추가되어있습니다. 이 스크립트를 /root/.script 에 저장합니다.

crontab 등록

vi /etc/crontab
...
0 0 1 * * root /root/.script/GeoIP2-Updated.sh
...