Eccezioni di Windows Filtering Platform per Teredo
Le eccezioni che consentono alle applicazioni di ricevere traffico non richiesto tramite Teredo tramite un firewall devono essere create usando le API della piattaforma di filtro di Windows. Questa operazione viene eseguita aprendo eccezioni basate su applicazioni in ingresso e in uscita (nome> dell'app applicazione<) nel Teredo sottostrato di ALE per il traffico IPv6. Ciò garantisce che solo le applicazioni con l'eccezione Teredo possano usare Teredo. La cautela deve essere esercitata nella creazione di queste eccezioni. L'uso dell'opzione generale " * " (tutto) potrebbe consentire ai programmi non registrati con il Teredo il traffico del sottostrato o del tunnel per passare il firewall e rappresentare una minaccia alla sicurezza.
In qualsiasi situazione è necessaria almeno un'applicazione bloccata, ma è possibile aggiungere zero o più applicazioni consentite da un firewall a seconda del numero di applicazioni consentite.
Nell'esempio seguente viene illustrato l'uso di un blocco consentito e di un blocco.
/*--
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;