본문 바로가기
운영체제 (LNX,WIN)

리눅스 Bridge 방화벽 구축하기

by 날으는물고기 2009. 8. 24.

리눅스 Bridge 방화벽 구축하기

작성자 : 김동학(jikime@gmail.com)

1. 설치 환경

- OS : CentOS 4.5
- CPU : Intel Pentium Pro 2.8Ghz
- RAM : 1024M
- Ethernet : Intel EtherExpressPro/100  2개

2. 네트워크 구성

방화벽이 없는 네트워크 구성
라우터 --------- 스위칭 허브 ----------- PC
|----------- 서버
방화벽이 설치 될 네트워크 구성
라우터 ------------ eth0-(Bridge Firewall)-eth1 -- 스위칭 허브 ----- PC
(Cross Cable) |----- 서버
브릿지 방화벽의 구조는 NAT와 같이 보호하고자 하는 서버의 앞단에 설치되어 패킷을 필터링한다. 하지만 NAT 처럼 IP를 변환하거나 NAT 테이블을 설정할 필요없이 간단하게 사용이 가능하다.
쉽게 생각하면 서버의 앞단에 설치되는 스위치, 그 중에서 패킷 필터링이 제공되는 스위치라고 생각하면 된다.

리눅스 서버를 브릿지와 같은 형태로 구성하려면 일단 이덧넷 카드가 2개 이상 있어야 하고, 방화벽에는 IP를 설정하지 않아도 무방하다.  이유는 브릿지는 스위치 형태로 설치되므로 패킷을 라우팅하는 절차가 필요 없고, 비록 IP를 설정하였다 하더라도 외부에서 방화벽에 접속할 때만 필요하고 이외에는 의미가 없기 떄문이다.

3. 설치하기
 3.1 리눅스 커널 다운로드
[root@mento /]#cd /usr/src
[root@mento src]#wget ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.23.tar.gz
[root@mento src]#tar xvzfp linux-2.6.23.tar.gz

3.2 커널 옵션 설정하기

[root@mento src]#ln -s linux-2.6.23 linux
[root@mento src]#cd linux
[root@mento src]#make menuconfig

여러가지 커널 옵션이 나오는데 본인 서버에 맞게 설정해주면 되고, 여기서는 브릿지 방화벽에 필요한 Networking  관련 옵션만  다루겠다. 참고로 이덧넷 카드에 대한 설정 옵션은
Device Drivers  --->
    [*] Network device support  --->
에서 서버에 장착되어 있는 이더넷 카드를 선택해주면 된다.

Networking => Networking Options 로 이동하자.
여기서 패킷을 통과시키는 브릿지 형태로 구성하는 것이 목적이니 
802.1d Ethernet Bridging  <*> 와
<*>Network packet filtering framework (Netfilter) --->
        Bridge: Netfilter Configuration --->
          <*> Ethernet Bridge tables (ebtables) support
를 선택한다.  그외 필요한 옵션이 있을경우 선택해준다.

 <*> Packet socket                     
[*] Packet socket: mmapped IO
<*> Unix domain sockets
<*> Transformation user configuration interface
[ ] Transformation sub policy support (EXPERIMENTAL) (NEW)
[ ] Transformation migrate database (EXPERIMENTAL) (NEW)
<M> PF_KEY sockets
[ ] PF_KEY MIGRATE (EXPERIMENTAL) (NEW)
[*] TCP/IP networking
[*] IP: multicasting
[ ] IP: advanced router
[ ] IP: kernel level autoconfiguration
< > IP: tunneling
< > IP: GRE tunnels over IP
[ ] IP: multicast routing
[ ] IP: ARP daemon support (EXPERIMENTAL)
[*] IP: TCP syncookie support (disabled per default)
<M> IP: AH transformation
<M> IP: ESP transformation
<M> IP: IPComp transformation
<M> IP: IPsec transport mode
<M> IP: IPsec tunnel mode
<M> IP: IPsec BEET mode
<M> INET: socket monitoring interface
[ ] TCP: advanced congestion control (NEW) --->
[ ] TCP: MD5 Signature Option support (RFC2385) (EXPERIMENTAL) (NEW)
< > IP virtual server support (EXPERIMENTAL) --->
< > The IPv6 protocol
[ ] NetLabel subsystem support (NEW)
--- Security Marking
[*] Network packet filtering framework (Netfilter) --->
< > The DCCP Protocol (EXPERIMENTAL) (NEW) --->
< > The SCTP Protocol (EXPERIMENTAL) --->
< > The TIPC Protocol (EXPERIMENTAL) (NEW) --->
< > Asynchronous Transfer Mode (ATM) (EXPERIMENTAL)
<*> 802.1d Ethernet Bridging
< > 802.1Q VLAN Support
< > DECnet Support
< > ANSI/IEEE 802.2 LLC type 2 Support
< > The IPX protocol
< > Appletalk protocol support
< > CCITT X.25 Packet Layer (EXPERIMENTAL)
< > LAPB Data Link Driver (EXPERIMENTAL)
< > Acorn Econet/AUN protocols (EXPERIMENTAL)
< > WAN router
QoS and/or fair queueing --->
Network testing --->
만약 단순히 패킷을 통과시키는 브릿지 기능 외에 방화벽과 같이 패킷을 필터링하는 기능을 이용하려면
<*>Network packet filtering framework (Netfilter) --->
에서 필요한 옵션을 선택해주면 된다. 

