강좌
클라우드/리눅스에 관한 강좌입니다.
해킹&보안 분류

brctl 설정

작성자 정보

  • 관리자 작성
  • 작성일

컨텐츠 정보

본문

 

 

brctl 설정

 

브리지 유틸인 brctl을 설치한 후 brctl을 실행하면 다음과 같이 사용할 수 있는 목록이 나오는데, 이 중 몇 가지만 설정하여 사용하면 된다.

 

 

 

 

각각의 옵션은 아래와 같다.

 

 

 

 

 

 

[root@firewall root]# brctl

commands:

addbr <bridge> 브리지를 추가(정의)한다.

addif <bridge> <device> 해당 브리지에 인터페이스를 추가(정의) 한다.

 

 

 

 

 

delbr <bridge> 브리지를 삭제한다.

delif <bridge> <device> 브리지에서 특정 인터페이스를 삭제한다.

 

 

 

 

show 브리지의 목록을 보여준다.

showmacs <bridge> 브리지를 통과하는 시스템의 mac주소 를 보여준다.

showstp <bridge> 브리지의 stp(스패닝 트리 프로토콜) 정 보를 보여준다.

setageing <bridge> <time> 브리지의 ageing time을 정의한다.

setbridgeprio <bridge> <prio> 브리지의 우선도(priority)를 정의한다.

setfd <bridge> <time> 브리지의 forward delay를 정의한다.

setgcint <bridge> <time> garbage collection 간격을 정의한다.

sethello <bridge> <time> hello time을 정의한다.

setmaxage <bridge> <time> 최대 message age를 정의한다.

setpathcost <bridge> <port> <cost> 경로의 cost를 정의한다.

setportprio <bridge> <port> <prio> 해당 포트의 우선도(priority)를 정의한 다.

stp <bridge> <state> stp(spanning tree protocol)을 사용할 것인지 그렇지 않을 것인지를 정의한다.

 

 

 

 

 

 

브리징(bridging)이나 스패닝트리(spanning tree)에 대해 좀 더 세부적인 기능 및 설명은 각자 네트워크 관련 서적을 참고하기 바라며 실제 브리지 방화벽을 운영할 때는 몇 가지 옵션만 알고 있으면 된다.

 

 

 

 

실제 아래와 같은 스크립트를 만들어 bridge.sh와 같은 파일로 작성 후 부팅할 때 이 파일을 자동으로 실행하도록 /etc/rc.d/rc.local에서 정의하도록 한다.

 

 

 

 

 

 

#!/bin/sh

 

brctl addbr br0

brctl stp br0 on

brctl addif br0 eth0

brctl addif br0 eth1

brctl setmaxage br0 4

brctl setfd br0 4

ifconfig eth0 down

ifconfig eth1 down

ifconfig eth0 0.0.0.0 promisc up

ifconfig eth1 0.0.0.0 promisc up

먼저, brctl에서 설정해 주어야 할 옵션이 다소 생소하기는 하지만 그대로 따라 하기만 하면 되므로 크게 무리는 없을 것이다.

 

 

 

 

위 설정에 대한 각각의 의미를 간단히 살펴보도록 하자.

 

brctl addbr br0

이는 br0이라는 브리지를 생성하여 정의하는 것이다.

 

 

 

 

여기에서 br0은 단순한 브리지 이름이므로 본인이 원하는 어떠한 이름으로 정의해도 무방하다.

 

 

 

 

하지만 통상적으로 이더넷 인터페이스를 eth0, eth1과 같이 사용하는 것처럼 br0, br1과 같은 형식으로 사용하는 것이 관례이다.

 

 

 

 

 

 

brctl stp br0 on

브리지에서 stp , spanning tree protocolon 할 것인지 off 할 것인지 정의하는 것이다.

 

 

 

 

on으로 설정하면 네트워크 루핑을 방지할 수 있으므로 on으로 설정하기 바란다.

 

 

 

 

