컨텐츠 바로가기

How do you enable a bridging netfiltering firewall on Red Hat Enterprise Linux 3?

http://juxh2p.egloos.com/2818742

커널 2.2.x대를 이용한 방화벽 전용시스템 구축하기 | Linux 2005/04/12 11:03 http://blog.naver.com/jabusunin/20011632255
커널 2.2.x대를 이용한 방화벽 전용시스템 구축하기
작성자: 김경민
홈페이지: www.linuxstudy.pe.kr
e-mail: stone@linuxstudy.pe.kr
본인이 직접 방화벽을 구축하면서 경험했던 것들을 기반으로 글을 씁니다.^^;;
먼저 읽어보아야 할 글입니다.
1.정정화님의 Bridge Firewall
--> http://kldp.org/KoreanDoc/Bridge_Firewall-KLDP
2.정정화님의 실제 IP를 사용하는 방화벽 및 포워딩 머쉰 구축
--> http://kldp.org/KoreanDoc/Firewall-KLDP
3.유천님의 실제 IP를 이용한 Bridge Firewall TIP
--> http://kltp.kldp.org/stories.php?story=01/04/21/4352223
위의 두 분의 글을 정말 많이 읽고 또 읽었네요...^^; 두 분께 감사를 드립니다.
문제점이 많이 있을 수도 있습니다. 아직 정확하게 파악 안된 것들이 좀 있습니다.
준비물:
1. 방화벽으로 사용할 컴(저의 경우에는 mmx166머신을 한 대 얻었습니다.^^;;,)
2. 커널 2.2.20 소스
3. 브릿지 패치 (브릿지 홈페이지에 가면 있습니다.http://bridge.sourceforge.net)
bridge-1.0.2-against-2.2.20.diff (메인 커널 패치)
bridge-ipchains-against-1.0.2-against-2.2.20.diff(ipchains패치)
bridge-utils 0.9.5(RPM으로 만들어진것과 소스 두가지가 있습니다. 원하시는 것으로 설치하시면 되겠습니다.)
4. 랜카드 2장(참고로 네트웍카드는 좋은 것으로 사용하시길...모든 패킷들이 이곳을 지나가므로 엄청나게 많은 패킷을 처리합니다. 저의 경우 intel 제품을 사용했습니다. 주로 intel이나 3com제품을 추천하더군요...3com제품이 약간 우수하다는 이야기가 많더군요...)
설치.
먼저 위에서 받은 커널을 패치한 다음에 컴파일을 다시 해 주어야 합니다.
1. 커널소스 패치
일단 커널소스를 압축 해제합니다.(아마도 대부분은 /usr/src/linux 에 위치시키시겠죠...^^)
압축 해제한 이후에 패치 파일들도 /usr/src에 가져다 놓았습니다.
아래는 커널 패치하는 과정입니다. 경로에 주의 하시기 바랍니다.(커널 소스 디렉토리에서 명령을 내렸습니다./usr/src/linux디렉토리 입니다.)
두 개의 패치를 실행했다면 이제 커널 컴파일을 다시 합니다.
2. 커널 컴파일
커널 컴파일의 경우에는 사용자마다 환경이 틀릴 수 있으므로 네트웍 부분만 보여 드립니다.
체크를 하고 나머지는 자신의 환경에 맞게 컴파일 합니다.
커널 컴파일 하는 과정은 생략합니다. kldp에서 좋은 문서들을 찾으실 수 있을 겁니다.^^;
3. 새 커널로 재부팅
4. bridge-utils 설치
bridge-utils 0.9.5.tar.gz을 압축해제 합니다.(RPM으로 설치하셔도 무방합니다)
소스디렉토리로 이동 후 make 실행
make가 문제없이 진행이 되었다면 소스디렉토리 아래에 있는 brctl 이라는 디렉토리로
가면 brctl 실행 파일이 생성되어 있습니다. 생성된 이 파일을 /usr/sbin등 적당한 곳으로 이동시킵니다.
이상으로 모든 준비는 끝났습니다.
이제 설정만 제대로 한다면 완벽하게(?) 방화벽을 설치하실 수 있습니다.
5. 방화벽 설정하기
위에서 만들었던 brctl이라는 파일이 일단 핵심이 되는 파일입니다.
아래 그림은 이제 구축한 bridge방화벽의 구조도입니다.
약간씩 틀릴 경우도 있겠지만 거의 비슷한 구조를 가지고 있을겁니다.
eth0과 eth1을 묶어서 bridge로 사용을 하는 것입니다.
1. 일단 bridge을 추가합니다. bridge명은 각자 알아서 설정해 주시면 됩니다.
/usr/sbin/brctl(위에서 이곳에 복사해 두었습니다^^) addbr dev-br
/usr/sbin/brctl addbr dev-br
2. eth0, eth1을 위에서 만든 brige로 묶습니다.
/usr/sbin/brctl addif dev-br eth0
/usr/sbin/brctl addif dev-br eth1
3. 네트웍 설정
ifconfig를 이용해서 eth0과 eth1에 ip 를 부여합니다.
/sbin/ifconfig eth0 0.0.0.0 up
/sbin/ifconfig eth1 0.0.0.0 up
/sbin/ifconfig dev-br up(여기서 저의 경우에는 bridge방화벽에 외부에서 접속할 일이 없으므로 ip를 부여하지 않았습니다. 원문에서는 ip를 부여하고 있습니다만...
저의 경우에는 방화벽 전용 시스템을 구축한다는 가정 하에서 ip를 부여하지 않았습니다.
ip가 없는 방화벽이라 더욱 안전하겠죠...^^(물론 저의 경우에는 원격지에서 방화벽을 셋팅할때만 잠깐씩 ip를 부여해서 사용합니다.)
ip를 부여할 경우에는
/sbin/ifconfig dev-br xxx.xxx.xxx.xxx up
/sbin/route add default gw xxx.xxx.xx.xx
이런 식으로 게이트 웨이를 잡아주어야만 방화벽 자체에서 외부와 네트웍이 됩니다.
이제 네트웍 설정도 끝났습니다.
4. 방화벽 설정
ipchains를 어느 정도 공부를 해야지만 쉽게 이해가 될 겁니다.
쉽게 설명하자면 그냥 패킷을 필터링 하는 툴(?)이다 라고 생각하시면 이해가 쉽게 되실겁니다.
패킷이란 네트웍에서 컴퓨터간의 정보를 주고받는 데이터조각이다 라고 생각하면 됩니다.
일단 브릿지 사슬을 추가합니다.
ipchains -N dev-br(3번에서 설정한 brideg명과 동일해야 합니다.)
사실은 위의 사슬만 설정해 두어도 방화벽은 훌륭하게 설정할 수 있습니다.
왜냐면 모든 패킷(들어오는 패킷이건 나가는 패킷이건 간에.) 이 dev-br이라는 체인을 통해서 지나가기 때문입니다.
기본 사슬인 input, output, forward 사슬은 더 이상 필요가 없습니다.^^;;
유천님께서 쓰셨던 원문에서는 사슬은 더 많이 추가해두고 사용하고 있습니다만. 방화벽만을 위한 목적으로 사용하므로 굳이 방화벽컴으로 들어오고 나가는 패킷들을 처리할 사슬은 만들지 않았습니다.
저는 귀찮아서 그냥 dev-br이라는 체인을 사용하도록 하겠습니다.
이제는 룰(규칙)만 잡아주시면 훌륭하게 설정이 가능합니다.^^
규칙을 설정하는 것은 아주 까다롭습니다. 왜냐면 조금만 잘못 설정해도 원하는 대로 처리가 안될 수도 있기 때문입니다.
아래는 제가 직접 만든 friewall 스크립트입니다.
적절히 수정 및 추가 하시고 간단히 /etc/rc.d/init.d/ 에 놓아두시고 사용하시면 됩니다.
사용법은 /etc/rc.d/init.d/firewall start(방화벽 시작) stop(중지) restart(재시작) status(상태보기)
vi firewall (설명이 들어간부분은 참고하세요...)
#!/bin/sh
#
# linuxstudy firewall
#
# chkconfig: 2345 60 95
# description: linuxstudy firewall
# Source function library.
. /etc/rc.d/init.d/functions
###################만약 네트웍이 작동하지 않고 있으면 빠져나간다.#########
# See how we were called.
case "$1" in
start)
        echo -ne "start firewall: \n"
        ipchains -F(방화벽을 시작할 경우에는 기존의 규칙을 모두 삭제합니다.)
        ipchains -X(기존의 사슬도 모두 삭제)
        ipchains -N dev-br(브릿지명과 동일한 사슬추가)
        ipchains -N br_thru(브릿지명과 동일한 사슬을 명확하게 하기위해 또 다른 사슬추가)
        ipchains -A dev-br -j br_thru(dev-br을 통과하는 모든 패킷은 br_thru로 보내고 모든 패킷처리는 br_thru에서 하게 됩니다.)
########################접속속도최적화#######################
        ipchains -A br_thru -p tcp -d 0/0 telnet -t 0x01 0x10
        ipchains -A br_thru -p tcp -d 0/0 ftp -t 0x01 0x10
        ipchains -A br_thru -p tcp -d 0/0 ftp-data -t 0x01 0x08
        ipchains -A br_thru -p tcp -d 0/0 smtp -t 0x01 0x02
        ipchains -A br_thru -p tcp -d 0/0 pop-3 -t 0x01 0x02
#####허가할 서비스/서버/포트################################
#포트 대신에 서비스명을 적어도 무방합니다. www ftp telnet ssh등등(/etc/services 파일을 참조하세요)
        allow_service="21 22 23 25 53 80 110 3306"
        server="이곳에 서버의 아이피를 적어주세요 "
        wellknown_port="0:1023"(잘 알려진 포트)
        unpriv_port="1024:65535"
        ipchains -A br_thru -p icmp -j ACCEPT
### netbios금지######################################################
네트웍
        ipchains -A br_thru -p tcp -d $server 137:139 -j DENY
        ipchains -A br_thru -p udp -d 61.81.119.0/24 137:139 -j DENY
#####################################################################
##############허가된 서비스 열어주기#################################
        for i in $allow_service
                do
                ipchains -A br_thru -p tcp -s 0/0 -d $server $i -j ACCEPT
                done
#####################################################################
##################네임서버를 위한 포트 열어주기###################
        ipchains -A br_thru -p udp -d $server -j ACCEPT
        ipchains -A br_thru -p udp -s 0/0 53 -d $server 1024: -j ACCEPT
#####################################################################
####사설아이피로 접근하는 호스트 막기########################
#####보통 사설아이피로 접근되는 것들은 대부분 스푸핑 공격이라고 보고 막고있습니다.####
        ipchains -A br_thru -s 10.0.0.0/8 -d 0/0 -j DENY
        ipchains -A br_thru -s 127.0.0.0/8 -d 0/0 -j DENY
        ipchains -A br_thru -s 172.16.0.0/16 -d 0/0 -j DENY
        ipchains -A br_thru -s 192.168.0.0/24 -d 0/0 -j DENY
##############################################################
#########smtp클라이언트 설정 다른 메일서버와 통신가능########
ipchains -A br_thru -p tcp ! -y -s 0/0 25 -d $server 1024: -j ACCEPT
#############################################################
#####ftp서버열어주기##############
ftp서버의 경우에 규칙 설정하기가 아주 난해 합니다.
active모드와 passive모드 두가지로 작동하는데 요즘나오는 ftp서버는 클라이언트와 랜덤하게 접속이 되더군요..
그래서 접속을 할 때 속도가 많이 느려졌습니다. 이것을 해결해 보기 위해 노력했지만 해결이 안된 상태입니다.
아래의 경우는 ftp서버가 passive모드로 작동할 때 ftp서버 설정파일에 passive포트를 설정해 두고 셋팅한 경우입니다.
proftp서버의 경우에는 설정파일에 다음과 같이 추가합니다.
PassivePorts 60000 60100
wu-ftpd경우에는
passive ports 0.0.0.0/0 15000 17000
이런식으로 추가합니다.
자세한 것은 리눅스 사랑넷에
http://linux.sarang.net/board/?p=read&table=tip&no=6398&page=5
글을 읽어보시면 됩니다. 접속속도 저하를 해결하신 분은 저한테 메일좀 주세요..^^
ipchains -A br_thru -p tcp ! -y -s $server 60000:60100 -d 0/0 $unpriv_port -j
ipchains -A br_thru -p tcp -s 0/0 -d $server 60000:60100 -j ACCEPT -l
####### 서비스막기###################################################
#RPC관련 포트막기
for i in 111 635 32771 32772 32773
do
ipchains -A br_thru -p tcp -s 0/0 -d $j $i  -j DENY
done
####백도어 막기######################
##넷버스나 백오리피스를 막기위한 설정입니다.
for i in 1243 27374 12345 12346
do
        ipchains -A br_thru -p tcp -s 0/0 -d 0/0 $i  -j DENY
done
#################################################################
####나머지는 모두 막기
ipchains -A br_thru -s 0/0 -d server -j DENY
######
        ;;
stop)
        echo -ne "stop firewall: \n"
        ipchains -F
        ;;
