2012-09-10

FreeBSD]FreeBSD 5.3의 기본 필터링 PF사용법 by 조성준


출처 :::  http://www.kr.freebsd.org/ 

관련 주소 1 :
관 련 주소 2 :
관련 주소 3 :
안녕 하세요? 조성준 입니다.

PF는 보안에 철저한 OPENBSD에서 ipfilter 의 라이센스문제가 발생할때 개발된 네트웍 필터링 입니다.

기존의 FreeBSD에서는 거의 기본이다 시피안 ipfw 를 쓰기위해서는 커널 재업도 해야하고 성능역시 별로여서 저역시 ip_f 를 따로 셋팅하거나하였는데 요즘 5.3 설치할장비 가 있어 기본 모듈로 로딩되어 있는 pf를 있는데 전혀 딜레이가 보이지 않고 셋팅역시 간단해서 뭐 아직 이렇타하고 애기할만 한 경험수치가 아니지만 문서내용이나 고수들의 애기들로 보면 상용 방화벽 ?지않는 성능을 내고 상용 방화벽에서 지원하 지 않는 기능도 지원되고 무엇보다 좋은건 FreeBSD 5.3R을 깔면 기본 탑재가 되어 바로 적용가능 하다는것입니다.

- 설정 -[b]

기본적으로 기동이 되지 않은 상태라 기동할수 있게 해주어야 합니다.

[b]vi /etc/rc.con[b]

인용 또는 결과 :

pf_enable="YES"  # PF를 기동시킨당
pf_rules="/etc /pf.conf"  # PF의 필터링 설정파일 위치
pflog_enable="YES" # 필터링 로그를 남기기 위해 기동설 정
pflog_logfile="/var/log/pflog" # 필터링 되는 로그 파일

[root@good /root]$ _


자 그리구요 셋팅을 해야 하는데 기본적으 로 /etc/pf.conf 라는 예제 파일이 들어 있습니다.
모두 주석처리 되어 있고 자신이 쓸것만 뽑아 서 사용하면 됩니다.

초기 셋팅을 위해 사용한 옵션을 다음과 같습니다.

[b]vi /etc/pf.conf
인용 또는 결과 :

ext_if = 'fxp0' # 네 트웍 디바이스 이름 기본이죵

# states는 상태 테이블 엔트리가 사용할 메모리 엔트리 최대수 디폴트는 10000
# frags는 패킷재구성을 위한 메모리 엔트리 최대수 디폴트 5000
set limit {states 10000, frags 2000}

# in/out 패킷에 대한 로그 정보 수집대상 네트웍 디바이스
set loginterface $ext_if

# 이부분은 좀 고려를 하셔야 하는데 전체적인 pf의 설능 최적화에 관한 부분인데 설정 옵션은 다음과 같습니다.
# normal  : 디 폴트로 무난한정도
# high-latency : 만그대로 하이~ 엄청난 규모의 트래픽이 왔다 갔다 할때
# aggressive : 약 간 위험성있는 옵션이지만 소통량이 많은 경우 메모리의 사용량을 최소로 할때는 이 옵션
# conservative : 메모 리 많이 사용하고 , CPU많이 잡아 먹오도 안정적이고 보수적으로다가. 비추?
set optimization aggressive

# 각 프로토콜관련해서 각 상태에 따라 timeout을 줄수 있습니다.
#set timeout { tcp.first 120, tcp.opening 30, tcp.established 86400 }
#set timeout { tcp.closing 900, tcp.finwait 45, tcp.closed 90 }
#set timeout { udp.first 60, udp.single 30, udp.multiple 60 }
#set timeout { icmp.first 20, icmp.error 10 }
#set timeout { other.first 60, other.single 30, other.multiple 60 }
#set timeout { adaptive.start 0, adaptive.end 0 }

# 블럭된 패킷 에 대한 응대 방법인데 drop은 쌩~ 배째 니 누꼬고 , return은 온그대로 다시 반사~
set block-policy drop

# PF는 먼저 모든걸 막고 시작한다. 아래는 in/out을 일단 모두 막아 버리고 시작
block in  log all
block out log all

