Teredo에 대한 Windows 필터링 플랫폼 예외
애플리케이션이 방화벽을 통해 Teredo 통해 원치 않는 트래픽을 수신하도록 허용하는 예외는 Windows 필터링 플랫폼 API를 사용하여 만들어야 합니다. 이 작업은 IPv6 트래픽에 대한 ALE의 Teredo 하위 계층에서 들어오고 나가는 애플리케이션 기반 예외(애플리케이션 <앱 이름>)를 열어서 수행됩니다. 이렇게 하면 Teredo 예외가 있는 애플리케이션만 Teredo 사용할 수 있습니다. 이러한 예외를 만들 때는 주의해야 합니다. 일반 " * " (모두) 옵션을 사용하면 Teredo 하위 계층 또는 터널 트래픽에 등록되지 않은 프로그램이 방화벽을 통과하고 보안에 위협이 될 수 있습니다.
어떤 상황에서든 하나 이상의 차단된 애플리케이션이 필요하지만 허용해야 하는 애플리케이션 수에 따라 방화벽에서 0개 이상의 허용된 애플리케이션이 추가될 수 있습니다.
다음 샘플에서는 하나의 허용 및 하나의 블록을 사용하는 방법을 보여 줍니다.
/*--
Routine Description:
Adds the necessary filters to permit specific applications and block all other
via the Windows Filtering Platform (WFP).
Arguments:
[in] HANDLE engineHandle - Handle to the base firewall engine.
[in] FWP_BYTE_BLOB* applicationId - Identifier for this application.
Return Value:
NO_ERROR or a specific Result
--*/
DWORD Result = NO_ERROR;
FWPM_FILTER0 Filter;
FWPM_FILTER_CONDITION0 FilterConditions[3]; // We only need three.
DWORD TempResult;
FWP_BYTE_BLOB* applicationId;
printf("Starting Transaction\n");
Result = FwpmTransactionBegin0(engineHandle, 0);
if (NO_ERROR != Result)
{
goto abort;
}
printf("Successfully Started Transaction\n");
RtlZeroMemory(&Filter, sizeof(FWPM_FILTER0));
Filter.layerKey = FWPM_LAYER_ALE_AUTH_RECV_ACCEPT_V6;
Filter.displayData.name = L"Teredo Filter for Application Specific Permit";
Filter.displayData.description = L"Implement Teredo Filter for Application Specific Permit at the Recv Accept layer";
Filter.action.type = FWP_ACTION_PERMIT;
Filter.subLayerKey = FWPM_SUBLAYER_TEREDO;
Filter.weight.type = FWP_EMPTY; // auto-weight
Filter.filterCondition = FilterConditions;
Filter.numFilterConditions = 3;
RtlZeroMemory(FilterConditions, sizeof(FilterConditions));
//
// Enable this for IfType == Tunnel, TunnelType == Teredo.
//
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;
//
// Enable this for IfType == Tunnel, TunnelType == 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;
//
// Add a permitted application.
//
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 = applicationId;
printf("Adding Recv Accept Application specific V6 Teredo Filter.\n");
Result = FwpmFilterAdd0(engineHandle,
&Filter,
NULL,
NULL);
if (NO_ERROR != Result)
{
goto abort;
}
printf("Successfully added Recv Accept Application specific V6 Teredo Filter.\n");
Filter.layerKey = FWPM_LAYER_ALE_AUTH_RECV_ACCEPT_V6;
Filter.displayData.name = L"Teredo Filter for Blocking other applications";
Filter.displayData.description = L"This blocks any other traffic coming in over the Teredo interface that hasn't explicitly been permitted.";
Filter.action.type = FWP_ACTION_BLOCK;
Filter.subLayerKey = FWPM_SUBLAYER_TEREDO;
Filter.weight.type = FWP_EMPTY; // auto-weight
Filter.filterCondition = FilterConditions;
Filter.numFilterConditions = 2;
RtlZeroMemory(FilterConditions, sizeof(FilterConditions));
//
// Enable this for IfType == Tunnel, TunnelType == Teredo.
//
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;
//
// Enable this for IfType == Tunnel, TunnelType == 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;
printf("Adding Recv Accept block all non-permitted V6 Teredo Filter.\n");
Result = FwpmFilterAdd0(engineHandle,
&Filter,
NULL,
NULL);
if (NO_ERROR != Result)
{
goto abort;
}
printf("Successfully added Recv Accept block all non-permitted V6 Teredo Filter.\n");
printf("Committing Transaction\n");
Result = FwpmTransactionCommit0(engineHandle);
if (NO_ERROR == Result)
{
printf("Successfully Committed Transaction\n");
}
goto cleanup;
abort:
printf("Aborting Transaction\n");
TempResult = FwpmTransactionAbort0(engineHandle);
if (NO_ERROR == TempResult)
{
printf("Successfully Aborted Transaction\n");
}
cleanup:
return Result;