status)
        ipchains -L -v
        ;;
restart)
  $0 stop
        $0 start
        ;;
*)
      echo "Usage: firewall {start|stop|restart|status}"
      exit 1
;;
esac
exit 0


커널 2.4.x, iptables 그리고 masquerading 에 관한 설정을 힘겹게(?) 끝내고서
다음을 위해 토를 답니다 ^^;

랜카드는 두장으로 위 문서와 동일합니다. eth0 가 외부이고,
eth1이 내부 허브에 연결되는 구조도 같습니다.

랜카드가 모자란 관계로 bridge 에 ip alias 를 이용하여 가상IP를 할당합니다.
(참고로 아래 mybridge 는 위 문서상에서 dev-br 에 해당합니다.)

ifconfig mybridge:1 가상IP netmask 가상네트웍마스크 up

ipchains 로 br_thru, br_input, br_out 체인을 만든것 처럼 iptables 로
똑같이 만들면서 약간 수정하였습니다.

/sbin/iptables -N mybridge
/sbin/iptables -N br_thru
#/sbin/iptables -A mybridge -j br_thru
/sbin/iptables -A FORWARD -i eth0 -j br_thru

여기서 FOWARD 로 지정해야만 아래쪽에 지정할 방화벽 정책들이
적용되더군요 ( 한참 시행착오를 했답니다 -_-; )

/sbin/iptables -N br_input
/sbin/iptables -A INPUT -i eth0 -d 리얼IP -j br_input

인터페이스를 명시해 주었지요.

/sbin/iptables -N br_out
/sbin/iptables -A OUTPUT -o eth0 -s 리얼IP -j br_out

여기도 마찬가지로 인터페이스를 명시.

...
필요한 방화벽 정책
...

#
# IP Masqrade
#
/sbin/iptables -A POSTROUTING -t nat -o eth0 -j MASQUERADE

이렇게 설정하고서 지금 마스크된 PC에서 글을 작성하고 있습니다.

덧글|신고