다음을 통해 공유


Teredo 대한 방화벽 필터 구현

Windows를 사용하면 애플리케이션이 Windows 필터링 플랫폼을 통해 호스트 방화벽으로 전송된 Teredo 트래픽을 수신하려는 명시적 의도를 나타낼 수 있는 소켓 옵션을 설정할 수 있습니다. Windows에서 보호 수준을 설정하기 위한 소켓 옵션은 애플리케이션이 수신할 트래픽 유형을 정의할 수 있도록 하는 데 사용됩니다. 특히 Teredo 트래픽과 관련된 시나리오에서는 IPV6_PROTECTION_LEVEL 소켓 옵션이 지정됩니다. 호스트 방화벽 구현은 예외 없이 모든 애플리케이션에 대해 기본적으로 트래픽을 차단하면서 애플리케이션에 대한 Teredo 트래픽을 선택적으로 허용하도록 다음 필터를 유지하는 것이 좋습니다.

Edge 트래버스 트래픽에 대한 기본 블록 필터

호스트 방화벽은 지정된 인터페이스 유형 터널터널 유형 Teredo 조건과 일치하는 트래픽에 대해 항상 ALE_AUTH_RECV_ACCEPT_V6 필터링 계층 내에서 기본 블록 필터를 유지해야 합니다. 구현될 때 이 필터는 시스템에 에지 순회 인식 호스트 방화벽이 있음을 나타냅니다. 이 필터는 호스트 방화벽과 Windows 간의 API 계약으로 간주됩니다. 기본적으로 이 필터는 모든 애플리케이션에 대한 에지 트래버스 트래픽을 차단합니다.

   filter.layerKey  = FWPM_LAYER_ALE_AUTH_RECV_ACCEPT_V6;
   filter.action.type = FWP_ACTION_BLOCK;
   filter.subLayerKey = FWPM_SUBLAYER_EDGE_TRAVERSAL;
   filter.weight.type = FWP_UINT64;
   filter.weight.uint64 = 0;
   filter.flags = 0;
   filter.numFilterConditions = 2; // Or 3 depending on including the loopback condition
   filter.filterCondition = filterConditions;
   filter.displayData.name  = L"Teredo Edge Traversal Default Block";
   filter.displayData.description = L"Teredo Edge Traversal Default Block Filter.";

   // Match Interface type tunnel
   filterConditions[0].fieldKey = FWPM_CONDITION_INTERFACE_TYPE;
   filterConditions[0].matchType = FWP_MATCH_EQUAL;
   filterConditions[0].conditionValue.type = FWP_UINT32;
   filterConditions[0].conditionValue.uint32 = IF_TYPE_TUNNEL;

   // Match tunnel type Teredo
   filterConditions[1].fieldKey = FWPM_CONDITION_TUNNEL_TYPE;
   filterConditions[1].matchType = FWP_MATCH_EQUAL;
   filterConditions[1].conditionValue.type = FWP_UINT32;
   filterConditions[1].conditionValue.uint32 = TUNNEL_TYPE_TEREDO;

   // Having this condition is OPTIONAL, including this will automatically exempt 
   // loopback traffic to receive Teredo.
   filterConditions[2].fieldKey = FWPM_CONDITION_FLAGS;
   filterConditions[2].matchType = FWP_MATCH_FLAGS_NONE_SET;
   filterConditions[2].conditionValue.type = FWP_UINT32;
   filterConditions[2].conditionValue.uint32 = FWP_CONDITION_FLAG_IS_LOOPBACK;

참고

인터페이스 조건의 'Delivery', 'Arrival' 및 'Next Hop' 클래스는 인터페이스 간에 약한 호스트 모델 및 패킷 전달을 제어하는 데 사용됩니다. 위의 예제에서는 'Delivery' 클래스를 활용합니다. 보안 디자인에서 각 사례를 고려해야 하므로 WFP SDK 설명서의 각 필터링 계층에서 사용할 수 있는 필터링 조건을 검토하세요.

 

제외 애플리케이션에 대한 필터 허용

