|
News,
Internal,
Projects,
Home Software, Support, Documentation |
On Thu, Apr 17, 2003 at 01:31:21AM +0900, dreamer wrote:
>>
>>
>> 현재 openbsd 에서 pf 를 module 로 떼어 내 볼려고 합니다만 막히는 부분이 있습니다.
>> pf2freebsd 모듈 부분을 먼저 얘기 하겠습니다. FreeBSD의 RELENG_5_0
>> tag 의 kernel source중 ip_input.c 파일을 보면, PFIL_HOOKS 가
>> 커널 설정 파일에 등록이 되어 있으면, pfil_hook_get 함수를 이용하여
>> 등록된 리스트를 얻어와 해당 함수가 , 실행하도록 되어 있어서,
>> pfil_add_hook 함수를 이용하여 등록하면, 실행 되는 것으로
>> 판단이 됩니다.
>> 그런데 RELENG_4 tag 의 ip_input.c 부분을 보면, PFIL_HOOKS 부분이
>> 없습니다. 그렇다면, 어떻게 ipfilter 가 모듈로 등록이 되어서 패킷
>> 필터링을 수행하는지에 대한 의문이 생깁니다. 일단 ip_input.c 파일(releng_4)
ipfilter가 FreeBSD 4.X에서는 pfil(9)을 사용하지 않고 ipfw처럼
하드코딩되어 있습니다. ipfilter는 FreeBSD 5.X부터 pfil(9)을 사용합니다.
>> 을 보면, ipfw 를 테스트 하기 전에 "fr_check" 함수를 호출하여 ipfilter 의
>> 상태 태이블을 검사하는 것으로 판단이 되는 부분이 있습니다. 하지만, 이 부분이
>> 패킷이 들어 왔을 때 꼭 ipfilter를 거치게 하는 부분은 아니라고 판단이 됩니다.
>> 그래서 ipfilter 의 소스를 보니, ip_fil.c 라는 파일에 pfil_add_hook 함수가 있어
>> 이를 등록 하여 패킷이 ipfilter를 거치도록 하는 것으로 판단이 됩니다.
>> 위의 생각이 맞다면, 패킷이 ipfilter 를 거치는게 이해가 됩니다.
>>
>> 그런데 여기서 한가지 의문점은 pfil_add_hook 함수를 이용하여, 함수를 등록할 때
>> 이 등록된 함수가 해당 구조체의 리스트들 중 가장 앞에 등록이 되는지 가장 뒤에
>> 등록이 되는지가 의아합니다.
>>
등록된 함수가 pfil hook중 head에 있던지 tail에 있는지는 중요하지 않습니다.
어짜피 모든 list를 따라가면서 다 호출합니다.(물론 이전 hook된 function
에서 packet을 drop시키면 이 후의 hook function에서는 그 packet을
처리할 수 없겠지요. 그래서 저는 list로 된 hook를 지원한다는 것이 큰 의미가
없다고 생각합니다.) FreeBSD의 pfil은 pfil_head_get(9) 같은 함수가 없기
때문에 head pointer를 얻을 수 없습니다. NetBSD의 pfil(9)이 현재로서는
가장 진보된 방식을 지원하는데 시간이 되시면 한번 살펴보시기 바랍니다.
>> 또 다른 한가지 중요한 의문점은 이들 함수가 openbsd 에서는 보이질 않습니다.
>> man page 에도 없고, 커널 소스에서 아무리 찾아도 보이질 않는군요. 그렇다면,
>> 현재로선 PFIL_HOOKS 같은 기능이 openbsd 커널에 들어 가기 전에는 pf 를
>> 모듈로 떼어 내는 그런 일은 수행할 수 없다는 얘기인가요?
>>
말씀하신대로 OpenBSD에는 아직 pfil(9)이 없습니다. 얼마전 ipfilter를 만든
Dareen Reed씨와의 메일에서도 Dareen Reed씨는 OpenBSD의 pfil(9)이 없는것을
아주 불편(?)하다고 하더군요. Dareen Reed씨의 입장에서는 OpenBSD가 pfil(9)
을 지원하지 않기 때문에 직접 커널소스를 고쳐야 하는 부담이 있어서 그런것
같습니다.(OpenBSD에서 ipfilter가 license 문제로 제거된건 아시죠?)
>> 아니면, hooking 과 같은 방법 말고 또 다른 방법이 있는건가요?
>>
없으면 만들면 됩니다. BSD License를 가지는 소스니까 좋은곳(FreeBSD,
NetBSD)의코드를 가지고 오면 됩니다. pfil(9)은 워낙 간단해서 포팅에도
큰 문제는 없어 보입니다. ip_input()/ip_output()만 조금 고쳐주면
됩니다.
pfil(9)을 사용하지 않는다면 OpenBSD의 pf나 ipfilter처럼 ip_input(),
ip_output()에 다음처럼 검사하는 부분을 추가하면 됩니다.
if (filter_func && (*filter_func(...) != PASS)) {
/*
* packet drop시의 처리부분
*/
...
}
물론 lkm(4)으로 로드된 모듈에서는 filter_func를 자신의 function으로
초기화 해야 되겠지요.
>> 많은 조언 부탁드립니다. 그럼, 좋은 하루 되세요.
>>
>> ps)커널 소스를 분석한다는건 정말 많은 지식을 필요로 하는 군요.
>>
이 후의 OpenBSD관련 메일은 개인메일 주소로 부탁드립니다. FreeBSD
mailling list 에서 OpenBSD의 소스를 말한다는게 걸리는 군요.
--
============================================================
// Korea Telecom Internet Solutions, Inc.
// FreeBSD/Linux Professional Consulting/Tech. Support
//
// Pyun YongHyeon
//
// WWW: http://www.kt-is.co.kr/
//
// TEL: +82-2-597-0600
// FAX: +82-2-581-2983
============================================================
--
Please look and take part in KFUG FAQ: <http://www.kr.freebsd.org/FAQ-kr/>
To Unsubscribe: send mail to majordomo@xxxxxxxxxxxxxx
with "unsubscribe questions" in the BODY of the message
|
Copyright © 1998-2005 Korea FreeBSD Users Group. All rights reserved. webmaster at kr.FreeBSD.org $Date: 2003/04/30 23:01:23 $ |
|