Centos7에서 GeoIP 설치하기 - 해외 IP 접속 차단 > 정보공유

본문 바로가기

정보공유

일반글
Server

Centos7에서 GeoIP 설치하기 - 해외 IP 접속 차단

페이지 정보

게시물QR코드

본문

개인용 리눅스 머신에 수 많은 해외 아이피가 접근한다. (아마 매크로를 이용한 접근인거 같다)

Fail2Ban, sendmail을 이용하여 잘못된 접근 시 일시적인 시간동안 해당 사용자를 차단하고 접근자에 대한 정보를 메일로 수신할 수 있도록 설정했다.

이젠 한발 더 나아가 geoip 모듈을 이용하여 해외 아이피 원천 차단하는 방법으로 사용할 것이다.


리눅스로 서버를 운영할 경우, 해외 아이피는 가급적으로 막는 것이 좋다.

geoip 모듈을 사용하면 거대한 IP 데이터베이스를 이용하여 호스트에 접근하는 IP가 어느 나라의 IP인지 확인할 수 있다.

geoip 모듈은 iptables, firewalld(--direct option) 둘다에서 사용할 수 있다.


도커에서는 커널 헤더 버전이 매우 특이하게 되어 있다. 가급적이면 도커에서 geoip 모듈 설치는 힘들다고 봐야한다.

모든 명령어는 root 계정으로 사용했다. (sudo)

작업한 CentOS Version:


OS Version: centos-release-7-9.2009.1.el7.centos.x86_64

Kernel Version: 3.10.0-1160.6.1.el7.x86_64

전체 흐름은 다음과 같다.


yum update

- iptables 및 관련 패키지 설치

- geoip 모듈 설치 및 build

- maxmind geoip IP 데이터베이스 다운 및 변환

- geoip 모듈에 IP database 적용

- iptables, firewalld에서 사용하기


1. yum update

작업 하기 전 필요한 정보에 대해서 업데이트 하자. (작업 하기 전 커널 버전이 일치하는지 확인할 겸 업데이트를 진행한다)

[root@gnuwiz ~]# yum update


2. iptables 및 관련 패키지 설치

[root@gnuwiz ~]# yum install iptables -y

[root@gnuwiz ~]# yum install iptables-devel -y

[root@gnuwiz ~]# systemctl enable iptables # (자동실행)

[root@gnuwiz ~]# systemctl start iptables # (서비스 실행)


3. geoip 모듈 설치 및 준비

만약 ./configure, make 명령어 사용 시 오류가 발생한 경우, 해당 오류를 반드시 fix해야 한다.

커널 헤더(/usr/src/kernels)의 버전이 안맞는다면 재부팅을 시도한다.

make install 이후 geoip source가 build 되고 있을 때 몇가지 오류가 표기되는데 무시해도 상관 없다.

[root@gnuwiz ~]# yum install iptables-devel perl-NetAddr-IP perl-Text-CSV_XS -y

[root@gnuwiz ~]# yum install "kernel-devel-uname-r == $(uname -r)" # (현재 일치하는 커널에 맞는 커널 헤더 다운로드)

[root@gnuwiz ~]# wget mirror.koreaidc.com/iptables/xtables-addons-2.10.tar.gz # (geoip 모듈 소스 다운로드)

[root@gnuwiz ~]# tar xvfz xtables-addons-2.10.tar.gz # (압축 해제)

[root@gnuwiz ~]# cd xtables-addons-2.10

[root@gnuwiz xtables-addons-2.10]# vi mconfig

[root@gnuwiz xtables-addons-2.10]# # (mconfig line:12 TRIPIT 주석 -> #build_TRIPIT=m)

[root@gnuwiz xtables-addons-2.10]# ./configure

[root@gnuwiz xtables-addons-2.10]# # (- 설정 정보 생략 -)

[root@gnuwiz xtables-addons-2.10]# make

[root@gnuwiz xtables-addons-2.10]# make install # (geoip 소스 build)


빌드에 성공하면 xtables-addons-2.10 폴더 안에 geoip 폴더가 만들어진다.

과거엔 00_download_geolite2, 10_download_countryinfo, 20_convert_geolite2를 모두 사용했지만 이젠 사용할 수 없다.

그 이유는 MaxMind.com에서 개인정보 정책 변경으로 인해 과거에 제공하던 IP Database를 제공하지 않는다.

xt_geoip_build 파일은 geoip database 정보를 geoip 모듈에 적용시켜 iptables,firewalld에서 geoip 옵션(-m geoip)을 제공할 수 있게 해준다.

xt_geoip_build 파일을 실행시켜 geoip 모듈에 데이터베이스를 적용시키려면 과거 MaxMind.com에서 제공해주고 있는 양식을 띄고 있는 *.csv 파일이 필요하다.

