• 북마크
JINIYA

WEB

특정 국가나 해외에서 시스템에 악의적으로 접근하는 IP를 iptables 을 이용하여 국가별로 차단할 수 있습니다.

최고관리자
2014.02.10 16:04 18,799 0

본문

특정 국가나 해외에서 시스템에 악의적으로 접근하는 IP를 iptables 을 이용하여 국가별로 차단할 수 있습니다.

1. 참조 문서
The geoip match HOWTO (http://people.netfilter.org/peejix/geoip/howto/geoip-HOWTO.html#toc1)

2. 준비사항

1) patch-o-matic 최신버전 받기
http://ftp.netfilter.org/pub/patch-o-matic-ng/snapshot/

2) geoip update 스크립트
http://people.netfilter.org/peejix/geoip/tools/geoip_update.sh

3. kernel 과 iptables에 geoip 패치 및 모듈 생성하기

1) patch-o-matic-ng-xxxxxxxx.tar.bz2 를 압축을 풀고,

2) ./runme --download 를 실행하여 geoip 소스를 가져와서

3) ./runme geoip 를 실행하면 kernel과 iptables에 geoip 모듈소스가 설치됩니다.

4) 이제 linux 디렉토리로 이동후 make menuconfig 실행하여

5) Networking options --> IP:Netfilter Configuration --> <M> geoip match support 선택후

6) make modules 실행하면 /usr/src/linux/net/ipv4/netfilter/ipt_geoip.o 모듈이 생성됩니다.

7) make modules_install 또는 ipt_geoip.o 을 /lib/modules/XXXXX/kernel/net/ipv4/netfilter/ 하에 복사합니다.

8) 또 한 가지 iptables 소스위치에서 make 실행하면 libipt_geoip.so 이 생성됩니다.

9) make install 또는 libipt_geoip.so 을 /usr/local/lib/iptables/ 하에 복사하면 방화벽 가동준비가 끝납니다.

4. geoip database 생성하기

1) geoip_update.sh 내용중 아래의 내용을
GEO_BIN="http://www.cookinglinux.org/geoip/db/geoipdb.bin"
GEO_IDX="http://www.cookinglinux.org/geoip/db/geoipdb.idx"
다음과 같이 수정합니다.
GEO_BIN="http://people.netfilter.org/peejix/geoip/database/20050410/geoipdb.bin"
GEO_IDX="http://people.netfilter.org/peejix/geoip/database/20050410/geoipdb.idx"

2) geoip_update.sh 을 실행하면 /var/geoip/에 geoipdb.bin geoipdb.idx geoipdb.last 파일이 생성됩니다.

3) 최신의 geoip database 는 아래 주소에서 얻을 수 있습니다.
http://www.maxmind.com/download/geoip/database/

4) cvs2bin 툴을 이용하여 매월1일 업데이트 되는 geoip database를 생성합니다.

(1) 툴 다운로드후 설치
http://people.netfilter.org/peejix/geoip/tools/csv2bin-20041103.tar.gz

(2) geoip database 생성후 /var/geoip/ 에 저장
cvs2bin GeoIPCountryWhois.csv
위의 명령 실행결과 geoipdb.bin geoipdb.idx 파일이 생성됩니다.

5. ipt_geoip.o 모듈올리기

1) insmod /lib/modules/XXXX/kernel/net/ipv4/netfilter/ipt_geoip.o

2) lsmod 로 모듈이 로딩되었는지 확인합니다.

6. iptables 구문의 적정 위치에 룰셋을 추가후 messages 기록이나 아파치로그를 통하여 모니터링해 봅니다.

1) 예로 국내를 제외한 모든 해외로부터의 시스템 접근 차단하기
iptables -A INPUT -m geoip ! --src-cc KR -j DROP

2) 중국 IP 대역으로부터 들어오는 ssh 접근 차단하기
iptables -A INPUT -p tcp --dport 22 -m geoip --src-cc CN -j DROP

