다음을 통해 공유


IPsec-Compatible 콜아웃 드라이버 개발

IPsec과 호환되는 계층

Windows Vista 및 Windows Server 2008에서 시작하는 IPsec의 Windows 구현과 완벽하게 호환되려면, 다음의 런타임 필터링 계층 중 하나에서 콜아웃 드라이버를 등록해야 합니다.

TCP 패킷 필터링
스트림 계층:

  • FWPS_LAYER_STREAM_V4

  • FWPS_LAYER_STREAM_V6

TCP 및 오류가 아닌 ICMP 패킷 필터링
데이터그램-데이터 계층:

  • FWPS_LAYER_DATAGRAM_DATA_V4

  • FWPS_LAYER_DATAGRAM_DATA_V6

  • FWPS_레이어_데이터그램_데이터_V4_폐기

  • FWPS_LAYER_DATAGRAM_DATA_V6_폐기

들어오는 패킷이 데이터그램 데이터 계층에서 수신 주입되기 전에 다시 작성해야 하는 경우를 제외하고 이러한 데이터 계층에 등록된 설명선 드라이버는 IPsec과 호환됩니다.

IPsec과 호환되지 않는 레이어

이러한 계층에서 IPsec 트래픽이 아직 암호 해독되거나 확인되지 않았기 때문에 네트워크 및 전달 계층은 IPsec과 호환되지 않습니다. IPsec 정책은 네트워크 계층 분류 작업 후에 발생하는 전송 계층에 적용됩니다.

Windows의 IPsec 처리는 다음 계층 아래에 발생하므로 다음 런타임 필터링 계층은 IPsec과 호환되지 않습니다.

FWPS_LAYER_INBOUND_IPPACKET_V4

FWPS_LAYER_INBOUND_IPPACKET_V6

FWPS_LAYER_INBOUND_IPPACKET_V4_DISCARD (FWPS 계층 수신 IP 패킷 V4 폐기)

FWPS_계층_들어오는_IP패킷_V6_폐기

FWPS_LAYER_OUTBOUND_IPPACKET_V4

FWPS_LAYER_OUTBOUND_IPPACKET_V6

FWPS_LAYER_OUTBOUND_IPPACKET_V4_DISCARD

FWPS_LAYER_OUTBOUND_IPPACKET_V6_DISCARD

전송 계층에 대한 특별 고려 사항

전송 계층(FWPS_LAYER_XXX_TRANSPORT_V4 또는 _V6)에 등록된 설명선 드라이버를 IPsec과 호환되도록 하려면 다음 지침을 따르세요.

  1. 전송 계층(FWPS_LAYER_XXX_TRANSPORT_V4 또는 _V6) 외에도, 호출을 ALE 권한 부여 수신/수락 계층(FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V4 또는 FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V6)에 등록하십시오.

  2. 내부 Windows IPsec 처리와 간섭을 방지하려면 FWPM_SUBLAYER_UNIVERSAL보다 낮은 가중치를 가진 하위 계층에서 콜아웃을 등록하세요. FwpmSubLayerEnum0 함수를 사용하여 하위 계층의 가중치를 찾습니다. 이 함수에 대한 자세한 내용은 Microsoft Windows SDK의 Windows 필터링 플랫폼 설명서를 참조하세요.

  3. ALE 분류가 필요한 들어오는 전송 패킷은 ALE 권한 부여 수신/수락 계층(FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V4 또는 FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V6)에서 검사해야 합니다. 이러한 패킷은 들어오는 전송 계층에서 허용되어야 합니다. WINDOWS Vista sp1(서비스 팩 1) 및 Windows Server 2008부터 FWPS_METADATA_FIELD_ALE_CLASSIFY_REQUIRED 메타데이터 플래그를 사용하여 들어오는 패킷이 FWPM_LAYER_ALE_AUTH_RECV_ACCEPT_V4FWPM_LAYER_ALE_AUTH_RECV_ACCEPT_V6 필터링 계층에 표시될지 여부를 확인합니다. 이 메타데이터 플래그는 Windows Vista에서 사용된 FWP_CONDITION_FLAG_REQUIRES_ALE_CLASSIFY 조건 플래그를 대체합니다.

  4. 내부 Windows IPsec 처리에 대한 간섭을 방지하려면 IPsec 트래픽이 아직 detunneled되지 않은 경우 전송 계층에서 IPsec 터널 모드 트래픽을 가로채지 마세요. 다음 코드 예제에서는 이러한 패킷을 바이패스하는 방법을 보여 줍니다.

    FWPS_PACKET_LIST_INFORMATION0 packetInfo = {0};
    FwpsGetPacketListSecurityInformation0(
     layerData,
        FWPS_PACKET_LIST_INFORMATION_QUERY_IPSEC |
        FWPS_PACKET_LIST_INFORMATION_QUERY_INBOUND,
        &packetInfo
        );
    
    if (packetInfo.ipsecInformation.inbound.isTunnelMode &&
        !packetInfo.ipsecInformation.inbound.isDeTunneled)
    {
     classifyOut->actionType = FWP_ACTION_PERMIT;
     goto Exit;
    }
    
  5. 전송 계층에서 IPsec로 보호된 패킷의 암호를 해독하고 확인한 후에는 AH/ESP 헤더가 IP 헤더에 유지됩니다. 이러한 패킷을 TCP/IP 스택에 다시 다시 연결해야 하는 경우 AH/ESP 헤더를 제거하려면 IP 헤더를 다시 빌드해야 합니다. WINDOWS Vista SP1 및 Windows Server 2008부터 패킷을 복제하고 headerIncludeHeaderSize 매개 변수가 복제된 패킷의 IP 헤더 크기로 설정된 FwpsConstructIpHeaderForTransportPacket0 함수를 호출하여 이 작업을 수행할 수 있습니다.

  6. ALE 수신/수락 계층에서 콜아웃은 FWP_CONDITION_FLAG_IS_IPSEC_SECURED 플래그가 설정되었는지 여부를 확인하여 IPsec로 보호된 트래픽을 탐지할 수 있습니다. 전송 계층에서 호출 지점이 FwpsGetPacketListSecurityInformation0 함수를 호출하고 FWPS_PACKET_LIST_INFORMATION0 플래그가 queryFlags 매개 변수에 설정되어 있는지 여부를 확인하여 IPsec 보호 트래픽을 감지할 수 있습니다.

IPsec ESP 패킷 관리하기

엔진이 암호 해독된 ESP(보안 페이로드) 패킷을 캡슐화했음을 나타내면 후행 ESP 데이터를 제외하도록 잘라낸다. 엔진이 이러한 패킷을 처리하는 방식 때문에 NET_BUFFER 구조의 MDL 데이터는 올바른 패킷 길이를 반영하지 않습니다. 올바른 길이는 NET_BUFFER_DATA_LENGTH 매크로를 사용하여 NET_BUFFER 구조체의 데이터 길이를 검색하여 가져올 수 있습니다.