방화벽 필터링 기능을 사용할 것이므로
 --- Network packet filtering framework (Netfilter)                    
[ ] Network packet filtering debugging
[*] Bridged IP/ARP packets filtering
Core Netfilter Configuration --->
IP: Netfilter Configuration --->
Bridge: Netfilter Configuration --->
여기에서 한가지 주의할 점은 [ ] Network packet filtering debugging 를 선택하였을 경우에는 패킷이 필터링 될 때마다 발생하는 debug 메시지로 인하여 불필요한 부하를 유발할 수 있으므로 반드시 선택하지 않는 것이 좋다.

Core Netfilter Configuration --->
<M> Netfilter netlink interface       
<M> Netfilter NFQUEUE over NFNETLINK interface
<M> Netfilter LOG over NFNETLINK interface
<*> Netfilter connection tracking support
--- Connection tracking flow accounting
--- Connection mark tracking support
[*] Connection tracking security mark support
[*] Connection tracking events (EXPERIMENTAL)
<M> SCTP protocol connection tracking support (EXPERIMENTAL)
<M> UDP-Lite protocol connection tracking support (EXPERIMENTAL)
<M> Amanda backup protocol support
<*> FTP protocol support
<M> H.323 protocol support (EXPERIMENTAL)
<M> IRC protocol support
<M> NetBIOS name service protocol support (EXPERIMENTAL)
<M> PPtP protocol support
<M> SANE protocol support (EXPERIMENTAL)
<M> SIP protocol support (EXPERIMENTAL)
<M> TFTP protocol support
<M> Connection tracking netlink interface (EXPERIMENTAL)
<*> Netfilter Xtables support (required for ip_tables)
<M> "CLASSIFY" target support
<M> "CONNMARK" target support
<M> "DSCP" target support
<M> "MARK" target support
<M> "NFQUEUE" target Support
<M> "NFLOG" target support
<M> "NOTRACK" target support
<M> "TRACE" target support
<M> "SECMARK" target support
<M> "CONNSECMARK" target support
<M> "TCPMSS" target support
<M> "comment" match support
<M> "connbytes" per-connection counter match support
<*> "connlimit" match support"
<M> "connmark" connection mark match support
<M> "conntrack" connection tracking match support
<M> "DCCP" protocol match support
<M> "DSCP" match support
<M> "ESP" match support
<M> "helper" match support
<M> "length" match support
<*> "limit" match support
<M> "mac" address match support
<M> "mark" match support
<M> IPsec "policy" match support
<M> Multiple port match support
<M> "physdev" match support
<M> "pkttype" packet type match support
<M> "quota" match support
<M> "realm" match support
<M> "sctp" protocol match support (EXPERIMENTAL)
<M> "state" match support
<M> "statistic" match support
<M> "string" match support
<M> "tcpmss" match support
<M> "u32" match support
<M> "hashlimit" match support
IP: Netfilter Configuration --->
<M> IPv4 connection tracking support (required for NAT)               
[*] proc/sysctl compatibility with old connection tracking (NEW)
<M> IP Userspace queueing via NETLINK (OBSOLETE)
<*> IP tables support (required for filtering/masq/NAT)
<M> IP range match support
<*> TOS match support
<M> recent match support
<M> ECN match support
<M> AH match support
<M> TTL match support
<M> Owner match support
<M> address type match support
<*> Packet filtering
<*> REJECT target support
<M> LOG target support
<M> ULOG target support
<M> Full NAT (NEW)
<M> MASQUERADE target support
<M> REDIRECT target support
<M> NETMAP target support
<M> SAME target support (OBSOLETE)
< > Basic SNMP-ALG support (EXPERIMENTAL) (NEW)
<*> Packet mangling
<*> TOS target support
<M> ECN target support
<M> TTL target support
< > CLUSTERIP target support (EXPERIMENTAL) (NEW)
<M> raw table support (required for NOTRACK/TRACE)
<M> ARP tables support
<M> ARP packet filtering
<M> ARP payload mangling
Bridge: Netfilter Configuration --->
<M> Ethernet Bridge tables (ebtables) support                         
<M> ebt: broute table support
<M> ebt: filter table support
<M> ebt: nat table support
<M> ebt: 802.3 filter support
<M> ebt: among filter support
<M> ebt: ARP filter support
<M> ebt: IP filter support
<M> ebt: limit match support
<M> ebt: mark filter support
<M> ebt: packet type filter support
<M> ebt: STP filter support
<M> ebt: 802.1Q VLAN filter support
<M> ebt: arp reply target support
<M> ebt: dnat target support
<M> ebt: mark target support
<M> ebt: redirect target support
<M> ebt: snat target support
<M> ebt: log support
<M> ebt: ulog support (OBSOLETE)
Netfilter의 모든 기능을 사용해보기 위해 위의 각 설정의 모든 옵션들을 <M> 또는 <*>으로 설정했다.
본인에게 필요없는 기능이라고 생각되는 것은 선택하지 않도록 한다.
필요하면 <Help>를 이용하여 각  옵션들의 기능을 확인해보자.

