centos5 geoip patch하기

다즐링의 이미지

centos 5 용 geoip 패치 방법 및 커널 커스텀 rpm
간략버젼입니다.
참조에 있는 URL 들을 보시면 됩니다. 단지 기억하기 위한 한글버젼입니다.

참조:http://irdeal.tistory.com/5 CentOS 커널 rpm 빌드하기
위의 글의 원본이자 업데이트 본은 http://wiki.centos.org/HowTos/Custom_Kernel 입니다.

참조:http://www.debian-administration.org/articles/518 Country-based packet filtering with iptables

1. yum groupinstall "Development Tools"
2. yum install kernel-devel
3. yum install rpm-build rpm-libs

이정도로 개발툴은 대충 끝납니다.
커널소스rpm 이 깔렸는지 확인합니다.

/usr/src/redhat/SPECS 디렉에 가서 다음과 같이 실행합니다.
rpmbuild -bp --target=`uname -m` kernel.spec
그러면 /usr/src/redhat/BUILD 디렉토리에 커널소스가 풀리고 패치가 적용됩니다.

커널을 rpm 으로 만들기 위해서 일단 기존의 디렉토리들을 백업해둡니다. ( 패치 파일로 만들기 위해 )

그럼 이제 geoip 를 위해서 소스를 받아봅니다.
커널을 위한 p-o-m 패치와 iptables 를 새로 컴파일 해야합니다.
http://ftp.netfilter.org/pub/patch-o-matic-ng/snapshot/ 여기서 p-o-m 을 받습니다.
http://ftp.netfilter.org/pub/iptables/ 여기서 iptables를 받습니다.

적절한 디렉토리에 둘다 소스를 풉니다.
p-o-m 을 먼저 깝니다. 디렉토리에 진입후에
KERNEL_DIR=<> \
IPTABLES_DIR=<> \
./runme --download
를 해줍니다. ( 이부분이 현재 바뀐 부분입니다. )
그러면 geoip등의 패치를 웹에서 받아서 패치 해줍니다.
( download 하지 않을 경우엔 geoip는 패치 안됩니다. )
위와같이 하고 --download 대신에 geoip 를 넣어서 geoip 를 패치해줍니다.

rpm용 커널의 설정파일을 복사합니다.
cd /usr/src/redhat/BUILD/kernel-버젼/linux-버젼
cp /usr/src/redhat/SOURCES/kernel-버젼-아키텍쳐.config .config

커널을 설정합니다.
make menuconfig
위의 부분에서 geoip 만 모듈로 해주었습니다.

패치파일을 만듭니다. diff 사용법은 검색하면 많이 나옵니다.

그리고 .config 파일의 제일 윗 부분에 다음과 같이 적습니다.
# i386 <-- 64비트가 아닌경우
# x86_64 <-- 64비트인 경우만

그리고 아까의 rpm 설정을 반대로 소스에 복사해줍니다.
cp /usr/src/redhat/BUILD/kernel-버젼/linux-버젼/.config /usr/src/redhat/SOURCES/kernel-버젼-아키텍쳐.config

spec 파일을 수정해줍니다.
/usr/src/redhat/SPECS/kernel.spec 파일을 수정해줍니다.
커널 버젼등의 수정은 알아서 하실것이고.
패치파일을 잘 등록합니다. -__-;;; ( 너무 무책임한가.. )
단 이때 spec에서 #define buildxen 0 로 해줍니다.
xen에는 p-o-m 이든 뭔가 안맞는거 같은데.. 필요가 없어서 고려 않해봤습니다.

rpmbuild -ba --target=`uname -m` kernel.spec

으로 빌드하면 됩니다.

댓글

소타의 이미지

추천 한방 & 위로 올리기;

김정균의 이미지

kernel 을 굳이 빌드할 필요는 없습니다. kernel-devel package 만 있으면 geoip kernel module 만 빌드하면 되죠. 아래 스크립트는 제가 회사에서 사용하는 것입니다. 즉 커널 업데이트 후에 리부팅시에 알아서 모듈 반영이 되죠 :-)

bigmem kernel 을 사용한다면, kernel-devel 을 yum 으로 설치 하는 부분만 잘 맞춰 주시면 사용하는데 별 무리는 없을 겁니다.

#!/bin/sh
 
CURRENT_KERNEL=$(uname -r)
mod_target=/lib/modules/${CURRENT_KERNEL}/kernel/net/ipv4/netfilter
src_target=/lib/modules/${CURRENT_KERNEL}/build
 
