메뉴 바로가기 검색 및 카테고리 바로가기 본문 바로가기

한빛출판네트워크

한빛랩스 - 지식에 가능성을 머지하다 / 강의 콘텐츠 무료로 수강하시고 피드백을 남겨주세요. ▶︎

IT/모바일

개인용 방화벽 만들기

한빛미디어

|

2006-09-25

|

by HANBIT

22,181

제공: 한빛 네트워크
저자: Dru Lavigne, 김현우 역
원문: http://www.onlamp.com/pub/a/bsd/2006/08/03/FreeBSDBasics.html

온라인 접속을 할 때 그 뒤에 방화벽이 있다는 것은 누구나 알겠지만, FreeBSD (혹은 PCBSD이나 DesktopBSD) 시스템 환경에서 손쉽게 개인용 방화벽을 만들 수 있다는 것을 아는 사람은 그리 많지 않다. 이 기사는 일반 사용자가 10분 안에 방화벽을 구축하고 실행 시키는 방법을 설명한다.

소프트웨어

BSD처럼 FreeBSD역시 항상 보안을 의식해왔다. FreeBSD는 ipfw, ipf, pf 같은 몇 가지 내장된 방화벽을 제공하는데, 나는 주로 pf를 사용한다. pf는 OpenBSD, NetBSD, DragonFly BSD를 포함한 모든 BSD에서 제공하고 있기 때문이다.

그리고 fwbuilder라고 하는 GUI 방화벽 편집기가 쓸 만 한다. 이 유틸리티는 Linux, Mac OS X, Windows XP에서 사용 가능하며, iptables, ipfilter, pf와 ipfw를 지원하는데, 나는 FreeBSD 시스템 환경에서 이 유틸리티의 사용방법을 보이겠다.

pf는 FreeBSD의 단짝이지만, 슈퍼유저로 로그인 후 아래와 같이 타이핑 해서 pf가 시스템에 로드 되어있는지 확인 해보자.
# kldload pf.ko
아무일 없이 프롬프트 상태로 되돌아 왔다면, pf가 지금 막 로드 된 것이다. 컴퓨터를 계속 켜 둘 것이 아니라면, /etc/rc.conf에 아래와 같이 한 줄 추가해서 다음 부팅시에 pf가 자동으로 로드 되도록 하자:
pf_enable="YES"
아니면 다음과 같은 에러메시지가 출력 될 수도 있다.
kldload: can"t load pf.ko: File exists
에러의 뜻은 이미 시스템에 pf가 로드되어 있음을 의미한다.

설치

슈퍼유저 권한으로, fwbuilder를 설치하자:
# pkg_add -r fwbuilder
# rehash
# fwbuilder
위의 fwbuilder 명령으로 Firewall Builder 시작 화면이 열릴 것이다. 프롬프트는 이미 존재하는 프로젝트 파일을 Open 할 것인지 새로 작성할 것인지를 물을 것이다. Create new project file 버튼을 클릭하고 파일명을 입력하자. 파일명에 .fwb라는 확장자가 붙을 것이다. 계속 진행하려면, Next를 클릭하자.

다음 화면은 두 가지 선택 옵션을 묻는다.
  • 이 파일의 Revision Control 시스템을 활성화 한다. (지금 실행하지 않아도 언제라도 다시 활성화 시킬 수 있다)
  • 다음 실행시 이 파일을 자동으로 Open한다. (나중에 Preferences Dialog를 통해서 이 옵션을 활성화 시킬 수 있다.)
Revision control은 매우 편리하다. fwbuilder를 실행 시킬 때 마다 기존 프로젝트 파일 (i.e. 마지막 세션)의 복사본을 유지해주고 세션의 모든 히스토리를 제공한다. 더욱 중요한 것은, 작업 중 실수한 경우에도 이전에 작업하던 세션으로 돌아갈 수 있다. 두 옵션을 모두 선택하는 것이 좋을 것이다. 선택 후에는 종료 버튼을 클릭 한다.