kernel 버전: linux-2.6.18.4
OS 버전: CentOS 4.4
- geoip설치 시 필요한 파일 목록 입니다.

tar xvfj linux-2.6.16.27.tar.bz2
tar xvfj iptables-1.3.5.tar.bz2
tar xvfz iproute2-2.6.16-060323.tar.gz
tar xvfj patch-o-matic-ng-20060626.tar.bz2
tar xvfj patch-o-matic-ng-20060511.tar.bz2
tar xvfz esfq-2.6.15.1.tar.gz
tar xvfz netfilter-layer7-v2.2.tar.gz
- linux커널소스 및 iptable 소스를 /usr/src에 압축을 풀로 linux 및 iptables로 각각 심볼릭링크를 걸어줍니다.
[root@localhost ~]# ln -s /usr/src/linux-2.6.16.27 /usr/src/linux
[root@localhost ~]# ln -s /usr/src/iptables-1.3.5 /usr/src/iptables
- iptables소스 및 커널소스를 geoip설치 시 제대로 적용할 수 있도록 패치를 합니다.
[root@localhost ~]# patch -p1 < ../netfilter-layer7-v2.2/kernel-2.6.13-2.6.16-layer7-2.2.patch

[root@localhost ~]# cd /usr/src/iptables
[root@localhost ~]# patch -p1 < ../netfilter-layer7-v2.2/iptables-layer7-2.2.patch
[root@localhost ~]# chmod +x extensions/.layer7-test

[root@localhost ~]# cd /usr/src/iproute2-2.6.16-060323
[root@localhost ~]# patch -p1 < ../esfq-2.6.15.1/esfq-iproute2.patch

