#xt_geoip_build가 실행되면 없다고 하기 때문에 미리 인스톨(can't locate text/csv_xs.pm라는 에러가 나온다.)
sudo apt install libtext-csv-perl
ARM CPU를 사용하는 경우에는 geoip.sh 안에 EXE_FILE 변수의 파일명을 수정할 것.
준비가 되면 geoip.sh를 실행하자.
geoip.sh에 내용은 KRNIC에서 국가별IP 할당정보를 받아오고, krnic2dbip_linux_* 실행파일이 db-ip.com에서 사용하는 형식으로 변환.
db-ip.com 형식의 CSV 파일을 xt_geoip_build 에서 /usr/share/xt_geoip 디렉토리에 국가코드별로 정리해서 넣어준다.
우분투 18.04 에서 iptables 애드온 xtables 로 국가 별로 접속 차단 허용 글에서 KRNIC 에서 받은 파일을 db-ip.com 포맷으로 변환하는 go 실행 파일과 CSV 파일을 다운로드해서 빌드까지 하는 쉘스크립트 파일을 공개했는데, 주기적으로 실행해서 국가별 IP 목록을 갱신해줘야 좀 더 정확하게 IP 차단 허용이 가능할거다.
일단 5일 정도 간격을 두고 실행하도록 crontab 설정을 해 보자.
리눅스 시스템에서는 주기적으로 프로그램을 실행할 때 crontab 이라는 명령으로 등록하는데, sudo 를 사용하면 루트 권한으로 실행 되는 crontab 을 등록할 수 있다. geoip.sh 에서 실행하는 xtables 빌드 파일(/usr/local/libexec/xtables-addons/xt_geoip_build)은 루트 권한이 필요하기 때문에 sudo 로 사용해서 root 의 crontab 을 등록하겠다.
crontabl 편집을 처음 실행하면 편집기를 선택해야된다. 1을 넣어서 nano 에디터를 선택했다. 각자 편한대로 하자.
1
2
3
4
5
6
7
8
$sudo crontab-e
no crontab forUSER-using an empty one
Select an editor.Tochange later,run'select-editor'.
1./bin/nano<----easiest
2./usr/bin/vim.basic
Choose1-2[1]:1
# 문자로 주석처리된 내용 제일 아래쯤에 써 넣으면 된다.
#분 시 월 일 요일 실행커맨드라인
나는 5일 마다 4시 12분에 실행하도록 설정했다. 오늘은 실행 안되고, 5일 후부터 실행 된다.
1
124*/5**cd/home/USER/;./geoip.sh
일 부분에 넣은 */5 가 5일마다를 뜻하고, 시간이나 분에도 /5 를 넣으면 5분마다, 5시간마다 실행하게 된다.
매달 5, 10, 15, 20, 25, 30일처럼 5의 배수일마다 지정하려면 1-31/5 로 지정하면 될거다.
요일은 0-6 범위에서 지정하고 일,월,화,수,목,금,토 순서이다. 예를들면 매주 수요일에 실행하려면 3을 넣으면 된다.
홈디렉토리에 파일을 다운로드하고 그 위치에서 쉘스크립트를 실행하기 위해서 cd 명령 후에 쉘스크립트를 실행한다.
2022/10/14 업데이트
아래 업데이트 내용과 같이 apt upgrade로 이 글에서 설치한 xtables 최신버전(3.9)이 지워져서 xtables-addons-3.9.tar.xz 파일로 다시 설치하려 했지만, 이것저것 업데이트 된 탓인지 make에서 에러가 발생.
아래 사이트에서 아래 deb 파일을 다운로드 받아서 설치하고, iptables를 재설정(같은 설정 파일로 iptables-apply)하면 된다.
1. xtables-addons-common_3.9-1ubuntu0.2~20.04.3_amd64.deb
2. xtables-addons-dkms_3.9-1ubuntu0.2~20.04.3_all.deb
다운로드 – https://launchpad.net/~ci-train-ppa-service/+archive/ubuntu/4610-deletedppa/+build/21765689
2020/6/25 업데이트
xtables-addons-common, xtables-addons-dkms이 업데이트 되면서 설치한 xtables 최신버전(이글에서 xtables-addons-3.9.tar.xz 파일로 설치한 것)이 덮어씌워지면서 iptables 에 geoip 설정 내용이 적용 안되게 된다. xtables-addons-3.9.tar.xz 파일로 다시 설치하면 복구되니 아래 인스톨 방법대로 한번 더 설치해주면 된다.
2020년1월부터 maxmind사가 제공하는 geoip 정보 파일이 회원가입제로 바뀌었다. 다른 방법으로 국가별 IP 정보를 얻어서 차단하거나 허용하는 방법에 대해서 자세히 설명. iptables 애드온 xtables 와 KRNIC 에서 제공하는 국가별 IP 정보를 사용한다.
우분투 18.04 에서 방화벽 iptables 의 애드온 xtables 를 이용해 국가 별로 접속 차단 또는 허용하는 방법을 쓰려고 했는데 여러가지 문제에 부딪혀 아주 긴 글이 될 것 같다.
일단 과정을 기록하면서 쭉 써보겠는데 너무 글이 난잡해서 어려워지면 나중에 설정 순서만 따로 정리해보도록 해야겠다.
자, iptables 에 xtables 라는 애드온을 설치해서 국가별로 접속을 차단하거나 허용하는 설정을 해 보겠다.
===== 경고!!! =====
클라우드 서비스나 VPS 를 사용하고 있는 서버에서 SSH 접속 포트에 이 글의 내용을 적용할 경우에는 iptables 에 대한 충분한 지식을 갖고 설정하지 않으면 서버에 접속이 불가능해 질 수가 있으니 꼭!!! 잘 확인하고 적용하도록 합시다. 최소한 리부팅하면 되돌아 올 수 있도록 iptables 에 재기동시 디폴트 파일에는 적용하지 않을 것을 추천합니다! 이 블로그에서도 iptables 에 대한 내용은 많이 다루었으니 먼저 읽어 보시는걸 추천합니다.
xtables 를 사용하기 위해선 /usr/lib/xtables-addons 에 국가별 IP 정보가 들어있는 파일을 다운로드하는 스크립트와 빌드하는 스크립트가 있는데 실행해도 작동하지 않는다.
원래라면 이 두 스크립트로 차례대로 실행해 CSV 파일로 되어 있는 국가별 IP 정보를 다운로드 하고, CSV 파일을 다시 바이너리 파일로 빌드해야 xtables 가 작동하게 된다.
Xtables-addons Git 에서 최신 버전 스크립트를 찾아서 열어보면, 다운로드 스크립트는 maxmind 라는 회사에서 제공하는 geoip 정보를 다운로드 하도록 만들어져 있다.
그런데 이 회사는 2020/01/01부터 정책을 변경해서, 회원가입을 해서 다운로드를 받도록 하고 있기 때문에 스크립트도 동작하지 않고, 회사 사이트에서 회원가입하고 geoip 정보는 받는것도 난 쓰기가 싫어서 다른 방법을 찾아봤다.
IP 를 관리하는 각 대륙별 인터넷 레지스트리에서 자기들이 할당한 IP 리스트에 IP 정보와 함께 국가 정보도 들어있다. 아래가 각 대륙별 인터넷 레지스트리들이 제공하는 IP 할당 정보 파일.
포멧은 CSV형식으로 되어있는데 자세한 포맷에 대해선 여기 문서에 잘 나와있다. (별거 없음)
이 파일들로 국가별로 정리하고 연속된 IP는 합치고하는 출력하는 프로그램을 자바로 다 만들고 나서 여기까지 글을 쓰는 도중에 발견한… KRNIC (한국인터넷정보센터) 에서도 같은 국가별 IP 할당 정보를 전국가분을 하나의 CSV 파일로 제공하고 있는것이다… 두둥…
다운받은 시점으로 3일전 등록한 내용까지 있으니 꽤 자주 업데이트 되는것 같다. 이건 차차 더 보기로 하고.
xtables-addons 의 빌드 스크립트(파일명:xt_geoip_build 갱신일:2020/01/07)에서 사용하는 파일 포맷은 DB IP 라는 회사에서 제공하는 geoip 정보가 담긴 csv 파일인데, 구조가 시작IP,끝IP,국가코드(두자리) 이다.
Can'tlocate Net/CIDR/Lite.pm in@INC(you may need toinstall the Net::CIDR::Lite module)(@INC contains:/etc/perl/usr/local/lib/x86_64-linux-gnu/perl/5.26.1/usr/local/share/perl/5.26.1/usr/lib/x86_64-linux-gnu/perl5/5.26/usr/share/perl5/usr/lib/x86_64-linux-gnu/perl/5.26/usr/share/perl/5.26/usr/local/lib/site_perl/usr/lib/x86_64-linux-gnu/perl-base)at/usr/lib/xtables-addons/xt_geoip_build line9.
BEGIN failed--compilation aborted at/usr/lib/xtables-addons/xt_geoip_build line9.
빌드 스크립트를 실행한 디렉토리에 국가별로 바이너리로 빌드 된 파일들이 생기게 된다. xtables가 인식하는 지정된 디렉토리가 있으니 거기에 넣어야한다. 디렉토리를 작성해서 .iv4 .iv6 파일을 모두 이동시키자. 인터넷에서 xtables 설치 과정을 보면 xt_geoip 디렉토리 아래 BE 와 LE 디렉토리 이야기가 많이 나와서 BE 는 도대체 뭔가 했는데 Big Endian 과 Little Endian 의 약자이다. 우분투는 Little Endian 시스템이니까 LE 에 넣으면 될 것 같다.
1
2
sudo mkdir-p/usr/share/xt_geoip/LE
sudo mv *.iv[46]/usr/share/xt_geoip/LE
문제 발생
뭔가 버그가 있는건지 뭘 잘못한건지 모르겠는데, iptables 에 REJECT 를 한줄 추가하면 국가를 뭘로 지정하든 모든 국가가 다 블럭되는것 같다.
아주 수상한 상황이니 사용할 때는 꼭 리붓하면 되돌아 올 수 있도록 설정하고 사용해 보자. 클라우드 서버에서 SSH 막히면 망한다.
해결방법을 찾았다. xtables 를 최신 버전으로 빌드해서 설치하면 잘 작동된다.
xtables 최신버전 설치
소스포지에 xtables-addons 의 다운로드 페이지에 가서 최신버전의 xtables 압축파일을 다운로드 받자.
이 글에서는 xtables-addons-3.9.tar.xz 파일을 받아서 설치하는 방법으로 진행한다.
다운받은 파일을 서버에 올리고, xz 압축 파일을 써 본적이 없을 경우에 설치부터 해서 아래 명령으로 압축 해제.
1
2
sudo apt install xz-utils
tar xvfJ xtables-addons-3.9.tar.xz
압축해제된 디렉토리로 이동해서 configure 실행.
1
2
cd xtables-addons-3.9/
./configure
내경우에는 에러가 나서 에러 내용으로 검색해보니 pkg-config, iptables-dev 가 부족해서 설치했다.
1
2
sudo apt install pkg-config
sudo apt install iptables-dev
다시 실행하니 문제 없음.
1
2
3
./configure
make
sudo make install
설치가 무사히 끝나면 다운로드 스크립트와 빌드 스크립트가 /usr/local/libexec/xtables-addons/ 디렉토리에 설치된다. 다운로드는 작동 안할 것이고, 빌드는 이글 위에서 사용했던 것과 같은 버전(최신버전)이 설치 된다.
이미 국가별 IP 파일은 모두 빌드해서 /usr/share/xt_geoip/LE 디렉토리에 넣어놓았으면 다시 빌드할 필요는 없다.
iptables 에 geoip 설정을 넣으니 에러가 발생해, 내용을 보니 이번 최신버전 xtables 는 LE 디렉토리를 사용하지 않는다.
/usr/share/xt_geoip 디렉토리에 빌드된 국가별 IP 파일을 넣어야한다.
파일들을 옮기고, LE 디렉토리는 필요없으니 지우자.
1
2
3
4
cd/usr/share/xt_geoip/LE
sudo mv *..
cd..
sudo rm-rf LE
이렇게 xtables 최신버전을 설치하고, 국가별 IP 파일도 옮기고 나니 아래에서 설정한 내용들이 잘 적용 된다. 만세 ㅠㅠ