Firewall 객체 초기화

두 개의 메인 섹션으로 분리된 fwbuilder GUI가 나올 것이다. 왼쪽 프레임엔 객체트리가 있고, 오른쪽 프레임에는 firewall 규칙 (나중에 정의할 객체 )이 있다. 객체를 사용하면 당신의 네트워크, 컴퓨터, 서비스를 빠르게 살피는데 큰 도움이 되므로, 이 객체들을 잘라서 방화벽 규칙에 붙여 넣는다.

당신이 만든 첫 번째 객체는 방화벽을 의미한다. New Object icon (종이처럼 생긴 것)을 클릭하고 드롭 다운 메뉴의 New Firewall을 선택하자. 이제 당신의 방화벽에 이름을 지어주고 (나는 my_firewall이라고 지었다) firewall S/W의 드롭다운메뉴의 pf를 선택한 후 next를 클릭한다. Configure interface manually를 기본값으로 유지하고, next를 클릭한다.

그림 1과 같은 화면을 보게 될 것이다.

그림1
그림 1. 새 방화벽

Note: 화면에 Netmask와 MAC 옵션이 포함되지 않았다면, fwbuilder를 슈퍼유저로 실행시키지 않은 것이다. 슈퍼유저 만이 방화벽 객체와 방화벽 규칙을 생성할 수 있다.

당신 컴퓨터의 각 NIC 뿐 아니라 loopback을 위해서 인터페이스 정보를 확실히 추가해라. 방화벽으로 당신의 개인용 PC만을 보호하려 한다면, PC에 하나의 물리적 NIC만 설치되어 있으면 된다. 그러나 당신 PC가 다른 PC에도 NAT를 제공하게 하려면, 두개 이상의 NIC가 설치 되어야 한다.

당신의 IP주소가 DHCP 주소로 할당되었다면, Dynamic address option에 체크 하라. 그걸 원하지 않으면, 고정 IP주소와 서브넷 마스크를 사용해야 한다. IP 주소 관련 정보와 인터페이스의 FreeBSD의 이름을 결정하기 위해서 다음과 같이 입력한다:
# ifconfig
xl0: flags=8843 mtu 1500
    options=9
    inet 192.168.2.49 netmask 0xffffff00 broadcast 192.168.2.255
    ether 00:04:75:ee:e0:21
    media: Ethernet autoselect (100baseTX )
    status: active
lo0: flags=8049 mtu 16384
    inet 127.0.0.1 netmask 0xff000000
나의 정보대로 해서, 새로운 방화벽 화면으로 들어갔다.:
Name:        xl0
Address:    (greyed out because I checked Dynamic address)
Netmask:    (greyed out because I checked Dynamic address)
MAC:        00:04:75:ee:e0:21
Label:        external

Name:        lo0
Address:    127.0.0.1
Netmask:    255.0.0.0
MAC:        (leave empty)
Label:        loopback
라벨을 선택할 때, external은 당신이 인터넷에 접속할 때 적합하고, internal은 홈 네트워크를 사용할 때 알맞다. 만약 고정 서브넷 마스크를 추가해야 한다면, 우선 0xffffff00 과 같은 16진수를 10진수 숫자로 변환해야 한다. 0x는 해당 숫자가 16 진수임을 가리키는 표시이므로 무시하면, 남은 것은 4쌍의 두자리 숫자(ff ff ff 00) 이다. ff는 255를 뜻하고, 00은 0을 뜻하므로, 이 마스크는 255.255.255.0 이다. ff나 00 이외의 다른 숫자 쌍은 아래의 변환 테이블을 이용해라:
Hex	Decimal
80	128
c0	192
e0	224
f0	240
f8	248
fc	252
fe	254
모뎀 사용자를 위한 Note: 당신의 인터페이스 이름은 ppp0 이나 tun0 모두 가능하다. 인터넷에 연결 되있는 동안 ifconfig를 실행하면 당신의 IP 주소를 쉽게 알 수 있다.