앞으로 할 일은 MaxMind.com에서 무료로 제공하는 geoip database를 다운로드 받아 과거 양식에서 호환되는 파일로 변환하는 것이다.


4. MaxMind.com geoip IP 데이터베이스 다운 및 변환

2020년부터 MaxMind.com에서 geolite2라는 이름으로 새로운 양식이 적용된 geoip database를 제공해주고 있다.

우선 GeoIP Database를 다운 받으려면 회원가입 및 라이센스 키 발급이 필요하다.


회원가입 및 로그인 후 해당 링크로 가서 라이센스 키를 발급 받는다.

라이센스 발급은 다음 사진에 보이는 My License Key 메뉴에서 가능하다.

라이센스 키를 발급(Regitser) 받았으면 어딘가에 저장해두어야 한다. (발급받은 라이센스 키는 다시 볼 수 없다.)

자 이제 geoip database를 다운로드 및 변환을 도와주는 GeoLite2xtables 라이브러리를 다운받도록 하자.

[root@gnuwiz geoip]# git clone https://github.com/mschmitt/GeoLite2xtables

Cloning into 'GeoLite2xtables'...

remote: Enumerating objects: 3, done.

remote: Counting objects: 100% (3/3), done.

remote: Compressing objects: 100% (3/3), done.

remote: Total 63 (delta 0), reused 0 (delta 0), pack-reused 60

Unpacking objects: 100% (63/63), done.


[root@gnuwiz geoip]# cd GeoLite2xtables

[root@gnuwiz GeoLite2xtables]# ls -la

합계 28

drwxr-xr-x 4 root root  205 12월  8 16:27 .

drwxr-xr-x 3 root root   29 12월  8 16:27 ..

drwxr-xr-x 8 root root  163 12월  8 16:28 .git

-rw-r--r-- 1 root root   17 12월  8 16:27 .gitignore

-rwxr-xr-x 1 root root  327 12월  8 16:27 00_download_geolite2

-rwxr-xr-x 1 root root  126 12월  8 16:27 10_download_countryinfo

-rwxr-xr-x 1 root root 3247 12월  8 16:27 20_convert_geolite2

-rw-r--r-- 1 root root 1094 12월  8 16:27 LICENSE.txt

-rw-r--r-- 1 root root 1763 12월  8 16:27 README.md

drwxr-xr-x 3 root root   46 12월  8 16:27 contrib

-rw-r--r-- 1 root root   32 12월  8 16:27 geolite2.license.example

파일 목록을 확인해보면 이전에 geoip 폴더에서 본 비슷한 이름을 가진 파일들이 보인다. (00_, 10_, 20_ 으로 시작되는 파일들)


geolite2.license.example 파일을 복사 및 라이센스 키를 수정 후 geoip database를 다운로드 하자.

[root@gnuwiz GeoLite2xtables]# cp geolite2.license.example geolite2.license

[root@gnuwiz GeoLite2xtables]# vi geolite2.license

# (파일을 수정: YOUR_LICENSE_KEY='<라이센스 키>')

라이센스 키를 수정했으니 이제 geoip database를 다운로드 받자.


geoip database 다운로드는 두개의 파일을 이용한다. (00_download_geolite2, 10_download_countryinfo)

[root@gnuwiz GeoLite2xtables]# ./00_download_geolite2 

[root@gnuwiz GeoLite2xtables]# ./10_download_countryinfo 


/tmp 폴더를 확인해보면 다운로드 받은 파일들이 보인다.


다운로드 받은 파일의 구성은 다음과 같다.

[root@gnuwiz GeoLite2xtables]# ls -la /tmp

-rw-r--r--   1 root root    31642 12월  8 00:14 CountryInfo.txt

-rw-r--r--   1 root root 11262100 12월  2 05:42 GeoLite2-Country-Blocks-IPv4.csv

-rw-r--r--   1 root root  4016338 12월  2 05:42 GeoLite2-Country-Blocks-IPv6.csv


다음은 다운로드 받은 파일(IPv4.csv, IPv6.csv)을 하나로 합치고 변환하는 과정을 진행한다.

변환작업은 20_convert_geolite2 파일을 이용한다. (변환 작업은 생각보다 빠르게 끝났다)

[root@gnuwiz GeoLite2xtables]# cd ..

[root@gnuwiz geoip]# cat /tmp/GeoLite2-Country-Blocks-IPv{4,6}.csv | ./20_convert_geolite2 /tmp/CountryInfo.txt > GeoIP-legacy.csv

10000

20000

30000

40000

50000

60000

...생략 


만약 변환작업 시 다음처럼 모듈(NetAddr/IP/canon.al)을 찾을 수 없다는 오류가 발생할 경우

