2009년 4월 27일 월요일

CentOS 5.3 + Kernel 2.6.29.1 + iptables 의 connlimit 모듈 설치하기

CentOS에 최신커널을 컴파일하여 넣어 보자~

iptables를 건드리다가 connlimit옵션이 먹히지 않아서 찾아보니 현재 사용중인 커널 버젼이 낮음으로 하여 먹히지 않았던 것이 였다.
간단히

# cat /proc/net/ip_tables_matches

를 통하여 현재 iptables상에 올라온 모듈들을 볼 수 있다.
connlimit 모듈이 깔리지 않은 상태에서 해당 모듈이 리스트에 뜨지 않을 것이다.

1. 최신 커널 및 iptables 소스 파일 다운로드 및 설치
현재 커널 버젼을 아래 명령어를 통하여 알아보도록 하자.

# uname -a
Linux localhost 2.6.18-128.el5 #1 SMP Wed Jan 21 10:44:23 EST 2009 i686 i686 i386 GNU/Linux

위에서 보다싶이 현재 사용중인 커널 버젼은 2.6.18이다.
http://www.kernel.org 에 접속하여 최신버젼 커널을 다운로드 받아 온다.

Kernel 2.6.29.1 => http://www.kernel.org/
Iptables 1.4.3.2 => http://www.netfilter.org/
정확히 다운로드 되었으면 다운로드 받은 커널 소스는 /usr/src에 압축을 풀고 iptables소스는 /usr/local/src/에 압축을 풀어놓는다.

# cd /tmp
# wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.29.1.tar.bz2
# wget http://ftp.netfilter.org/pub/iptables/iptables-1.4.3.tar.bz2
# tar xvfj linux-2.6.29.1.tar.bz2 -C /usr/src
# tar xvfz iptables-1.4.3.2.tar.bz2 -C /usr/local/src

작업을 좀 더 편하게 하기 위하여 미리 심볼릭 링크를 걸어 둔다.

# ln -s /usr/src/linux-2.6.29.1 /usr/src/linux

커널 소스 디렉토리로 들어갔으면 기존에 정상적으로 사용하던 커널의 환경옵션을 그대로 가져 와서 컴파일하는 것이 좋다.
/boot 디렉토리 안을 보면 이름이 config 로 시작하는 커널 환경 변수 정보가 담겨있는 파일들이 있는데 이 중 가장 최근까지 정상적으로 사용해 오던 파일을 복사해다가 /usr/src/linux 디렉토리 안에 .config 라는 이름의 파일로 저장해서 불러들이는 방식을 취하면 된다.

# cp /boot/config-2.6.18-128.el5 /usr/src/linux/.config

2. 커널 설정 및 컴파일
자~ 기본적으로 커널 설정을 하기 위한 초기 작업이 끝났다.
새로 받은 커널 소스 폴더로 이동하여 커널 설정을 해주겠다.

# cd /usr/src/linux
# make menuconfig

제일 하단에서 2번째에 있는 Load an Alternate Configuration File 메뉴를 통해 .config 파일을 로드한다.

Networking --> Networking option --> Network packet filtering framework (Netfilter) 옵션으로 들어가서
Core Netfilter Configuration을 비롯하여 넷필터, iptables 관련 모듈을 모두 체크하고 빠져 나온다.
Core Netfilter Configuration 옵션 안의 모듈들은 가급적 <M> 체크하여 모듈 형태로 저장한다.
iptables관련 모듈들은 하나가 모듈로 컴파일되면 다른 것들도 모듈로 되기를 요구하는 것 같다. connlimit 모듈은 중간 쯤에 나온다. 이해를 돕기 위하여 아래에 스크린샷을 첨부하겠다.


또한 IPv4 컨넥션 트래킹 모듈까지 설치하겠다. NAT에는 필수니까...


# make bzImage
# make modules
# make modules_install
# make install

make install하면 아래와 같은 Warning문이 뜬다.

WARNING: No module dm-mem-cache found for kernel 2.6.29.1, continuing anyway
WARNING: No module dm-message found for kernel 2.6.29.1, continuing anyway
WARNING: No module dm-raid45 found for kernel 2.6.29.1, continuing anyway

일단 커널 설치에는 영향을 주지 않으므로 건너뛰겠다.

마지막으로 grub.conf파일을 편집하여 부팅시 우리가 새로 빌드한 커널을 기본으로 로드하겠다.
/boot/grub/grub.conf를 편집기로 열고 hiddenmenu를 주석문속에 넣는다.
이렇게 하면 부팅할 때 두가지 커널을 alternative하게 선택할 수 있게 된다.
또한 우리가 새로 컴파일한 커널을 Default커널로 띠우기 위하여 default값 1을 0으로 고친다.
서버를 재부팅하면 새롭게 컴파일된 커널을 만날 수 가 있다.^^