NIC 정보에 들어가면, Add를 클릭하고 각 NIC에 대해 반복해라. 마치고 나면, Finish 버튼을 눌러라. 방화벽의 속성 메뉴가 펼쳐지면, 기본값을 유지하고 메뉴를 닫으면 된다. 당신의 객체 트리를 보면, 이제 새로운 객체 몇 개가 포함 되어있다. 방화벽을 위한 것 하나와 당신이 정의한 인터페이스를 위한 것 하나다.

이제 방화벽 객체(관리 인터페이스로 마킹한 것)를 완성하기 위해서 한가지만 더 변경하면 된다. 개인용 방화벽에서는 loopback이 되어야 하므로 loopback 객체를 더블클릭해서 관리 인터페이스 박스를 체크하고 화면을 닫는다.

간단한 방화벽 규칙집합 만들기

이제 당신 PC에는 인터넷으로부터의 접속을 허용하거나 거부 할 수 있는 간단한 방화벽 규칙집합을 만들기 위한 준비가 끝났다.

Rules메뉴를 클릭하고, Insert Rule을 선택해라 (그림 2). 기본 규칙은 TCP/UDP를 사용하는 어떠한 목적지로부터의 접속도 모두 거부하게 되어있다. 방화벽이 동작하게 하기위해서, 방화벽 객체를 오른쪽 클릭하고 Copy를 선택해라. 규칙의 소스 박스의 안쪽에서 오른쪽 클릭을 하고 붙여넣어라. 방화벽은 이제 패킷의 출발점을 보여줄 것이다. 다음으로, Action 밑의 Deny word를 오른쪽 클릭하고, Accept로 바꿔라. 당신 패킷 내용을 누구에게나 공개하고 싶지 않다면, 옵션 박스에서 오른쪽 클릭하고 Logging Off를 선택해라.

그림2
그림 2. 규칙 추가하기 (원본 그림을 보려면 클릭)

당신이 왜 그러한 규칙을 만들었는지 잊지 않기 위해서 규칙에는 항상 코멘트를 달아야 한다. 박스에서 더블클릭 하면 코멘트를 달 수 있다. 나는 이렇게 썼다.
인터넷으로부터 내 컴퓨터에 접속하는 것을 허가
저 규칙 하나면 방화벽을 동작 시키기에 충분하다. 원한다면 두 번째 규칙을 추가할 수 있다. 규칙 메뉴를 클릭하고 Add Rule Below를 선택하고 코멘트를 추가해라 :
다른 모든 전송 금지
방화벽 로그들을 볼 생각이 없다면, 옵션 박스에 있는 로깅을 오프해라. 이 두 번째 규칙은 꼭 필요한 것은 아니다. 왜냐하면, pf 방화벽은 당신이 명시적으로 허용하지 않은 모든 전송을 금지하기 때문이다. 이것을 암묵적 금지라고 한다.

당신은 이러한 규칙을 추가할 때 코멘트를 달아서, 규칙의 동작을 명시적으로 하는 것이 유용하다는 것을 알 수 있을 것이다.

Tip: 방화벽 관리자의 간단한 트릭은 로깅 옵션을 중지 할 때나, 네트웍 문제 해결을 할 때에만 이러한 룰을 추가하는 것이다.

방화벽 규칙 설치하기

당신은 이제 방화벽 규칙집합을 만들었지만, 이것을 설치 하기 전까지는 동작하지 않는다. 첫째로, 당신은 sshd를 조정해서 슈퍼유저가 방화벽 룰에 접근하고 설치할 수 있도록 해야 한다. 기본적으로 FreeBSD는 슈퍼유저 ssh 세션을 허용하지 않는다.

