### 64bit O/S환경 GEOIP 모듈 적재
환경 : CentOS 5.3 64Bit
1. 먼저 YUM으로 커널을 업데이트 한다
[root@ns ~]# yum update kernel
[root@ns ~]# yum update kernel-devel
[root@ns ~]# yum install yum-utils
리부팅
yum의 서버를 국내서버를 이용하기 이용서 yum 리스트를 추가해 준다
[root@ns ~]# vi /etc/yum.repos.d/CentOS-Base.repo
추가
[centossrpm]
name=CentOS-$releasever – SRPMS
baseurl=ftp://ftp.daum.net/centos/$releasever/os/SRPMS/
#yum-fastestmirror를 사용하고 있다면 baseurl을 사용하지 말고 mirrorlist를 복사해 적당히 수정후
#사용해도 됩니다만 저의 경우 daum서버가 쾌적한 환경(?)을 제공해 직접 설정했습니다.
gpgcheck=1
enabled=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-5
### iptables 소스 다운로드
[root@ns ~]# yumdownloader –source iptables
[root@ns ~]# cd /usr/src
[root@ns src]# wget http://mirror.koreaidc.com/kernel/patch-o-matic-ng-20071231.tar.bz2
[root@ns src]# tar xvfj patch-o-matic-ng-20071231.tar.bz2
[root@ns src]# cd /root
### iptables 소스를 푼다
[root@ns ~]# rpm -ivh iptables-1.3.5-5.3.el5.src.rpm
## 이 경로로 접속하면 소스 파일이 보인다 이 파일을 압축을 푼다
[root@ns ~]# cd /usr/src/redhat/SOURCES
[root@ns SOURCES]# tar xvfj iptables-1.3.5.tar.bz2
patch-o-matic-ng 패치를 가하기 위해 아래와 같이 kernel 소스와 iptables 소스가 위치한 곳을 심볼릭링크를 해준다
patch-o-matic-ng가 default로 찾는 커널과 iptables의 경로가 /usr/src 이기 때문에 하는 작업이죠.
[root@ns SOURCES]# cd /usr/src
[root@ns src]# ln -s /usr/src/redhat/SOURCES/iptables-1.3.5 /usr/src/iptables
[root@ns src]# ln -s /usr/src/kernels/2.6.18-164.6.1.el5-x86_64 /usr/src/linux
이제 커널과 iptables에 patch-o-matic-ng 패치를 한다
[root@ns src]# cd /usr/src/patch-o-matic-ng-20071231
[root@ns patch-o-matic-ng-20071231]# ./runme –download
y 엔터
y 엔터
[root@ns patch-o-matic-ng-20071231]# ./runme geoip
y엔터
위에서 압푹 푼 iptables의 extensions 경로에 geoip 패치파일이 있는지 확인한다
[root@ns patch-o-matic-ng-20071231]# ls -l /usr/src/iptables/extensions | grep geoip
-rw-r–r– 1 root root 9518 11월 30 15:45 libipt_geoip.c
-rw-r–r– 1 root root 817 11월 30 15:45 libipt_geoip.man
/usr/src/iptables 디렉토리 안에서 make 해준다
[root@ns patch-o-matic-ng-20071231]# cd /usr/src/iptables/
[root@ns iptables]# make
xtension 디렉토리에 들어가면 libipt_geoip.so 파일이 생성되어 있는 것을 확인한다
[root@ns iptables]# cd extensions/
[root@ns extensions]# ls -l | grep libipt_geoip.so
-rwxr-xr-x 1 root root 9563 11월 30 15:48 libipt_geoip.so
libipt_geoip.so 파일을 /lib/iptables 디렉토리 안에 복사해 넣어주면 iptables 관련 작업은 끝난다
(복사할때 32bit o/s면 lib/iptables 에 64bit o/s면 lib64/iptables 에 복사하면 된다)
[root@ns extensions]# cp libipt_geoip.so /lib64/iptables/
이제 커널에 geoip모듈을 올리기 위한 작업을 한다
[root@ns extensions]# cd /usr/src/linux
[root@ns linux]# make oldconfig
여기서 기본 엔터를 입력한다
[root@ns linux]# make modules_prepare
[root@ns linux]# mv net/ipv4/netfilter/Makefile net/ipv4/netfilter/Makefile.orig
[root@ns linux]# vi 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
[root@ns linux]# make M=net/ipv4/netfilter
[root@ns linux]# cp net/ipv4/netfilter/ipt_geoip.ko /lib/modules/2.6.18-164.6.1.el5/kernel/net/ipv4/netfilter/
[root@ns linux]# chmod 744 /lib/modules/2.6.18-164.6.1.el5/kernel/net/ipv4/netfilter/ipt_geoip.ko
모듈인식 작업
[root@ns linux]# depmod -a
모듈이 인식되었는지 확인한다
[root@ns linux]# ls -l /lib/modules/2.6.18-164.6.1.el5/kernel/net/ipv4/netfilter | grep geoip
-rwxr–r– 1 root root 219869 11월 30 15:58 ipt_geoip.ko
[root@ns linux]# modprobe ipt_geoip
[root@ns linux]# lsmod | grep geoip
ipt_geoip 37000 0
x_tables 50505 7 ipt_geoip,ipt_REJECT,xt_state,ip_tables,ip6t_REJECT,xt_tcpudp,ip6_tables
### GEOIP DATABASE 추가
[root@ns linux]# cd /root
[root@ns ~]# wget http://mirror.koreaidc.com/kernel/csv2bin-20041103.tar.gz
[root@ns ~]# tar xvfz csv2bin-20041103.tar.gz
csv2bin/COPYING
csv2bin/csv2bin.c
csv2bin/Makefile
csv2bin/README
[root@ns ~]# cd csv2bin
[root@ns csv2bin]# make
gcc -g -c -Wall -D_GNU_SOURCE csv2bin.c
gcc -g csv2bin.o -o csv2bin
[root@ns csv2bin]# cd /root
[root@ns ~]# wget http://geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip
[root@ns ~]# unzip GeoIPCountryCSV.zip
Archive: GeoIPCountryCSV.zip
inflating: GeoIPCountryWhois.csv
[root@ns ~]# mv GeoIPCountryWhois.csv csv2bin
[root@ns ~]# cd csv2bin
[root@ns csv2bin]# chmod 755 GeoIPCountryWhois.csv
[root@ns csv2bin]# ./csv2bin ./GeoIPCountryWhois.csv
csv2bin을 이용하여 geoip 관련 파일이 생성되었다 이것을 경로를 만들어줘서 복사해준다
[root@ns csv2bin]# mkdir mkdir /var/geoip
[root@ns csv2bin]# cp geoipdb.* /var/geoip/
이제 모든 작업은 완료되었다
실제 geoip모듈이 정상적으로 올라왔는지 iptables 를 이용하여 명령어를 입력해본다
[root@ns csv2bin]# iptables -A INPUT -p tcp –dport 21 -m geoip –src-cc KR -j ACCEPT
아무런 에러가 발생되지 않으면 정상적으로 모듈을 올린것이다.
여기서 중요한것이 나는 현재 Ooops Firewall를 사용한다 근데 이상하게 이 oops를 재시작하면
geoip모듈이 올라오지 않는것이다..
(32bit에서는 이상이 없으나 이상하게 64bit에서는 이 증상이 나타나네)
위 작업이 모두 도루묵되나 싶었다 젠장 ㅠㅠ
하지만 엔지니어라면 뭔가 다른 방법을 찾아야 하지 않나.
소스를 분석해 보았으나 아직 그정도의 실력은 아니라 패스…
그래서 해결한 것이 oops-firewall 을 좀 더 높은 버전으로 설치하면 된다
내가 설치한 버전은 oops-firewall-6.2.6-1 이 버전으로 설치하면 위 증상이 없어진다.