2009-08-17 2 views
2

dest-ip, source-ip와 같이 들어오는 IP 패킷 정보를 확인할 수있는 Linux 2.6 netfiltermodule를 작성하고 싶습니다. 그런 다음 패킷이 HOOK에 도달하자 마자이 정보를 user space 앱 (즉, Socket 앱)에 전달합니다.linux netfilter가 패킷 공간을 사용자 공간 소켓 앱에 전달합니다.

두 가지 방법을 시도해보고 싶습니다.

1. netfilter 모듈 내에서 fifo 구조체 줄을 만들고 패킷이 hook에 도달 할 때마다 패킷 정보를 fifo에 놓습니다. 그리고 /proc/example 파일 시스템의 도움으로. 사용자 공간 앱이 /proc/example 파일을 읽을 때마다 FIFO 헤드에서 패킷 정보를 가져옵니다.

kernel 프로그램의 초보자입니다.이 프로그램은 제 커널을 여러 번 충돌시킵니다. -_-! 이 방법이 가능할까요?

2. netfilter 모듈 내부에서 문자 장치를 만들고 사용자 공간 응용 프로그램은이 char 장치에서 패킷 정보를 읽습니다. 그러나 나는 가능한 한 빨리 패킷을 얻는 법을 아직도 모른다. 패킷이 netfilter 훅에 도달 할 때 어떤 방법이든, 커널이 info 사용자 공간 app에 어떤 신호를 보내면 사용자 공간 app이 나온다. 패킷 정보를 선택 하시겠습니까?

대단히 감사합니다.

+0

사용 user-spacekernel space 사이의 통신에 사용합니다. –

답변

1

가능한 한 빨리 무엇을 의미합니까? 실제 하드/소프트 실시간 요구 사항이 있습니까?

옵션 2를 선택하는 경우 문자 디바이스 비 차단을 열고 읽기 fd에서 select()를 수행하면 새로운 데이터를 빠르게 얻을 수 있습니다. 나는 커널 레벨 소켓과 비슷한 것을했는데, 소켓 데이터는 문자 드라이버를 통해 사용자 레벨 프로세스에 전달되었다. 적시에 소켓을 서비스하는 한 지연 시간은 거의 없습니다. 드라이버는 몇 가지 소프트 리얼 타임 요구 사항이있는 환경에서 사용되었으며, 평범한 커널 기능으로는 이러한 요구 사항을 충족시키는 데 아무런 문제가 없었습니다.

리눅스 디바이스 드라이버, 제 3 판을보십시오.

1

첫 번째 방법은 확실하지 않지만 두 번째 방법을 사용하면 사용자 공간 응용 프로그램에서 char 장치를 유일한 대상으로 select() 호출을 사용할 수 있습니다. select()가 반환 되 자마자 읽을 데이터가 있어야합니다. 하나의 패킷에 해당하는 데이터를 가정하는 것이 아니라 모든 것을 읽으십시오.

3

내 방식 : 네트워크 활동에 연결되는 커널 모듈을 만듭니다. 그런 다음 Netlink를 사용하여 커널의 사용자 공간과 통신하여 데이터 IPC를 전달할 수 있습니다.

2

옵션 1이 가능하고 문제는 무엇입니까? 하지만 일반적으로 그냥 NFQUEUE + libnetfilter_queue 인프라를 복제하는 것 같다 netlink

netlink_kernel_create

netlink_kernel_release

nl_sk = netlink_kernel_create(&init_net, 17, 0, recv_cmd, NULL, THIS_MODULE); 

netlink_kernel_release(nl_sk); 

netlink_unicast 
+0

netlink api http://smacked.org/docs/netlink.pdf에 유용한 링크 –

관련 문제