Linux NetFilter 패킷 컨텐츠를 사용자 공간 소켓 앱으로 전달합니다.
-
18-09-2019 - |
문제
나는 쓰고 싶다 Linux
2.6 netfilter
module
, 들어가는 것을 확인할 수 있습니다 IP
Dest-IP, Source-IP와 같은 패킷 정보. 그 후이 정보를 전달합니다 user space
앱 (예 : Socket
앱)은 패킷이 후크에 도달하자마자 이러한 정보를 처리합니다.
두 가지 방법을 시도하고 싶습니다.
1 . 내부 netfilter
모듈, 만들기 fifo
패킷이 도달 할 때마다 구조선 hook
, 패킷 정보를 FIFO에 넣으십시오. 그리고 도움으로 /proc/example
파일 시스템 . 사용자 우주 앱이 읽을 때마다 /proc/example
파일, FIFO 헤드에서 패킷 정보를 얻습니다.
나는 초보자이다 kernel
프로그램,이 프로그램은 커널이 여러 번 충돌합니다. -_-! 이런 식으로 가능해야합니까?
2. NetFilter 모듈 내에서 Char 장치를 만들고 사용자 공간 앱은이 Char 장치에서 패킷 정보를 읽습니다. 그러나 나는 여전히 패킷을 가능한 빨리 얻는 방법을 모르고, 패킷이 NetFilter 후크에 도달 할 때 어떤 방법이 있습니까? 커널은 정보 사용자 공간 앱에 신호를 보냅니다. 그러면 사용자 공간 앱이 패킷 정보를 선택 하시겠습니까?
매우 감사합니다.
해결책
가능한 한 빨리 무엇을 의미합니까? 실제 하드/소프트 실시간 요구 사항이 있습니까?
옵션 2를 선택하면 문자 장치를 비 블로킹하고 읽기 FD에서 ()를 선택하여 새 데이터를 빠르게 얻을 수 있어야합니다. 커널 레벨 소켓과 비슷한 작업을 수행했는데, 여기서 소켓 데이터는 캐릭터 드라이버를 통해 사용자 수준 프로세스에 제시되었습니다. 소켓을 적시에 서비스하는 한 지연 시간이 거의 보지 못했습니다. 드라이버는 소프트 실시간 요구 사항이있는 환경에서 사용되었으며 밀링 커널 시설을 사용하여 해당 요구 사항을 충족시키는 데 아무런 문제가 없었습니다.
Linux 장치 드라이버, 3 판을 살펴보십시오.
다른 팁
이 작업을 수행하는 방법 : 네트워크 활동에 연결되도록 커널 모듈을 만듭니다. 그런 다음 커널에서 사용자 공간과 대화 할 수있는 NetLink를 사용하여 데이터 IPC를 전달하십시오.
옵션 1이 가능하고 실행 가능합니다. 문제는 무엇입니까? 그러나 나는 보통 사이에 의사 소통하는 데 사용합니다 user-space
그리고 kernel space
사용 netlink
nl_sk = netlink_kernel_create(&init_net, 17, 0, recv_cmd, NULL, THIS_MODULE);
netlink_kernel_release(nl_sk);
netlink_unicast
첫 번째 방법에 대해서는 잘 모르겠지만 두 번째 방법을 사용하여 사용자 공간 앱은 Char 장치와 함께 Select () 호출을 유일한 대상으로 사용할 수 있습니다. select ()가 반환되는 즉시 읽을 데이터가 있습니다. . 하나의 패킷의 데이터를 가정하는 것이 아니라 모든 것을 읽으십시오.