만약 루핑이 돌 수 있는 구조가 아니라면 off로 해도 무방하다.

 

 

 

 

 

 

brctl addif br0 eth0

br0이라는 브리지 인터페이스에 eth0을 포함하도록 정의한다.

 

brctl addif br0 eth1

br0이라는 브리지 인터페이스에 eth1을 포함하도록 정의한다.

 

brctl setmaxage br0 4

최대 message age를 정의한다.

 

 

 

 

설정하지 않아도 무방하다.

 

brctl setfd br0 4

브리지의 forward delay를 정의한다.

 

 

 

 

설정하지 않아도 무방하다.

 

ifconfig eth0 down

기존의 eth0이 설정되어 있을 수 있으므로 일단 eth0 인터페이스를 down시킨다.

 

ifconfig eth1 down

기존의 eth1이 설정되어 있을 수 있으므로 일단 eth1 인터페이스를 down시킨다.

 

ifconfig eth0 0.0.0.0 promisc up

eth0IP0.0.0.0으로 설정하여 초기화하고 promisc 모드로 작동하도록 설정한다.

브리지 모드로 사용하면 목적지 mac 주소에 관계없이 모든 패킷을 통과하도록 기본적으로 promisc 모드로 작동하지만, 만약 인터페이스가 promisc 모드로 작동하지 않으면 브리지가 작동하지 않게 되므로 주의하기 바란다.

 

 

 

 

 

ifconfig eth1 0.0.0.0 promisc up

eth1 역시 IP0.0.0.0으로 설정하여 초기화하고 promisc 모드로 설정한다.

 

 

 

 

브리지 모드로 사용하면 기본적으로 인터페이스가 promisc 모드로 작동하지만 만약 인터페이스가 promisc 모드로 작동하지 않으면 브리지 자체가 작동하지 않게 된다.

 

 

 

 

 

그런데, 왜 브리지에서는 promisc 모드로 작동하여야 할까? 라는 의문점이 생길 수 있는데, 의문이 생긴다면 좋은 습관이다.

 

 

 

 

?”에 대한 답을 알고 있어야 문제 발생 시 신속하게 대처할 수 있기 때문이다.

 

 

 

 

 

왜냐하면 이는 브리지의 원리와 promisc 모드의 의미를 생각하면 너무나 당연한 이야기인데, 힌트를 주자면 eth0eth1은 자체로 서비스를 하는 것이 아니라 마치 RJ45 케이블이 연결되는 스위치의 포트와 같은 역할을 하기 때문이다.

 

 

 

 

여기에서 브리지의 eth0eth1은 별도의 IP가 설정되어 해당 IP로 웹 등의 서비스를 제공하는 것이 아니며 실제로 IP가 설정되지 않아도 관계가 없다고 했다.

 

 

 

 

, 브리지는 방화벽 외부와 내부의 사이에서 서버로 향하는 패킷을 걸러 내거나 통과만 시켜주는 역할만 할 뿐이며 따라서 promisc 모드가 되어야 eth0이나 eth1 등 자기 인터페이스의 mac을 목적지로 하지 않는 즉 방화벽 내부로 향하는 어떠한 패킷도 받아들이게 된다.

 

 

 

 

만약 promisc가 아니면 기본적으로 자기 자신의 mac을 목적지로 하는 패킷만 받아들이므로 방화벽 뒤편에 있는 서버를 향하는 패킷은 iptables 룰과는 관계없이 모두 drop되게 될 것이다.

 

 

 

 

 

 

ed0a995643cb253a41ca08b56cb7e711_1688979083_7896.png
 

[그림] 브리지 방화벽의 구조

 

만약 인터페이스가 2개가 있다면 위의 그림과 같이 브리지 방화벽은 마치 2포트짜리 스위치처럼 작동하게 된다.

 

 

 

 