참고로 모듈 설정은 Space Bar로 두번 선택하면 M 이라고 표시된다. 이렇게 하면 모듈설정이 되며 * 로 설정을 하면 커널로 완전히 포함된다. 모듈로 설정하면 꼭 필요한 것만 쓸 수 있게하므로 메모리 낭비를 막을 수 있다.

3.3 커널 컴파일
[root@mento linux]# make
[root@mento linux]# make modules
[root@mento linux]# make modules_install
[root@mento linux]#cp -pv System.map /boot/System.map-2.6.23
[root@mento linux]#cp -pv arch/i386/boot/bzImage /boot/vmlinuz-2.6.23
[root@mento linux]#vi /etc/grub.conf
-- /etc/grub.conf
title CentOS (2.6.23)
root (hd0,0)
kernel /vmlinuz-2.6.23 ro root=/dev/hda2
이와 같이 커널 컴파일 및 grub 설정한 후에 재부팅을 해주면 새로운 커널로 브릿지를 사용할 수 있는 준비가 된 것이다. 

4. iptables 설정
4.1  iptables 다운로드
[root@mento linux]#cd /usr/local/src
[root@mento src]#wget ftp://ftp.netfilter.org/pub/iptables/iptables-1.4.0.tar.bz2
4.2  iptables 설치
[root@mento src]#tar xvjpf iptables-1.4.0.tar.bz2  
[root@mento src]#cd iptables-1.4.0
[root@mento iptables-1.4.0]#make;make install;make install-devel
5. brctl 설정
5.1 brctl-util 다운로드
[root@mento src]#wget http://nchc.dl.sourceforge.net/sourceforge/bridge/bridge-utils-1.4.tar.gz
5.2 brctl-util 설치
[root@mento src]#tar cvfzp bridge-utils-1.4.tar.gz
[root@mento src]#cd bridge-utils-1.4
[root@mento bridge-utils-1.4]#autoconf
[root@mento bridge-utils-1.4]#./configure;make;make install
5.3 brctl 옵션
브릿지 유틸인 brctl을 설치한 후 brctl 을 실행하면 다음과 같이 사용할 수 있는 목록이 나오며 각각의 옵션은 아래와 같다.
[root@mento src]#brctl 
Usage: brctl [commands]
commands:
addbr <bridge> add bridge
delbr <bridge> delete bridge
addif <bridge> <device> add interface to bridge
delif <bridge> <device> delete interface from bridge
setageing <bridge> <time> set ageing time
setbridgeprio <bridge> <prio> set bridge priority
setfd <bridge> <time> set bridge forward delay
sethello <bridge> <time> set hello time
setmaxage <bridge> <time> set max message age
setpathcost <bridge> <port> <cost> set path cost
setportprio <bridge> <port> <prio> set port priority
show show a list of bridges
showmacs <bridge> show a list of mac addrs
showstp <bridge> show bridge stp info
stp <bridge> {on|off} turn stp on/off
- addbr : 브릿지를 추가(정의)한다.
- delbr : 브릿지를 삭제한다.
- addif : 해당 브릿지에 인터페이스를 추가(정의)한다.
- delif : 브릿지에서 특정 인터페이스를 삭제한다.
- setageing : 브릿지의 ageing time을 정의한다.
- setbridgeprio :  브릿지의 우선도(priority)를 정의한다.
- setfd : 브릿지의 forward delay를 정의한다.
- sethello : hello time을 정의한다.
- setmaxage : 최대 message age를 정의한다.
- setpathcost : 경로의 cost를 정의한다.
- setportprio : 해당 포트의 우선도(priority)를 정의한다.
- show : 브릿지의 목록을 보여준다.
- showmacs : 브릿지를 통과하는 시스템의 mac 주소를 보여준다.
- showstp : 브릿지의 stp(spanning tree protocol) 정보를 보여준다.
- stp : stp(spanning tree protocol)을 사용할 것인지 그렇지 않을 것인지를 정의한다.