# check kernel devel package
if [ ! -d "${src_target}" ]; then
    echo ${CURRENT_KERNEL} | grep largesmp >& /dev/null
 
    if [ $? -eq 0 ]; then
        yum -y install kernel-largesmp-devel >& /dev/null
    else
        echo ${CURRENT_KERNEL} | grep smp >& /dev/null
        if [ $? -eq 0 ]; then
            yum -y install kernel-smp-devel >& /dev/null
        else
            yum -y install kernel-devel >& /dev/null
        fi
    fi
fi
 
# geoip module check
if [ -f "${mod_target}/ipt_geoip.ko" ]; then
    exit 0
fi
 
# geoip kernel module build & install
pushd ${src_target} >& /dev/null
    if [ ! -f "net/ipv4/netfilter/ipt_geoip.c" ]; then
        patch -p1 < /usr/share/iptables/geoip/geoip-kernel.patch
    fi
 
 
    mv net/ipv4/netfilter/Makefile net/ipv4/netfilter/Makefile-backup-geoip
    install -m644 /usr/share/iptables/geoip/Makefile-geoip \
                net/ipv4/netfilter/Makefile
    make M=net/ipv4/netfilter modules
    make M=net/ipv4/netfilter modules_install
    mv net/ipv4/netfilter/Makefile-backup-geoip net/ipv4/netfilter/Makefile
popd >& /dev/null
 
if [ -f "${mod_target}/ipt_geoip.ko" ]; then
    depmod -a
else
    exit 1
fi
 
exit 0
김정균의 이미지

아 빼먹은 것이 있군요. 위의 script 를 사용하려면 /usr/share/iptables/geoip/ 디렉토리를 생성 하신 후에,

cd /usr/share/iptables/geoip
tar xvfpz geoip-src.tar.gz

과 같이 진행해 주시면, 위의 script 까지 설치가 됩니다. 그리고 yum 을 사용할 수 있는 환경이라면, 그냥 /usr/share/iptables/geoip/geoip-check 를 실행하면 현재 커널의 geoip module 을 생성해 줍니다. rc script 에 걸어 놓으면 커널 업데이트 후 부팅시에 자동으로 geoip module 을 생성해 올려 주겠죠. ^^;

아래 첨부파일의 커널 패치는 RHEL5 에서는 안될 겁니다. RHEL5 에서는 패치를 새로 만들어야 합니다. (2.6.16 이상의 netfilter 변경 사항이 반영이 안되어 있거든요. RHEL4/CentOS4 용입니다.)

댓글 첨부 파일: 
첨부파일 크기
Binary Data geoip-src.tar.gz4.47 KB
익명 사용자의 이미지

centos5 에서 geoip해보려고 열심히 따라 하고있는데, 이거랑 원문봐도 spec파일수정과 패치파일등록을 잘 모르겠네요^^;

보통 패치할때 patch -p1 < 패치파일 .. 아닌가요?

spec 에서 #define buildxen 0 으로만 수정한상태인데 이다음에 어떻게 해야할까요? 괜찮으시다면 답변 부탁드립니다^^;
--

spec 파일을 수정해줍니다.
/usr/src/redhat/SPECS/kernel.spec 파일을 수정해줍니다.
커널 버젼등의 수정은 알아서 하실것이고.
패치파일을 잘 등록합니다. -__-;;; ( 너무 무책임한가.. )
단 이때 spec에서 #define buildxen 0 로 해줍니다.
xen에는 p-o-m 이든 뭔가 안맞는거 같은데.. 필요가 없어서 고려 않해봤습니다.

rpmbuild -ba --target=`uname -m` kernel.spec

으로 빌드하면 됩니다.

김정균의 이미지

커널 빌드 안하고, GeoIP 모듈만 빌들 할 수 있도록 하는 문서를 만들어 보았습니다.
RHEL/CentOS 4,5 에서 가능하도록 정리해 놓았으니 참고하시기 바랍니다.

http://my.oops.org/117

단풍의 이미지

ip_tables: geoip match: invalid size 0 != 96

위와 같은 메시지가 나올때는 geoip 커널 모듈 파일이 실행 권한이 없을 경우 나타 납니다.

chmod 744 ipt_geoip.ko

RHEL 4,5 버전은 위 글에서 받아서 하시면 되고

Fedora Core 8 버전은
ipt_geoip.c 패치를 해줘야 합니다.

diff -urN geoip-20061206/linux-2.6/net/ipv4/netfilter/ipt_geoip.c geoip/linux-2.6/net/ipv4/netfilter/ipt_geoip.c
--- geoip-20061206/linux-2.6/net/ipv4/netfilter/ipt_geoip.c 2006-12-06 03:47:46.000000000 +0100
+++ geoip/linux-2.6/net/ipv4/netfilter/ipt_geoip.c 2007-07-10 17:17:11.599991698 +0200
@@ -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 >= KERNEL_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;
 }

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.