인생에 뜻을 세우는데 있어 늦은 때라곤 없다

WEB/Server

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

projin 2016. 7. 27. 10:51
특정 국가나 해외에서 시스템에 악의적으로 접근하는 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
해서 정상적으로 동작하는지 확인 후 별도이 메시지가 없으면 성공입니다. :)


LIST