[root@localhost ~]# cd /usr/src/linux
[root@localhost ~]# patch -p1 < ../esfq-2.6.15.1/esfq-kernel.patch
[root@localhost ~]# cd /usr/src/patch-o-matic-ng-20060511
[root@localhost ~]# patch -p1 < ../patch-geoip.patch
[root@localhost ~]# cd /usr/src/patch-o-matic-ng-20060626
[root@localhost ~]# patch -p1 < ../patch-connlimit.patch
[root@localhost ~]# /usr/src/patch-o-matic-ng-20060511
[root@localhost ~]# ./runme geoip nth
[root@localhost ~]# cd /usr/src/patch-o-matic-ng-20060626
[root@localhost ~]# ./runme time u32 connlimit ipp2p IPMARK ROUTE TARPIT
[root@localhost ~]# ./runme extra
만일 실행 중 아래와 같이 메시지가 발생하였을 경우
Do you want to apply this patch [N/y/t/f/a/r/b/w/q/?] y
unable to find ladd slot in src /tmp/pom-8915/net/ipv4/netfilter/Makefile (./patchlets/geoip/linux-2.6/./net/ipv4/netfilter/Makefile.ladd)
patch-o-matic-ng 의 Makefile내용을 kernel netfilter Makefile에 추가시켜 줍니다.
[root@localhost ~]# cat /usr/src/patch-o-matic-ng-20060511/patchlets/geoip/linux-2.6/net/ipv4/netfilter/Makefile.ladd >> /usr/src/linux/net/ipv4/netfilter/Makefile
[root@localhost ~]# cd /usr/src/linux
[root@localhost ~]# make menuconfig
Networking --->
[*] Networking support
Networking options --->
[*] Network packet filtering (replaces ipchains) --->
V t?chto podsekcich za?krtame, co se da:
Core Netfilter Configuration --->
IP: Netfilter Configuration --->
(M)geoip match support
iptables 및 kernel 및 iproute 소스를 컴파일 합니다.
[root@localhost ~]# cd /usr/src/iproute2-2.6.16-060323
[root@localhost ~]# make
[root@localhost ~]# make install
[root@localhost ~]# cd /usr/src/iptables
[root@localhost ~]# make
[root@localhost ~]# make install
[root@localhost ~]# cd /usr/src/linux
[root@localhost ~]# make bzImage
[root@localhost ~]# make modules
[root@localhost ~]# make modules_install
[root@localhost ~]# make install
커널컴파일을 완료된 후 컴파일한 버전의 커널로 부팅하면 이제 iptables의 geoip를 사용할 준비가 되었습니다.
사용가능한 옵션은 --src-cc와 --dst-cc이 있는데,각각 뒤에 국가코드명이 들어가면 됩니다. 예를 들면,
# 일본과 미국에서의 웹 접속을 차단하고 다른 곳에서의 접속은 허용하고자 할 때
[root@localhost ~]# iptables -A INPUT -p tcp --dport 80 -m geoip --src-cc JP,US -j DROP
[root@localhost ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# 한국에서의 ftp만 허용하고 나머지 국가에서의 접속은 차단하고자 할 때
[root@localhost ~]# iptables -A INPUT -p tcp --dport 21 -m geoip --src-cc KR -j ACCEPT
[root@localhost ~]# iptables -A INPUT -p tcp --dport 21 -j DROP
[root@localhost ~]# iptables -A INPUT -p tcp --dport 21 -m geoip --src-cc KR -j ACCEPT
# 중국에서의 웹 접속을 차단하고 다른 곳에서의 접속은 허용하고자 할 때
[root@localhost ~]# iptables -A INPUT -p tcp --dport 80 -m geoip --src-cc CN -j DROP
[root@localhost ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
** 국가별 코드 **
대한민국 KR
네덜란드 NL
싱가포르 SG
포르투칼 PT
중국 CN
미국 US
일본 JP
독일 DE
호주 AU
Kernel 2.6.22 geoip, connlimit적용
SMILESERV
Jump to: navigation, 찾기


1. patch-o-matic-ng, iptables, 커널 소스, geoip-match-patch 다운로드
patch-o-match-ng --> ftp.netfilter.org/pub/patch-o-matic-ng/snapshot/
IPTABLES --> ftp.netfilter.org/pub/iptables
KERNEL --> ftp.kernel.org/pub/linux/kernel
geoip-match.patch -->http://bjerkeset.com/patches/geoip-match-2.6.22.patch.gz
* 되도록 /usr/src로 해당 파일들을 위치시키는 것이 오류가 나지 않음
커널 make시에 용량이 커지므로 /usr 파티션 용량이 모자랄경우 다른 파티션에 커널 이미지를 풀고
ln -s 커널이미지경로 /usr/src/linux로 심볼릭 링크를 걸어준다.
2. geoip, connlimit 커널에 패치
tar xfz patch-o-matic-ng-XXXXXX.tar.gz
cd patch-o-matic-ng
IPTABLES_DIR=/usr/src/iptables KERNEL_DIR=/usr/src/linux ./runme --download --> patch-o-matic에서 geoip 및 기타 다른 패키지를 자동으로 다운로드 하여 설치
IPTABLES_DIR=/usr/src/iptables KERNEL_DIR=/usr/src/linux ./runme geoip --> 커널에 geoip 패치
IPTABLES_DIR=/usr/src/iptables KERNEL_DIR=/usr/src/linux ./runme connlimit --> 커널에 connlimit 패치
cd /usr/src/linux/net/ipv4/netfilter/
cp /usr/src/geoip-match-2.6.22.patch /usr/src/linux/net/ipv4/netfilter/
patch -p1 < geoip-match.patch --> 위 명령 실행시 패치 할 원본 파일을 묻게되며 원본 파일은 ipt_geoip.c를 입력해야 하며 커널 2.6.22는 ipt_geoip.c를 패치해 주어야 make에서 오류가 발생하지 않음
3. 커널 컴파일 --> 커널 컴파일 관련 모든 명령은 커널소스 디렉토리 내에서 실행해야함
3-1 make memuconfig 아래 항목에서 geoip 및 connlimit선택, connlimit의 경우 해당 Netfilter Configuration 하위 메뉴에 있는 모든 메뉴를 선택해 주어야 make상에서 오류가 발생하지 않음 -> Device Drivers -> Networking support -> Networking support -> Networking options -> Network packet filtering (replaces ipchains) -> IP: Netfilter Configuration -> [*] geoip match support
3-2 make --> 커널 버전 변동없이 geoip만 추가 할 경우는 아래의 순서로 컴파일을 진행함
make oldconfig
make modules
make modules_install

3-3 make modules
3-4 make modules_install
3-5 make install
4. 국가 DB 최신 정보로 업데이트
geoip 모듈은 /var/geoip 경로의 DB파일 참조함
- CSV 파일 변환 wget http://people.netfilter.org/peejix/geoip/tools/csv2bin-20041103.tar.gz tar zxfp csv2bin-20041103.tar.gz cd csv2bin make
- 국가별 DB 다운로드 wget http://www.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip unzip GeoIPCountryCSV.zip ./csv2bin ../GeoIPCountryWhois.csv mkdir /var/geoip cp geoipdb.bin /var/geoip/ cp geoipdb.idx /var/geoip/
cp /usr/src/iptables/iptables /sbin -> iptables 소스파일의 iptables를 /sbin으로 복사
5. IPTABLES geoip 룰 적용
예제)
- 일본과 미국에서의 웹 접속을 차단하고 다른 곳에서의 접속은 허용할 때
iptables -A INPUT -p tcp --dport 80 -m geoip --src-cc JP,US -j DROP
iptables -A INPUT -p tcp --dport 80 -j ACCEPT

- 한국에서의 ftp만 허용하고 나머지 국가에서의 접속은 차단하고자 할 때
iptables -A INPUT -p tcp --dport 21 -m geoip --src-cc KR -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -j DROP
또는 iptables -A INPUT -p tcp --dport 21 -m geoip ! --src-cc KR -j DROP
출처 : http://seri.egloos.com/


iptables를 이용하여 geoip적용하는 방법입니다.
(과거버젼에 대한 글은 많이 있으나 최신 iptables에 대한 글은 아직 없는것 같네요.)

시스템 사양
centos5.3(os는 사실 상관이 없어요.)
iptables 1.4.3 이상
geoip
xtables-addons

wget http://nchc.dl.sourceforge.net/sourceforge/xtables-addons/xtables-addons-1.15.tar.bz2
wget http://www.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip
wget http://jengelh.medozas.de/files/geoip/geoip_src.tar.bz2
wget ftp://ftp.netfilter.org/pub/iptables/iptables-1.4.3.2.tar.bz2

이렇게 다운 iptables-1.4.3.2.tar.bz2 압축을 풀고 ./configure 후 make, make install 로 설치
xtables-addons 파일압축을 풀고 ./configure --with-xtables=/usr/local 후 make를 하면
centos 5.3의 경우 몇가지 에러가 발생하는데

다음과 같은 오류인 경우 말 그래도 해더에 중복선언이 되어서 발생되는 문제로

make[3]: Entering directory `/usr/src/kernels/2.6.18-128.1.10.el5-x86_64'
CC [M] /root/pp/t/xtables-addons-1.15/extensions/compat_xtables.o
In file included from /root/pp/t/xtables-addons-1.15/extensions/compat_xtables.c:20:
/root/pp/t/xtables-addons-1.15/extensions/compat_skbuff.h:29: error: redefinition of 'skb_reset_network_header'
include/linux/skbuff.h:1016: error: previous definition of 'skb_reset_network_header' was here
/root/pp/t/xtables-addons-1.15/extensions/compat_skbuff.h:33: error: redefinition of 'tcp_hdr'
include/linux/tcp.h:169: error: previous definition of 'tcp_hdr' was here
/root/pp/t/xtables-addons-1.15/extensions/compat_skbuff.h:37: error: redefinition of 'udp_hdr'
include/linux/udp.h:33: error: previous definition of 'udp_hdr' was here
In file included from /root/pp/t/xtables-addons-1.15/extensions/compat_xtables.c:21:
/root/pp/t/xtables-addons-1.15/extensions/compat_xtnu.h:9: error: redefinition of typedef 'bool'
include/linux/types.h:36: error: previous declaration of 'bool' was here
/root/pp/t/xtables-addons-1.15/extensions/compat_xtnu.h:10: error: redeclaration of enumerator 'false'
include/linux/stddef.h:16: error: previous definition of 'false' was here
/root/pp/t/xtables-addons-1.15/extensions/compat_xtnu.h:10: error: redeclaration of enumerator 'true'
include/linux/stddef.h:18: error: previous definition of 'true' was here
/root/pp/t/xtables-addons-1.15/extensions/compat_xtables.c: In function 'xtnu_ip_route_me_harder':
/root/pp/t/xtables-addons-1.15/extensions/compat_xtables.c:376: error: too many arguments to function 'ip_route_me_harder'

=> 다음 부분을 찾아서 주석처리한다.

vim xtables-addons-1.15/extensions/compat_skbuff.h
/*static inline void skb_reset_network_header(struct sk_buff *skb)
{
skb->nh.raw = skb->data;
}
static inline struct tcphdr *tcp_hdr(const struct sk_buff *skb)
{
return (void *)skb_transport_header(skb);
}
static inline struct udphdr *udp_hdr(const struct sk_buff *skb)
{
return (void *)skb_transport_header(skb);
}*/

vim xtables-addons-1.15/extensions/compat_xtnu.h
9~10라인
/*typedef _Bool bool;
enum { false = 0, true = 1, };
*/

마지막으로 vim xtables-addons-1.15/extensions/compat_xtables.c 372라인을 찾아서

#if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 17) 를
#if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 18) 로 수정

그런뒤에 make , make install 하면 설치 완료...

이제 mkdir -p /var/geoip/LE 로 폴더를 생성하고 geoip_src.tar.bz2 앞축을 풀면
나오는 파일중에 geoip_csv_iv0.pl 파일을 /var/geoip/LE로 복사
cd /var/geoip/LE
해당 폴더에서 GeoIPCountryCSV.zip 파일을 앞축을 푼다.
GeoIPCountryWhois.csv 파일이 있는지 확인하고
./geoip_csv_iv0.pl GeoIPCountryWhois.csv 이렇게 하면 국가별로 KR.iv0 같은 파일이 생성이 됨.
만약 geoip_csv_ip0.pl실행시 에러가 나는 경우
perl -MCPAN -e shell
install Getopt::Long
install IO::Handle
install Text::CSV_XS
를 실행

모두 정상적으로 실행이 되었다면,
iptables -A INPUT -p tcp --dport 80 -m geoip --src-cc CN -j DROP
해서 정상적으로 동작하는지 확인 후 별도이 메시지가 없으면 성공입니다. :)

댓글목록 0

등록된 댓글이 없습니다.
전체 51 건 - 1 페이지
제목
지니야 77 2019.03.20
지니야 52 2019.03.19
지니야 81 2019.03.19
지니야 75 2019.03.10
최고관리자 172 2019.02.02
최고관리자 224 2019.02.02
최고관리자 112 2019.01.26
최고관리자 159 2019.01.24
최고관리자 123 2019.01.24
최고관리자 493 2019.01.24
최고관리자 194 2019.01.08
최고관리자 481 2019.01.02
최고관리자 126 2018.12.31
지니야 506 2018.12.24
최고관리자 184 2018.12.22
최고관리자 181 2018.12.04
최고관리자 209 2018.11.27
최고관리자 6,386 2018.11.27
최고관리자 279 2018.11.26
최고관리자 329 2018.11.24