따라서 브리지 방화벽 뒤편에는 동일 VLAN 내에 있는 어떤 한 IP 의 서버가 설치되어도 관계없으며 브리지 방화벽은 IP에 관계없이 방화벽 뒷단의 서버로 향하는 모든 패킷을 받아서 필터링 룰에 따라 패킷 필터링 한 후 정상 트래픽은 해당 서버로 통과시켜 주므로 패킷의 목적지 mac 주소에 관계없이 모두 받아들이도록 promisc 모드가 되어야 한다.

 

 

 

 

이를테면 mac 주소가 AA:AA:AA:AA:AA:AA211.47.64.3 서버로 향하는 패킷은 브리지 방화벽의 eth0->eth1(또는 eth1->eth0이어도 관계없다)을 통과하여야 하는데, 만약 eth0이나 eth1promisc가 아니면 promisc가 아닌 인터페이스에서는 AA:AA:AA:AA:AA:AA가 자기 자신의 mac이 아니므로 해당 패킷을 drop하고 말 것이다.

 

 

 

 

참고로 위 그림에서 eth0은 다이렉트 케이블이어야 하고 eth1에서 스위치로 연결되는 부분은 스위치에 따라 다이렉트일 수도 있고 크로스 케이블 일 수도 있다.

 

 

 

 

장황하게 설명했는데, 이해가 되었기를 바란다.

 

 

 

 

이후 아래 부분은 각자의 상황에 따라 설정해도 되지만 하지 않아도 무방하다.

 

 

 

 

만약 브리지 방화벽에 원격 접속하여 모니터링이나 관리 등을 위해 사용할 필요가 있다면 아래와 같이 br0 인터페이스에 IP를 설정하면 된다.

 

 

 

 

IP가 할당된 br0 인터페이스는 eth0eth1을 묶은 가상의 인터페이스라고 생각하면 된다.

 

ifconfig lo 127.0.0.1 up

루프백 인터페이스에 IP를 설정한다.

 

 

 

 

 

 

ifconfig br0 211.47.64.9 promisc up

br0 인터페이스의 IP211.47.64.9로 정의한다.

 

 

 

 

 

 

route add -host 127.0.0.1 dev lo

이후 127.0.0.1을 라우팅 테이블에 추가한다.

 

route add default gw 211.47.64.1

default gateway를 라우팅 테이블에 정의한다.

 

 

 

 

 

 

위와 같이 설정 후 ifconfig를 실행하면 다음과 같이 보일 것이다.

 

 

 

 

 

 

[root@firewall root]# ifconfig

br0 Link encap:Ethernet HWaddr 00:02:B3:23:46:A2

inet addr:211.47.64.9 Bcast:211.47.64.255 Mask:255.255.255.0

UP BROADCAST RUNNING PROMISC MULTICAST MTU:1500 Metric:1

RX packets:2678976119 errors:0 dropped:0 overruns:0 frame:0

TX packets:1280633 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:0

RX bytes:1219496170 (1163.0 Mb) TX bytes:139611162 (133.1 Mb)

 

eth0 Link encap:Ethernet HWaddr 00:02:B3:23:46:A2

UP BROADCAST RUNNING PROMISC MULTICAST MTU:1500 Metric:1

RX packets:1433779958 errors:0 dropped:0 overruns:0 frame:0

TX packets:1244370418 errors:0 dropped:0 overruns:10 carrier:0

collisions:0 txqueuelen:100

RX bytes:3970825670 (3786.8 Mb) TX bytes:3927975228 (3746.0 Mb)

Interrupt:7

 

eth1 Link encap:Ethernet HWaddr 00:02:B3:23:46:A3

UP BROADCAST RUNNING PROMISC MULTICAST MTU:1500 Metric:1

RX packets:1245227725 errors:0 dropped:0 overruns:0 frame:0

TX packets:1278748119 errors:0 dropped:0 overruns:8325 carrier:0