애플리케이션이 수신 대기 소켓에서 Teredo 트래픽을 수신하지 않는 경우 호스트 방화벽의 ALE_AUTH_RCV_ACCEPT_V6 필터링 계층 내에서 허용 필터를 구현해야 합니다. 사용자 또는 애플리케이션에서 예외를 구성하는 방법에 따라 호스트 방화벽에 소켓 옵션이 포함될 수 있습니다.

   filter.layerKey   = FWPM_LAYER_ALE_AUTH_RCV_ACCEPT_V6;
   filter.action.type = FWP_ACTION_PERMIT;
   filter.subLayerKey = FWPM_SUBLAYER_EDGE_TRAVERSAL;
   filter.weight.type = FWP_UINT64;   
   filter.weight.uint64= 1; // Use a weight higher than the default block
   filter.flags = 0;
   filter.numFilterConditions = 3; // Or 4 depending on the socket option based condition
   filter.filterCondition = filterConditions;
   filter.displayData.name = L"Teredo Edge Traversal Allow Application A";
   filter.displayData.description = L"Teredo Edge Traversal Allow Application A Filter.";

   filterConditions[0].fieldKey = FWPM_CONDITION_INTERFACE_TYPE;
   filterConditions[0].matchType = FWP_MATCH_EQUAL;
   filterConditions[0].conditionValue.type = FWP_UINT32;
   filterConditions[0].conditionValue.uint32 = IF_TYPE_TUNNEL;

   filterConditions[1].fieldKey = FWPM_CONDITION_TUNNEL_TYPE;
   filterConditions[1].matchType = FWP_MATCH_EQUAL;
   filterConditions[1].conditionValue.type = FWP_UINT32;
   filterConditions[1].conditionValue.uint32 = TUNNEL_TYPE_TEREDO;

   FWP_BYTE_BLOB byteBlob = {0};
   filterConditions[2].fieldKey = FWPM_CONDITION_ALE_APP_ID;
   filterConditions[2].matchType = FWP_MATCH_EQUAL;
   filterConditions[2].conditionValue.type = FWP_BYTE_BLOB_TYPE;
   filterConditions[2].conditionValue.byteBlob = &byteBlob;
   filterConditions[2].conditionValue.byteBlob->data = (uint8 *) wszApplicationA;
   filterConditions[2].conditionValue.byteBlob->size = (wcslen(wszApplicationA) + 1)*sizeof(wchar_t);

   // This filter scopes to exemption to ONLY IF the socket option is set, in other words
   // application has explicitly opted in to receive Teredo traffic
   filterConditions[3].fieldKey = FWPM_CONDITION_ALE_SIO_FIREWALL_SOCKET_PROPERTY;
   filterConditions[3].matchType = FWP_MATCH_FLAGS_ALL_SET;
   filterConditions[3].conditionValue.type = FWP_UINT32;
   filterConditions[3].conditionValue.uint32 = FWP_CONDITION_SOCKET_PROPERTY_FLAG_ALLOW_EDGE_TRAFFIC;

Dormancy Callout 필터

Windows의 Teredo 서비스는 기숙사 모델을 구현합니다. 언제든지 에지 순회를 사용하도록 설정된 UDP 또는 TCP 소켓에서 수신 대기하는 애플리케이션이 없는 경우 서비스는 휴면 상태로 이동합니다. 기숙사 메커니즘이 작동하려면 호스트 방화벽은 TCP에 대한 ALE_AUTH_LISTEN_V6 필터링 계층 내에 지정된 각 제외 애플리케이션에 대한 설명선 필터를 유지하고 UDP 기반 애플리케이션에 대한 필터링 계층을 ALE_RESOURCE_ASSIGNMENT_V6 합니다. 아래 샘플에서는 TCP 애플리케이션에 대한 기숙사 설명선에 대해 설명합니다.

   filter.layerKey = FWPM_LAYER_ALE_AUTH_LISTEN_V6;
   // Use FWPM_LAYER_ALE_RESOURCE_ASSIGNMENT_V6 for UDP based exemption

   filter.action.type = FWP_ACTION_CALLOUT_TERMINATING;
   filter.action.calloutKey = FWPM_CALLOUT_EDGE_TRAVERSAL_ALE_LISTEN_V6;
   // Use FWPM_CALLOUT_EDGE_TRAVERSAL_ALE_RESOURCE_ASSIGNMENT_V6 for UDP based exemption

   filter.subLayerKey = FWPM_SUBLAYER_EDGE_TRAVERSAL;
   filter.weight.type = FWP_UINT64;   
   filter.weight.uint64 = 1;
   filter.flags = 0;
   filter.numFilterConditions = 1; // 2 if including the socket option based condition 
   filter.filterCondition = filterConditions;
   filter.displayData.name = L"Teredo Edge Traversal dormancy callout for app A";
   filter.displayData.description = L"Teredo Edge Traversal dormancy callout filter for A.";

   FWP_BYTE_BLOB byteBlob = {0};
   filterConditions[0].fieldKey = FWPM_CONDITION_ALE_APP_ID;
   filterConditions[0].matchType = FWP_MATCH_EQUAL;
   filterConditions[0].conditionValue.type = FWP_BYTE_BLOB_TYPE;
   filterConditions[0].conditionValue.byteBlob = &byteBlob;
   filterConditions[0].conditionValue.byteBlob->data = (uint8 *)wszApplicationA;
   filterConditions[0].conditionValue.byteBlob->size = (wcslen(wszApplicationA) + 1)*sizeof(wchar_t);

   // This filter scopes to exemption to ONLY IF the socket option is set, in other words
   // application has explicitly opted in to receive Teredo traffic
   filterConditions[1].fieldKey = FWPM_CONDITION_ALE_SIO_FIREWALL_SOCKET_PROPERTY;
   filterConditions[1].matchType = FWP_MATCH_FLAGS_ALL_SET;
   filterConditions[1].conditionValue.type = FWP_UINT32;
   filterConditions[1].conditionValue.uint32 = FWP_CONDITION_SOCKET_PROPERTY_FLAG_ALLOW_EDGE_TRAFFIC;