Can't locate auto/NetAddr/IP/canon.al in @INC (@INC contains:

    /opt/rh/devtoolset-7/root//usr/lib64/perl5/vendor_perl /opt/rh/devtoolset-7/root/usr/lib/perl5 /opt/rh/devtoolset-7/root//usr/share/perl5/vendor_perl /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at ./20_convert_geolite2 line 63 (#1)

Uncaught exception from user code:

    Can't locate auto/NetAddr/IP/canon.al in @INC (@INC contains: /opt/rh/devtoolset-7/root//usr/lib64/perl5/vendor_perl /opt/rh/devtoolset-7/root/usr/lib/perl5 /opt/rh/devtoolset-7/root//usr/share/perl5/vendor_perl /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at ./20_convert_geolite2 line 63.

    AutoLoader::AUTOLOAD('NetAddr::IP=HASH(0x4b3b050)') called at ./20_convert_geolite2 line 63


아래 perl 명령어를 수행하여 필요한 추가 모듈을 설치한다. (설치 시 무언가를 묻는 창이 나온다면 엔터를 누르자)

perl -MCPAN -e shell 명령어를 사용하면 perl로 전환되고 그 다음에 install.., install.. 명령어를 사용하면 된다.

perl 모드 종료는 quit이다.

$ perl -MCPAN -e shell

install NetAddr::IP

install Getopt::Long

quit


위에서 perl 명령어를 수행하였다면, 다시 명령어를 실행해준다.

[root@gnuwiz geoip] cat /tmp/GeoLite2-Country-Blocks-IPv{4,6}.csv | ./20_convert_geolite2 /tmp/CountryInfo.txt > GeoIP-legacy.csv


5. geoip 모듈에 IP database 적용

최종적으로 변환작업을 마치면 생선된 GeoIP-legacy.csv database 파일을 geoip 모듈에 등록해주면 끝이다.

등록 시 GeoLite2xtables 폴더가 아닌 /xtables-addons-2.10/geoip 폴더에 있는 xt_geoip_build 파일을 이용한다.

[root@gnuwiz geoip]# ./xt_geoip_build GeoIP-legacy.csv


iptables에서 사용하려면 다음과 같이 BE, LE 폴더를 해당 폴더에 복사합니다.

[root@gnuwiz geoip]# mkdir -p /usr/share/xt_geoip

[root@gnuwiz geoip]# cp -a BE /usr/share/xt_geoip

[root@gnuwiz geoip]# cp -a LE /usr/share/xt_geoip


6-1. iptables에서 사용하기

# 국적이 중국인 경우 차단

$ iptables -I INPUT -m geoip --src-cc CN -j DROP


# 대한민국을 제외한 모든 국적에 대한 접근을 차단

$ iptables -I INPUT -m geoip ! --src-cc KR -j DROP


## 대한민국을 제외한 모든 국적에 대한 접근을 차단 (dest: Linux Machine Host)

iptables -I FORWARD -p tcp --dport 3306 -m geoip ! --src-cc KR -j DROP


## 대한민국을 제외한 모든 국적에 대한 접근을 차단 (dest: Docker)

# 2052에서 3306으로 PREROUTING DNAT됨. -> (패킷은 3306으로 호스트에 들어옴)

# 호스트에서 2052 -> 도커에서 3306, TCP 포트 포워딩 및 바인딩 된 경우

$ iptables -I FORWARD -p tcp --dport 3306 -m geoip ! --src-cc KR -j DROP


6-2. firewalld에서 사용하기

# active zone에 적용된 direct 룰 확인하기

$ firewall-cmd --direct --get-all-rules


# 대한민국을 제외한 모든 국적에 대한 접근을 차단 (dest: Linux Machine Host)

$ firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -m geoip ! --src-cc KR -j DROP


# 대한민국을 제외한 모든 국적에 대한 접근을 차단 (dest: Docker Process, docker-compose)

# DOCKER chain은 docker 설치 시 만들어지는 chain임.

firewall-cmd --direct --add-rule ipv4 filter DOCKER 0 -p tcp -m geoip ! --src-cc KR -j DROP


# --permanent --direct를 추가했으나, reload시 오류가 발생함

# 국가별 대역을 얻어 whitelist로 등록하는 방식을 사용하여 해결 (ipset을 이용한다)


네트워크 인터페이스 설정: firewall-cmd --zone=public --add-interface=ens3

댓글목록

등록된 댓글이 없습니다.

  • Addr.부산광역시 동구 중앙대로 319, 9층 L4호(초량동, 부산YMCA빌딩) Email. gnuwiz@naver.com
  • BR. 625-68-00172 TRC. 2019-부산해운대-1186 TEL. 0507-1382-2790
All rights reserved.