Windows Filtering Platform 콜아웃 드라이버를 프로그래밍할 때 다음 주제를 고려하세요.
사용자 모드 및 커널 모드
Windows 필터링 플랫폼에 기본 제공되는 표준 필터링 기능을 사용하여 원하는 필터링을 수행할 수 있는 경우 ISV(독립 소프트웨어 공급업체)는 커널 모드 설명선 드라이버를 작성하는 대신 필터 엔진을 구성하는 사용자 모드 관리 애플리케이션을 작성해야 합니다. 커널 모드 설명선 드라이버는 기본 제공 표준 필터링 기능에서 처리할 수 없는 방식으로 네트워크 데이터를 처리해야 하는 경우에만 작성해야 합니다. 사용자 모드 Windows 필터링 플랫폼 관리 애플리케이션을 작성하는 방법에 대한 자세한 내용은 Microsoft Windows SDK의 Windows Filtering Platform 설명서를 참조하세요.
필터링 계층 선택
콜아웃 드라이버는 네트워크 스택에서 가능한 가장 높은 필터링 계층에서 네트워크 데이터를 필터링해야 합니다. 예를 들어 원하는 필터링 작업을 스트림 계층에서 처리할 수 있는 경우 네트워크 계층에서 구현하면 안 됩니다. 드라이버가 Windows에서 IPsec과의 호환성을 보장하기 위해 사용해야 하는 필터링 계층 권장 사항에 대한 자세한 정보는 콜아웃 드라이버 개발 IPsec-Compatible를 참조하세요.
ALE(애플리케이션 계층 적용) 흐름 설정 계층의 차단
일반적으로, ALE 흐름이 설정된 필터링 계층(FWPM_LAYER_ALE_FLOW_ESTABLISHED_V4 또는 FWPM_LAYER_ALE_FLOW_ESTABLISHED_V6) 중 하나에서 설명선이 필터 엔진에 추가된 경우, 해당 classifyFn 설명선 함수는 작업에 대해 FWP_ACTION_BLOCK을 반환해서는 안 됩니다. ALE 흐름이 설정된 필터링 계층 중 하나에서 연결을 승인하거나 거부하도록 결정해서는 안 됩니다. 이러한 결정은 항상 다른 ALE 필터링 계층 중 하나에서 이루어져야 합니다.
이러한 classifyFn 설명선 함수가 작업에 대한 FWP_ACTION_BLOCK을 반환하는 유일한 정당한 이유는, 설정된 연결이 종료되지 않았을 때 잠재적인 보안 위험을 초래할 수 있는 오류가 발생하는 경우입니다. 이 경우 작업에 대한 FWP_ACTION_BLOCK 반환하면 잠재적인 보안 위험이 악용되지 않도록 연결이 닫힙니다.
콜아웃 함수 실행 시간
필터 엔진은 일반적으로 IRQL = DISPATCH_LEVEL에서 호출점의 함수를 호출하므로, 이러한 함수가 가능한 한 빨리 실행을 완료하여 시스템이 효율적으로 운영되도록 해야 합니다. IRQL = DISPATCH_LEVEL 확장 실행은 시스템의 전반적인 성능에 부정적인 영향을 줄 수 있습니다.
수신 데이터 경로에 삽입
원래 패킷의 체크섬이 IP 패킷 조각에서 다시 어셈블될 때 원래 패킷의 체크섬이 올바르지 않을 수 있으므로 콜아웃은 수신 데이터 경로에 삽입하는 패킷 삽입 함수를 호출하기 전에 IP 체크섬을 다시 계산해야 합니다. 순 버퍼 목록이 조각에서 다시 어셈블되는지 여부를 나타내는 신뢰할 수 있는 메커니즘은 없습니다.
전송 계층에서 TCP 패킷 인라인 주입
TCP 스택의 잠금 동작으로 인해 전송 계층의 호출은 classifyFn 호출 함수에서 새로운 TCP 패킷이나 복제된 TCP 패킷을 삽입할 수 없습니다. 인라인 주입이 필요한 경우, 콜아웃은 주입을 수행하기 위해 DPC를 큐에 대기시켜야 합니다.
발신 IP 헤더 정렬
NET_BUFFER_CURRENT_MDLNET_BUFFER_LIST_FIRST_NB(netBufferList)) 순 버퍼 목록의 IP 헤더를 설명하는 MDL은 포인터로 정렬되어 있어야 하며, 패킷 삽입 함수 중 하나를 사용하여 패킷 데이터를 나가는 경로에 삽입할 때입니다. 들어오는 패킷의 IP 헤더 MDL이 포인터에 맞게 정렬될 수 있으므로, 나가는 경로에 삽입할 때 콜아웃은 IP 헤더가 이미 정렬되어 있지 않은 경우 이를 재구성해야 합니다.