# pass즉 넌 통과 즉 로칼에서 나가고 들어오는적 즉 내부에서 놀이하는 건 모두 허용
# 맨아래 는 외부랑 연결된 fxp0에 대해서는 서버에서 밖으로 나가는 연결세션에 대해서는 모두허용
# 차 후는 막는게 좋치만 저는 처음 셋팅을 위해 일단 개발.
pass in  quick on lo0 all keep state
pass out quick on lo0 all keep state
pass out quick on $ext_if keep state

# 역시 여는 옵션이데 눈으로보셔도 아시 다 싶피 UDP는 domain 포트만 즉 DNS서버를 돌린다 이거죠
pass in  quick on $ext_if proto udp from any to $ext_if port { domain }

# tcp프토토콜에어 대해서는 아래 포트는 오픈하겠다는거죠
pass in  quick on $ext_if proto tcp from any to $ext_if port { ssh, http , https , ftp ,smtp } flags S/SAFR keep state
[root@good /root]$ _


- 적용 -

처 음에는 적용은 일단 리부팅...... 그리고 음료수 한잔 ,
자 그 다음은 뭘해야 할깡?
자 이제 컨트롤을 위한 툴 로 pfctl 이라는 툴프로그램을 제공하면 간단하게 다음의 옵션을 이용해서 pf를 컨트롤 하시면 됩니다.

- 관리 하기-

# 변경된 설정파일 적용
pfctl -f /etc/pf.conf

# 문법 검사
pfctl -nf /etc/pf.conf

# 필터링 셋팅 룰 보기
pfctl -sr

# 상태 테이블 정보괴
pfctl -ss                

# 필터링 상태와 카 운팅 보기
pfctl -si                

# 추천 : ALL ^^ 보두 보기 한방에
pfctl -sa                

- 로그 관찰 -

이제 로그를 봐야 한다. 왜 관리자니깐 자 그럼 tail /var/log/pflog
역시 깨진 글자만 보일겁니다.일반적인 TEXT View프 로그램으로는 볼수 없습니다.

자 여기서 쌩뚱 맞게 ifconfig -a 명령을 해보세요

pflog0: flags=141<UP,RUNNING,PROMISC> mtu 33208

라는 네트웍 카드가 꼽힌거 마냥 나탈날텐데 가상의 log용 어뎁터입니다.
자 그럼 잡설은 그만하고 로그 보 는 방법은

# 로그보기
tcpdump -n -e -ttt -r /var/log/pflog

자 위 방 법은 실시간이 아니라 이벤트 발생에 의해 파일에 Write된걸 보는지라 실시간으로 볼수 없습니다
실시간으로 볼려 면 tcpdump로 위에본 가상 어뎁터를 감시해야 합니다.

# 실시간 보기
tcpdump -n -e -ttt -i pflog0

실행하고 나면 뭔가 열심히 나옵니다 ^^

필터링을 원할경우는 | grep 은 하지마시구요 다음과 같 이 해보세요

# 실시간 보기 80port만
tcpdump -n -e -ttt -i pflog0 port 80

# 실시간보기 특정 IP
tcpdump -n -e -ttt -i pflog0 host XXXX.XXX.XXX

서로 연결해서 다중으로 할때는 and 를 붙이면 됩니다.

tcpdump -n -e -ttt -i pflog0 port 80 and host 127.0.0.1

오늘은 여기까징. OPENBSD쪽 자료를 보시거나 man pf.conf를 통한 man page를 보시면
더 쉬 우실겁니다.

pf의 성능도 성능이거니와 기능역시 대단합니다.
앞으로 계속 보고 있으니 좀더 되면 study란 쪽에 작성해보겠습니다.

pf가 현재의 *BSD 계열에는 이제 모두 기본지원이 되는지라 pf만 잘 연마하고 있으니 다른 BSD로 넘어 가도 필터링 문제는 이제 큰게 상관없이고 고가의 상용 방화벽 못지 않은 구축이 가능할것 같습니다.



이렇게 간단하게나마 쓰는것이 pf의 대단함을 깔보는것 처럼 느껴져서 않올릴려고 했었는데. 얼마전에 위글을 만들어 둔거지만. 하두 썰렁하고 잠이 아직 않와서 올립니다.
다들 도움이나 되실런지 모르겠습니다.

댓글 없음:

댓글 쓰기