강좌
클라우드/리눅스에 관한 강좌입니다.
리눅스 분류

▒ iptables 에 string 모듈 올리기 (커널 컴파일)

작성자 정보

  • 웹관리자 작성
  • 작성일

컨텐츠 정보

본문


▒ iptables 에 string 모듈 올리기 (커널 컴파일)

 

   여러분 !! 왜 사람들이 삽질한다구 할까요?
곰곰히 생각해 봤습니다. 전 iptables 와 커널 컴파일을 팠습니다. 파기위해서는 삽이 필요하겠죠??
전 그래서 삽질을 했습니다... 위 부분에 관한 문서는 국내 문서가 부족하고, 영어로 된 것 또한 너무 오래된 것이라서...
전 RedHat 9 에 현재 최신커널인 2.4.27 버전 iptables 1.2.11 으로 삽질해 보겠습니다. ...
ㅠㅠ 돈 많이 벌어서 포크레인 하나 구입해야겠습니다.  삽질 그만 하려구요 ㅠㅠ
(책임의 한계) 본 강좌로 인한 어떠한 결과에 대해서도 책임을 지지않습니다.

0. 준비운동
  왜 이런 강좌를 쓸까요?  조금더 서버를 안전하게 운영하려고 합니다.
  왜? 이런 좋은 기능을 여러 배포판에는 넣어두지 않았을까요? 개발중인 버전이라고 합니다.(아직도..ㅠㅠ)
  설치하기 전에 컴파일러는 기본입니다. 혹시라도 컴파일러가 설치되지 않으신분들은 아래의 패키지들을
  쫙~~ 설치 하시기 바랍니다. (컴파일러 없는 환경에서 컴파일 하다 설치하게 된 패키지들입니다.)
  모두 RedHat 9 기반이니 .. 다른 버전이라면, superuser.co.kr 메인 사이트에 rpm 검색기능을 이용하면 금방 ~~
  찾을 수 있습니다.
####### RH9 기준 컴파일러 설치 #############################
rpm -Uvh http://ftp.superuser.co.kr/pub/redhat/9/RPMS/binutils-2.13.90.0.18-9.i386.rpm
rpm -Uvh http://ftp.superuser.co.kr/pub/redhat/9/RPMS/cpp-3.2.2-5.i386.rpm
rpm -Uvh http://ftp.superuser.co.kr/pub/redhat/9/RPMS/glibc-kernheaders-2.4-8.10.i386.rpm
rpm -Uvh http://ftp.superuser.co.kr/pub/redhat/9/RPMS/glibc-devel-2.3.2-11.9.i386.rpm
rpm -Uvh http://ftp.superuser.co.kr/pub/redhat/9/RPMS/gcc-3.2.2-5.i386.rpm
## make menuconfig 하기 위해서 아래 패키지 필요
rpm -Uvh http://ftp.superuser.co.kr/pub/redhat/9/RPMS/ncurses-5.3-4.i386.rpm
rpm -Uvh http://ftp.superuser.co.kr/pub/redhat/9/RPMS/ncurses-devel-5.3-4.i386.rpm
## patch 패키지가 없으면 안되니~~
rpm -Uvh http://ftp.superuser.co.kr/pub/redhat/9/RPMS/patch-2.5.4-16.i386.rpm


1. 파일 다운로드 및 압축 해제
  
(1) 작업장으로 이동 (/usr/src)
    cd /usr/src
    여기서 작업하는 이유는 따로 있지 않습니다. 커널 컴파일 할 때 대부분 여기서 합니다.

  (2) 파일을 가져옵니다.
  wget wget http://kernel.org/pub/linux/kernel/v2.4/linux-2.4.27.tar.bz2
  wget http://
www.netfilter.org/files/iptables-1.2.11.tar.bz2
  wget http://
www.netfilter.org/files/patch-o-matic-ng-20040621.tar.bz2
   현재 최신버전들입니다. 시간이 혹시 조금 지났으면. kernel.org 와 netfilter.org 에 들어가셔서 최신버전을 받으시기 바랍니다.

  (3) 압축 해제
   tar xvfj linux-2.4.27.tar.bz2
   tar xvfj iptables-1.2.11.tar.bz2
   tar xvfj patch-o-matic-ng-20040621.tar.bz2


2. string 패치
 
 - 커널 컨피그에서 string 옵션이 나오게 커널 소스 패치를 합니다.
      cd patch-o-matic-ng-20040621
      IPTABLES_DIR=../iptables-1.2.11 KERNEL_DIR=../linux-2.4.27 ./runme extra  
   위와같이 runme 라는 명령어를 실행시킵니다. 앞에 설정들은 iptables와 Kernel 작업디렉토리를 명시합니다.
   이 명령어를 위 명령어를 실행시키면 아주 아주 이상한 화면이 나타납니다. 첨엔 당황했습니다. 뭘까??  어떤 강좌를 찾아봐도 설명이 없었죠. 그래서 자세히 읽어 봤더니 여러 가지 패치가 있는데 편하게 골루어서 할 수 있도록 도와주는 일종의 툴이더군요^^; 하지만 string 패치만 하면 되는 우리에겐 너무 너무 귀찮은 존재입니다.