엔터를 누르기 전에 대소문자와 >>를 신중하게 확인하고, 기본 값을 아래와 같이 타이핑해서 바꾸자.
# echo "PermitRootLogin yes"  >> /etc/ssh/sshd_config
걱정마라; 한번 방화벽 룰을 설치만 하면, 인터넷의 누구도 당신 컴퓨터에 ssh 할 수 없다. 다음으로, sshd의 바뀐 점에 대해 말한다.
# /etc/rc.d/sshd reload
Reloading sshd config files.
만약 다음 에러를 봤다면:
sshd not running? (check /var/run/sshd.pid).
대신에 다음 명령을 써라:
# /etc/rc.d/sshd start
Starting sshd.
아래 메시지로 sshd가 동작 중 인지를 다시 확인하고:
# /etc/rc.d/sshd status
sshd is running as pid 5467.
다음으로, Rule 메뉴의 Install을 선택하면 아래와 같은 메시지가 보일 것이다:
    Some objects have been modified since
    you compiled the policy last time.
    Do you want to recompile it before you install?
컴파일 버튼을 클릭하라. 텍스트 박스가 열리면 마지막 메시지("Policy compiled successfully.")를 읽어라. Install 버튼을 클릭하라. 정보를 인증하는 동안, 슈퍼유저 계정을 위해 root에 들어가서 유저이름과 패스워드를 입력 하고, Next를 눌러라. 당신은 새 RSA키 메시지를 받게 될 것이다:
    You are connecting to the firewall "my_firewall"
    for the first time. It has provided you its
    identification in a form of its host public key. The
    fingerprint of the host public key is: "
    b6:76:30:aa:01:27:64:48:3b:18:28:18:5b:c9:ae:e4"
    You can save the host key to the local database
    by pressing YES, or you can cancel connection
    by pressing NO. You should press YES only if
    you are sure you are really connected to the 
    firewall "my_firewall".
Yes를 누르는 것이 안전한데, 당신이 당신의 방화벽에 접속 중인지를 알 수 있기 때문이다. 그렇지만, 당신이 원격 FreeBSD 시스템에 접속할 경우, 호스트의 핑거프린트를 체크하는 방법을 알아 두는 것이 좋다:
# ssh-keygen -l -f /etc/ssh/ssh_host_dsa_key.pub
1024     b6:76:30:aa:01:27:64:48:3b:18:28:18:5b:c9:ae:e4
Note: 당신은 방화벽을 설치하고 가장 먼저 핑거프린트을 검증하는 것이 필요하다.

일단 Yes를 클릭하면, 텍스트 박스가 열릴 것이다 (나의 것은 최소화 되었다). 당신은 커널에서 ALTQ를 지원하지 않는다는 메시지를 받겠지만, 사용하지 않을 것이기 때문에 상관 없다. 메시지 박스를 살짝 닫아라. 이제 방화벽은 동작 중이다..

방화벽 컨트롤 하기

당신의 방화벽에 무슨 일이 벌어지고 있는지를 파악하고 방화벽을 중지 시키거나 동작시키기 위해서 pfctl (pf control) 명령어를 사용해라 현재 동작중인 방화벽의 규칙을 보려면 스위치 -s를 사용해라:
# pfctl -s rules
No ALTQ support in kernel
ALTQ related functions disabled
pass out quick inet from (xl0) to any keep state label "RULE 0 -- ACCEPT "
block drop in quick inet all label "RULE 1 -- DROP "
block drop out quick inet all label "RULE 1 -- DROP "
block drop in quick inet all label "RULE 10000 -- DROP "
block drop out quick inet all label "RULE 10000 -- DROP "
당신이 만든 fwbuilder 규칙의 이름을 관찰해보면, 규칙은 0과 1로 구성된 것을 알게 될 것이다. 그러나 규칙 10000 은 암묵적으로 금지 되어 있다.

