CentOS5 Geoip 모듈 설치하기
- 꼬반
- 2015. 6. 8. 09:23
CentOS 5 및 Fedora 8, 10 버전에서는 상위 버전처럼 쉽게 설치되지 않고 직접 커널 모듈을 빌드 해주어야 한다.
1. 버전 확인
# getconf LONG_BIT
2. kernel-devel 설치하기
# cd /usr/src/kernels 확인
uname -r 로 확인한 커널버전과 동일한 devel이 설치되어 있으면 패스
그렇지 않으면 해당 버전에 맞는 devel을 직접 다운받아 설치하여 준다.
# rpm -ihv kernel-devel-2.6.??-???
3. kerenl, iptable 모듈 패치하기
<code>
# cd /usr/src
# wget http://ftp.netfilter.org/pub/patch-o-matic-ng/snapshot/patch-o-matic-ng-20080521.tar.bz2
참고로 위 파일은 Fedora 버전에서는 에러를 낸다. 해당 부분은 뒤에서 기술
# tar jxvfp patch-o-matic-ng-20100218.tar.bz2
# rpm -ihv iptables-1.3.5-5.3.el5.src.rpm
위 부분도 먼저 해당 iptables 버전을 확인하여 해당 버전에 맞는 rpm을 다운받아 설치하도록 한다.
# cd /usr/usrc/redhat/SOURCES
# tar xfj iptables-1.3.5.tar.bz2
# cd /usr/src/
# ln -s /usr/src/redhat/SOURCES/iptables-1.3.5 /usr/src/iptables
# ln -s /usr/src/kernels/2.6.18-128.1.6.el5-x86_64 /usr/src/linux
위 부분도 각 iptable, OS 커널 버전에 따라 적절하게 변경
# cd patch-o-matic-ng-20100218
# ./runme --download
# ./runme geoip
Do you want to apply this patch [N/y/t/f/a/r/b/w/q/?] y
# cd /usr/src/iptables
# make
# cd extensions
# cp libipt_geoip.so /lib64/iptables/
# cd /usr/src/linux
# make oldconfig
geoip match support (IP_NF_MATCH_GEOIP) [N/m/?] (new) m
# mv net/ipv4/netfilter/Makefile net/ipv4/netfilter/Makefile.orig
# vim net/ipv4/netfilter/Makefile
obj-m := ipt_geoip.o
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KDIR) M=$(PWD) modules
# make M=net/ipv4/netfilter
# cp net/ipv4/netfilter/ipt_geoip.ko /lib/modules/2.6.128.1.6.el5/kernel/net/ipv4/netfilter/
# chmod 744 /lib/modules/2.6.18-128.1.6.el5/kernel/net/ipv4/netfilter/ipt_geoip.ko
# depmod -a
# modprobe ipt_geoip
# lsmod | grep geoip
ipt_geoip 37000 0
x_tables 50505 4 ipt_geoip,xt_state,ip_tables,xt_tcpudp
# wget http://people.netfilter.org/peejix/geoip/tools/geoip_update.sh
# vim geoip_update.sh
### URL 변경
GEO_BIN="http://people.netfilter.org/peejix/geoip/database/20050410/geoipdb.bin"
GEO_IDX="http://people.netfilter.org/peejix/geoip/database/20050410/geoipdb.idx"
# sh geoip_update.sh
# wget http://people.netfilter.org/peejix/geoip/tools/csv2bin-20041103.tar.gz
# tar zxvfp csv2bin-20041103.tar.gz
# cd csv2bin
# make
# wget http://geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip
# unzip GeoIPCountryCSV.ZIP
# ./csv2bin GeoIPCountryWhois.csv
# iptables -A INPUT -m geoip --src-cc CN -j REJECT
</code>
이렇게 마무리.
다만 페도라에서는 iptable make 과정에서 에러가 난다.
참조 : http://www.comsvc.kr/xe/?mid=comsvc_tip02&document_srl=5440&listStyle=viewer&page=1
링크에 나와 있는 패치 파일을 받아보면 아래 내용이다.
<code>
@@ -110,7 +110,11 @@
{
const struct ipt_geoip_info *info = matchinfo;
const struct geoip_info *node; /* This keeps the code sexy */
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)
+ const struct iphdr *iph = ip_hdr(skb);
+#else
const struct iphdr *iph = skb->nh.iph;
+#endif
u_int32_t ip, j;
u_int8_t i;
@@ -276,7 +280,10 @@
}
static struct ipt_match geoip_match = {
- .name = "geoip",
+ .name = "geoip",
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,21)
+ .family = AF_INET,
+#endif
.match = &match,
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,17)
.matchsize = sizeof (struct ipt_geoip_info),
@@ -288,12 +295,20 @@
static int __init init(void)
{
+#if LINUX_VERSION_CODE >= KERNE:wqL_VERSION(2,6,21)
+ return xt_register_match(&geoip_match);
+#else
return ipt_register_match(&geoip_match);
+#endif
}
static void __exit fini(void)
{
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,21)
+ xt_unregister_match(&geoip_match);
+#else
ipt_unregister_match(&geoip_match);
+#endif
return;
}
</code>
위의 내용을 바탕으로 에러가 나는 소스를 수정하여 주고 make 하면 된다.
소스는 에러 로그에 나오는 것처럼
# cd /usr/src/linux/net/ipv4/netfilter 내에 위치한 ipt_geoip.c 파일이다.