Work/LINUX+SERVER

CentOS5 Geoip 모듈 설치하기

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 파일이다.

반응형