patch.gif너무 너무 이상하게 생겨서 이렇게 캡쳐했습니다.
자.. 지금부터 노가다 해야 합니다.  
 n 이라는 키를 무려 69번 정도 누르면 원하는 string 패치가 나타납니다.
처음 설치하시는 분들은 어떤 어떤 모듈이 있나.. 살펴 보시는 것도 좋을 것 같지만, 69개나 봐야 한다니.ㅠㅠ
n은 위에서 보시는 것과 같이 패치하지 않고 skip 하는 것입니다.
string_patch.gif
 위와같이 string patch 가 나타납니다. 여기서 y를 눌러서 패치를 실행합니다. 이 패치가 전부니 패치가 끝나면, q를 눌러 패치작업을 끝내시면 됩니다.
cd ..

3. 커널 컴파일
  
(1) 작업장 청소
      방금 압축을 해제해서 깨끗한 상태이겠지만, 그래도 작업장을 깨끗히 청소 합니다.
   cd linux-2.4.27
   make mrproper
   make clean

  (2) 컨피그(환경설정)
     커널 컴파일에서 이 부분이 가장 어렵습니다. 많은 지식이 필요하고 실수하기 쉬운 부분입니다. 실수했다면 다시 컴파일 하는 그 아까운 시간을 보내야 합니다. 새로 추가된 커널에는 많은 기능들이 있기 때문에 업그래이드 될 때마다 하나 하나 따져가며 컴파일 하지 못하기 때문에 설치시 사용했었던 커널의 환경설정파일을 복사해서 사용합니다.
  RedHat을 설치했다면 /boot 파티션에 config-버전 이라는 파일이 존재합니다. 이 파일을 .config 파일으로 복사해주면 사용하고 있는 커널의 환경과 똑같이 맞추어집니다. (아래는 RedHat 9.0 기본 환경설정파일입니다.) 
cp /boot/config-2.4.20-8 .config
 이젠 추가 기능을 선택하기 위해서 menuconfig를 사용할 것입니다. xwindow 가 설치되지 않은 상태에서는 이 방법이 최고 더군요. 이 menuconfig를 사용하기 위해서는 ncurses 관련 패키지가 필요합니다. (준비운동 단계에 있습니다.)
make menuconfig
make_menuconfig_top.gif
 여기서  Network device support  --->  를 선택합니다.
make_menuconfig_networking_options.gif 
여기서 IP: Netfilter Configuration  --->  를 선택합니다.
make_menuconfig_netfilter_configuration.gif   
위그림에서 < >   String match support (EXPERIMENTAL) (NEW)  이렇게 되어있는 부분을 선택하소 스페이스 키를 눌러 줍니다. 그러몀   String match support (EXPERIMENTAL) (NEW) 이렇게 바뀌게 됩니다. 중간에 M 이라는 것은 모듈 방식을 의미합니다. 이 항목은 위에서 패치 했기 때문에 나타나는 항목입니다.^^
그리고 ESC 키를 여러번 눌러 빠져 나옵니다. 빠져나오는 순간 저장하겠냐고 묻습니다. 물론 저장 합니다.

 (3) 의존성 검사
 이렇게 항목들을 선택하였다면 기본적으로 의존성 검사를 해야 합니다.
make dep

 (4) 컴파일
 위 의존성 검사에서 문제가 없다면(대부분 문제가 없죠^^) 컴파일 합니니다.
make

 (5)  커널 이미지 생성
 커널 이미지를 만듦니다. 이미지는 여러 종류를 만들 수 있지만, 서버 운영에 필요한 이미지는 대부분 bzImage를 생성합니다.
make bzImage

 (6) 모듈을 컴파일
 환경설정 항목에서 M (모듈방식)으로 선택한 것들을 컴파일 합니다. 커널의 대부분의 기능들은 모듈로 합니다. 필요할 때 불러쓰고 필요없을 때는 내려 놓기 위함이죠. 모듈들이 엄청 많기 때문에 시간또한 엄청 걸립니다.

make modules
테스트 결과 대충 이렇습니다.
p-3 550M(512k) RAM64M SCSI 4G : 약 1시간 20분 
P-3 800M*2 Ram 195M IDE40G (7200) :  약 46분
p-3 1G*2 Ram 256 IDE40G(7200) :  약 36분
p-3 1G*2 Ram 256 IDE80G(7200) :  약 35분
Mobile p-4 1.7G RAM512 IDE30G(노트북용) : 약  24분
P-4 2.8G (HT) RAM 512*2(Duble) IDE120G (7200) (2.4.26smp) : 약 16분 
 컴파일 시간이기 때문에 cpu 성능이 시간을 단축시켜 주네요^^;


 (7) 모듈 설치