5.4 brctl 설정
[root@mento src]#brctl addbr br0
=> br0 이라는 브릿지를 생성한다. 여기에서 br0 은 본인이 원하는 어떠한 이름으로 설정해도 된다.
[root@mento src]#brctl stp br0 on => 브릿지에서 stp 즉, spanning tree protocol을 on할 것인지 off할 것인지 정의하는 것이다.
on으로 설정하면 네트워크 루핑을 방지할 수 있으므로 on으로 설정한다.
[root@mento src]#brctl addif br0 eth0
=> br0 브릿지 인터페이스에 eth0을 포함하도록 정의한다.
[root@mento src]#brctl addif br0 eth1
=> br0 브릿지 인터페이스에 eth1을 포함하도록 정의한다.
[root@mento src]#ifconfig eth0 down
=> 기존의 eth0이 설정되어 있을 수 있으므로 일단 eth0 인터페이스를 down 시킨다.
[root@mento src]#ifconfig eth1 down
=> 기존의 eth1이 설정되어 있을 수 있으므로 일단 eth1 인터페이스를 down 시킨다.
[root@mento src]#ifconfig eth0 0.0.0.0 promisc up
=> eth0의 IP를 0.0.0.0 으로 설정하여 초기화하고 promisc 모드로 작동하도록 설정한다.
브릿지 모드로 사용하면 목적지 mac 주소에 관계없이 모든 패킷이 통과하도록 기본적으로
promisc 모드로 작둉하지만, 만약 인터페이스가 promisc 모드로 작동하지 않으면 브릿지가 작동하지
않게된다.
[root@mento src]#ifconfig eth1 0.0.0.0 promisc up
=> eth1의 IP를 0.0.0.0 으로 설정하여 초기화하고 promisc 모드로 작동하도록 설정한다. [root@mento src]#ifconfig br0 222.222.222.2 promisc up
=> br0 인터페이스의 IP를 222.222.222.2 로 설정한다. br0에는 아이피를 부여하지 않아도 상관이 없다.
단, 브릿지 서버를 외부에서 원격으로 관리하거나 모니터링 등을 위해서 아이피를 부여해준다.
IP가 할당된 br0 인터페이스는 eth0과 eth1을 묶은 가상의 인터페이스라고 생각하면 된다.
[root@mento src]#route add default gw 222.222.222.1
=> default gateway를 라우팅 테이블에 정의한다. 단, 외부에서 접속하고자 한다면 설정해준다.
위와 같이 설정한 후 ifconfig를 실행하면 다음과 같이 보일 것이다.
[root@mento src]# ifconfig
br0 Link encap:Ethernet HWaddr 00:02:B3:E9:83:7C
inet addr:222.222.222.2 Bcast:10.255.255.255 Mask:255.0.0.0
UP BROADCAST RUNNING PROMISC MULTICAST MTU:1500 Metric:1
RX packets:19850 errors:0 dropped:0 overruns:0 frame:0
TX packets:66 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:9488220 (9.0 MiB) TX bytes:9412 (9.1 KiB)

eth0 Link encap:Ethernet HWaddr 00:02:B3:E9:83:7D
UP BROADCAST RUNNING PROMISC MULTICAST MTU:1500 Metric:1
RX packets:9971 errors:0 dropped:0 overruns:0 frame:0
TX packets:14914 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1762112 (1.6 MiB) TX bytes:8718643 (8.3 MiB)

eth1 Link encap:Ethernet HWaddr 00:02:B3:E9:83:7C
UP BROADCAST RUNNING PROMISC MULTICAST MTU:1500 Metric:1
RX packets:11971 errors:0 dropped:0 overruns:0 frame:0
TX packets:9443 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:8484941 (8.0 MiB) TX bytes:1502293 (1.4 MiB)
Base address:0xbc00 Memory:fc5e0000-fc600000

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:3 errors:0 dropped:0 overruns:0 frame:0
TX packets:3 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:672 (672.0 b) TX bytes:672 (672.0 b)
만약 브릿지를 재설정하려면 먼저 해당 브릿지에 설정되어 있는 인터페이스를 삭제한 후 브릿지를 삭제하면 된다.
주의할 점은 원격접속을 한 상태라면 네트워크가 끊어지게 된다.
[root@mento src]#brctl delif br0 eth0
[root@mento src]#brctl delif br0 eth1
[root@mento src]#brctl delbr br0

[참고 문헌]
- 리눅스 방화벽 구축 및 운영
- http://www.linux-foundation.org/en/Net:Bridge
- http://www.pyrasis.com/main/BridgeFirewall-HOWTO

728x90

댓글