collisions:0 txqueuelen:100

RX bytes:154061880 (146.9 Mb) TX bytes:2212479690 (2109.9 Mb)

Interrupt:7 Base address:0x2000

 

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:12390 errors:0 dropped:0 overruns:0 frame:0

TX packets:12390 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:0

RX bytes:16320338 (15.5 Mb) TX bytes:16320338 (15.5 Mb)

 

그리고 routenetstat -r을 실행하면 아래와 같이 br0 인터페이스가 보일 것이다.

 

 

 

 

 

 

[root@firewall root]# route -n

127.0.0.1 0.0.0.0 255.255.255.255 UH 0 0 0 lo

211.47.64.0 0.0.0.0 255.255.255.0 U 0 0 0 br0

0.0.0.0 211.47.64.1 0.0.0.0 UG 0 0 0 br0

 

현재 브리지 상태를 조회하려면 다음과 같이 brctl show를 실행하면 된다.

 

[root@firewall root]# brctl show

bridge name bridge id STP enabled interfaces

br0 8000.00d0b79a2b6c yes eth0

eth1

 

여기에서 만약 브리지를 재설정하려면 먼저 해당 브리지에 설정되어 있는 인터페이스를 다음과 같이 삭제한 후 브리지를 삭제하면 된다.

 

 

 

 

물론 원격접속을 한 상태라면 네트워크가 끊기게 되므로 주의하여야 한다.

 

 

 

 

 

 

[root@firewall root]# brctl delif br0 eth0

[root@firewall root]# brctl delif br0 eth1

[root@firewall root]# brctl delbr br0

만약, 자신의 네트워크에 전용회선이 1개가 아니라 2ISP 또는 두 회선과 연동하여 전체 네트워크에 방화벽을 설치하여 사용하는 경우라면 즉, 2개의 라우터와 연동하여 사용한다면 두개의 브리지 방화벽이 필요할까? 물론 2개로도 구현 할 수 있지만 이러한 상황이라도 메인스위치는 1개만 있으면 되는 것처럼 브리지 방화벽 역시 1개만 있으면 된다.

 

 

 

 

, 브리지 방화벽에는 4장의 인터페이스(eth0, eth1, eth2, eth3)을 설치하고 bridge.sh를 다음과 같이 설정하면 된다.

 

 

 

 

A ISP와 관련된 트래픽은 eth0, eth1을 통과하게 되고, B ISP와 관련된 트래픽은 eth2, eth3을 통과하게 된다.




ed0a995643cb253a41ca08b56cb7e711_1688979107_5468.png
 

[그림] 두 회선인 경우 브리지 방화벽 구조

 

#!/bin/sh

#

# 이더넷 카드 4장을 이용하여 2개 네트워크에 대한 브리지 방화벽을 구현하기 위한 설정 파일.

#

brctl addbr br0

brctl stp br0 on

brctl addif br0 eth0

brctl addif br0 eth1

brctl addbr br1

brctl stp br1 on

brctl addif br1 eth2

brctl addif br1 eth3

ifconfig eth0 down

ifconfig eth1 down

ifconfig eth2 down

ifconfig eth3 down

ifconfig eth0 0.0.0.0 promisc up

ifconfig eth1 0.0.0.0 promisc up

ifconfig eth2 0.0.0.0 promisc up

ifconfig eth3 0.0.0.0 promisc up

 

여기에서는 br0 브리지에 eth0eth1, br1 브리지에 eth2eth3 인터페이스를 정의하였다는 것을 알 수 있다.

 

 

 

 

그리고 스위치에 IP를 설정할 필요가 없는 것처럼 브리지 방화벽에도 IP를 설정하지 않아도 무방하다.

 

 

 

 

단지 관리상의 목적으로 외부에서 방화벽에 접속하기 위하여 IP를 설정하는 것뿐이다.

 

 

 

 

 

관련자료

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

공지사항


뉴스광장


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