열심히 컴파일 한 모듈들을 설치합니다.
make modules_install

 (8) 최종 설치
make install

 (9) GRUB 설정 확인
  설치가 모두 끝나면, 자동으로 부트로더(grub)를 변경해 줍니다. lilo 는 안해봐서 모르구요^^, 자동으로 변경은 되지만 설정을 확인하시고 초기 부팅시 로딩 되는 커널을 컴파일 한 커널로 해 주시기 바랍니다.
vi /etc/grub.conf
cd ..


3. iptables 설치
 이젠 iptables최신버전을 설치합니다. string 모듈을 쓰기 위해서입니다. 이젠 iptables 를 설치한다.
 (1) 컴파일
아래의 디렉토리 이동후 컴파일 합니다.
cd iptables-1.2.11
make BINDIR=/usr/bin LIBDIR=/usr/lib MANDIR=/usr/man KERNEL_DIR=../linux-2.4.27

 (2) 설치
 열심히 컴파일 한 iptables 를 설치합니다. 기본 디렉토리는 /usr/local 이니 불편합니다. 그래서 아래와 같이 옵션을 주어서 redhat 배포판과 비슷하게 설치합니다.
make install BINDIR=/usr/bin LIBDIR=/usr/lib MANDIR=/usr/man KERNEL_DIR=../linux-2.4.27

  (3) 기존 iptables 삭제
   기존의 iptables를 과감하게 삭제 해 버립니다.
rpm -e iptables-1.2.7a-2 --nodeps


5. 리부팅
설치가 모두 끝났습니다. 이젠 리부팅해서 새로운 커널을 올립니다.
reboot



6. iptables 운영
 
방화벽 강좌가 아니기 때문에 iptables에 대한 자세한 사용법은 다루지 않겠습니다.
아주 기본만 다룹니다.
 (1) 체인
  iptables 는 기본적으로 3개의 체인이 있습니다.
  INPUT : 서버로 들어오는 패키
  FORWARD : 서버를 통해 다른곳으로 나가는 패키 (브릿지 및 ip공유시에)
  OUTPUT : 서버에서 다른곳으로 나가는 패킷(서버에서 ftp 접속하면^^)

 (2) 처리방식
   iptables 는 규칙이 기본적으로 4개가 있습니다.
  ACCEPT : 받아 들이는 것
  DROP : 버리는 것
  REJECT : 거부하는 것
  LOG : 로그 기록 (/var/log/message)

  (3) 기본 사용법
 - 모든 규칙 삭제 : iptables -F
 - 규칙들 보기 : iptables -L

  (4) string 모듈 사용법
  tcp 프로토콜을 사용하여 들어오는 패킷들중에 Buy Now 라는 문구가 포함된 패킷은 거부하고, 리셋한다. 
  iptables -A INPUT -p tcp -m string --string "Buy Now" -j REJECT --reject-with tcp-reset
 만약 로그를 남기고 거부하고 싶다면.
  iptables -A INPUT -p tcp -m string --string "Buy Now" -j LOG 
  iptables -A INPUT -p tcp -m string --string "Buy Now" -j REJECT --reject-with tcp-reset

이렇게 하면됩니다. 순서대로 우선순위가 있습니다. LOG 남기는 줄을 뒤에 붙여 버리면, 로그를 남기지 않습니다.
 
7. 마치며..

  아주 아주 많이 부족한 강좌를 읽어 주셔서 감사합니다. 알고나면 간단한 것을 처음 하는 사람은 시간을 많이 보냅니다.저 역시 시간을 많이 보내며 정리하고, 똑같은 일로 다른 사람이 시간을 낭비하지 않고 더 발전적인 일을 하길 바라면서 본 강좌를 마무리 합니다. 본 강좌를 보시고 도움이 받았고, 다른사람들과 공유하고 싶은 강좌가 있으면 아래 메일 주소로 메일 주셨으면 좋겠습니다. 혹시 이 프로그램에 대한 질문 및 버그를 발견하게 되면, 메일 한통 보내주세요. 메일주소는 doly 골뱅이superuser.co.kr 입니다. 메일 주소를 무단 수집해서 스팸메일을 보내는 이를 막기 위해서 위와 같이 표기했으며, 골뱅이 부분은 @ 치환하여 보내주세요.


  이상... 수퍼유저 운영자 doly ...

관련자료

댓글 0
등록된 댓글이 없습니다.

공지사항


뉴스광장


  • 현재 회원수 :  60,037 명
  • 현재 강좌수 :  35,810 개
  • 현재 접속자 :  94 명