리눅스

Total 331
Today 0
profile_image
윤진한
08-01-09 18:17 0개 4회
일반문서
[FreeBSD] 기본 필터링 PF사용법
by 조성준 님 (openphp.com) - 2004-11-19 02:35:41

안녕 하세요? 조성준 입니다.

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 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를 보시면 더 쉬우실겁니다.

댓글목록

등록된 댓글이 없습니다.