방화벽을 멈추고 싶다면, disable 스위치를 사용하라:
# pfctl -d
방화벽을 재시작 하기위해, 당신의 규칙집합의 이름을 정하라. 규칙집합은 /etc 폴더에 있고, 방화벽이름과 같을 것이다. 나의 경우에는 /etc/my_firewall.conf로 되어있다. 방화벽을 시작하기위해 나는 pfctl에 enable 스위치를 주고 커맨드 창에서 타이핑한다.
# pfctl -e /etc/my_firewall.conf
나는 객체트리의 방화벽을 오른쪽 클릭하거나, 드롭다운 메뉴의 Install을 선택할 수 있다. (이것은 현재 명령집합에서는 실패할 것이지만, 쉽게 수정 할 수 있다.)

Note: 만약 당신이 /etc/rc.conf에 이 기사의 첫 부분에서 언급한 내용을 추가 했다면, PC가 재부팅 될 때 명령집합을 다시 로드하기 위해서 다음 한 줄을 더 추가해보자:
pf_rules="/etc/my_firewall.conf"
my_firewall.conf가 있는 곳에 당신 명령집합의 이름을 넣으면 된다. 재부팅 후에 방화벽이 동작하는지를 확실히 체크하기 위해 pfctl -s rules를 실행하는 것은 좋은 방법이다.

규칙의 상세 정의

만약 당신의 첫번째 규칙을 봤다면, 방화벽은 출발지로서는 아무 장소로나 접근을 허용하고 있을 것이지만, 목적지로서는 누구도 접근할 수 없다. 여기에는 방화벽이 정책을 설치하기위한 자신으로의 접속도 포함되기 때문에, 만약 규칙을 추가한 후 설치하려 하면 에러 메시지가 출력될 것이다. 당신 방화벽이 이렇게 동작하는데 만족한다면 괜찮지만 당신은 웹 서핑이나 이메일 송수신, 그리고 인터넷에서 보통 하는 대부분의 일들을 할 수 있어야 한다.

그러한 이유로 규칙을 더 추가해야 할 필요가 있다면, 당신은 방화벽이 정책을 설치할 수 있는 규칙으로 시작해야만 한다. 첫번째 규칙의 숫자 0을 클릭해서 규칙 메뉴로 가고 Insert Rule을 선택해라. 방화벽은 ssh위의 loopback 관리 인터페이스에 접속해야 하므로, 규칙을 아래와 같이 만든다.
Source:        my_firewall
Destination:    my_firewall:lo0:ip    (you"ll find this if you click the + 
                     by your loopback object)

Service:    ssh
Action:        Accept
Options:    Logging On
Comment:    allow firewall to install policy
당신은 아직까지는 ssh 오브젝트를 만들지 않았다. Service 옆에 있는 +를 클릭해서 트리를 펼쳐라. TCP를 오른쪽 클릭하고 New TCP Service를 선택해라. Name 아래 ssh를 쳐라 Destination Port Range Start아래 22를 치고, Apply Change button을 클릭해라. 마쳤을 때, 방화벽 규칙은 그림 3과 같을 것이다.

그림3
그림 3. ssh를 허용하는 방화벽 규칙 (원본 사진을 보려면 클릭)

새 규칙을 추가하기 전에 방화벽을 잠시 중지시켜야 한다. -- 현재는 어떠한 접속도 허용하지 않는다는 것을 기억하라.
# pfctl -d
통상적인 규칙 기반으로 설치해라; 방화벽은 재시작 될 것이다. 당신이 이렇게 타이핑 했다면 새 규칙을 보게 될 것이다.:
# pfctl -s rules
나의 새 규칙은 다음과 같다:
pass out log quick inet proto tcp from (xl0) to 127.0.0.1 port = ssh keep 
state label "RULE 0 -- ACCEPT "
결론

오늘, 나는 인터넷에 접속하는 동안 시스템을 지킬 개인 방화벽을 어떻게 만드는지 시연했다. 다음 기사에서는 NAT 정책을 fwbuilder에 설치하는 방법과 그 외 다른 기능들을 소개할 것이다.

Dru Lavigne는 Ottawa에 있는 Marketbridge Technologies의 강사이며 Open Protocol Resource를 관리 하고 있다.
TAG :
댓글 입력
자료실

최근 본 상품0