새로 부팅하고 uname -a를 쳐보자.

# uname -a
Linux localhost 2.6.29.1 #1 SMP Mon Apr 27 15:30:11 CST 2009 i686 i686 i386 GNU/Linux

정확히 우리가 원하는 커널로 부팅이 되었음을 확인 할 수 있다. 이로써 커널 설치는 끝마리를 맺는다.

3. iptables 설치
자 이제 그럼 iptables를 새로 컴파일 하여 connlimit 모듈을 추가해보자.
일단 새로 부팅한후
# iptables -L -n
해보면 아무내용도 뜨지 않음을 발견할 수 있다.
setup을 이용하여 새로 설정을 한후 iptables 을 내렸다 올리자.

# lsmod | grep connlimit 해보면 모듈이 로드 되지 않았음을 알 수 있다.
# modprobe xt_connlimit 하여 connlimit 모듈을 로드하여 보자.
# lsmod | grep connlimit
xt_connlimit            3500  0
nf_conntrack           58828  4 xt_connlimit,nf_conntrack_netbios_ns,nf_conntrack_ipv4,xt_state
x_tables               13864  7 xt_connlimit,ip_tables,ip6t_REJECT,ip6_tables,ipt_REJECT,xt_state,xt_tcpudp

정확히 로드가 되었음을 확인 할 수 있다. (커널에 컴파일하여 넣었으니 로드가 않되면 이상하다.ㅎㅎ)

여기서는 기존의 rpm 버전 iptables를 삭제하지 않고 그 위에 소스컴파일로 덮어씌우는 방식으로 진행을 하겠다.
왜냐하면 rpm 버전을 삭제한 뒤 소스로 새롭게 설치하게 되면 기존의 rpm 버전에서 제공하던 system-config-securitylevel, lokkit, /etc/rc.d/init.d/iptables 와 같은 실행 스크립트 파일이 존재하지 않기 때문에 따로 스크립트로 구현하지 않는 한 일일이 iptables 룰을 추가해야 하는 불편함을 감수해야 한다.
다행스럽게도 iptables를 소스로 설치하게 되면 바이너리 파일, 환경설정 파일, 라이브러리 등이 rpm 버전과 거의 동일한 경로에 설치되므로 rpm 버전 위에 덮어 씌워 설치하면 기존의 관련 명령어를 그대로 활용할 수 있다는 장점이 있다. (찝찝함이 남아 있는것만은 사실이다. 허나 노가다를 줄이기 위해서는 이 방법이 최상책일 것이다.)
잠시 iptables를 중지하겠다.

# service iptables stop

# cd /usr/local/src/iptables-1.4.3.2
# ./configure
# make
# make install

이제 기존의 rpm 버전 iptables에서 사용되던 명령어들을 백업하고 새로 설치한 소스 버전의 명령어들로 교체하는 작업이 필요하다.
/sbin 디렉토리안의 iptables 관련 명령 삭제 후, /usr/local/sbin 아래에 생성된 iptables 관련 명령들을 심볼릭 링크한다.(총 8개 명령)

# cd /sbin
# mv ip6tables ip6tables.old
# mv ip6tables-restore ip6tables-restore.old
# mv ip6tables-save ip6tables-save.old
# mv iptables iptables.old
# mv iptables-restore iptables-restore.old
# mv iptables-save iptables-save.old

심볼릭 링크를 걸어줄 대상들을 확인해보자~
# ls /usr/local/sbin
ip6tables  ip6tables-multi  ip6tables-restore  ip6tables-save  iptables  iptables-multi  iptables-restore  iptables-save

# ln -s /usr/local/sbin/ip6tables /sbin
# ln -s /usr/local/sbin/ip6tables-restore /sbin
# ln -s /usr/local/sbin/iptables /sbin
# ln -s /usr/local/sbin/iptables-restore /sbin
# ln -s /usr/local/sbin/ip6tables-multi /sbin
# ln -s /usr/local/sbin/ip6tables-save /sbin
# ln -s /usr/local/sbin/iptables-multi /sbin
# ln -s /usr/local/sbin/iptables-save /sbin

iptable을 버젼을 확인 해보면...

# iptables -V
iptables v1.4.3.2

iptables가 정확히 업그레이드 되었음을 볼 수 있다.

# service iptables start
# iptables -L -n

기존에 룰들이 그대로 존재하고 있을 것이다.

connlimit 모듈을 적용해보자.

댓글 없음:

댓글 쓰기