Implementazione di filtri firewall per Teredo
Windows consente alle applicazioni di impostare un'opzione socket che consente alle applicazioni di indicare una finalità esplicita di ricevere Teredo traffico inviato al firewall host tramite la piattaforma di filtro di Windows. In Windows viene usata un'opzione socket per impostare un livello di protezione per consentire a un'applicazione di definire il tipo di traffico che è disposto a ricevere. In particolare, negli scenari che coinvolgono Teredo traffico, viene specificata l'opzione socket IPV6_PROTECTION_LEVEL. È consigliabile che le implementazioni del firewall host mantengano i filtri seguenti per consentire in modo selettivo Teredo traffico per un'applicazione, bloccando il traffico per impostazione predefinita per qualsiasi applicazione senza un'esenzione.
Filtro a blocchi predefinito per il traffico attraversato da Edge
Un firewall host deve sempre mantenere un filtro a blocchi predefinito all'interno del livello di filtro ALE_AUTH_RECV_ACCEPT_V6 per il traffico corrispondente alle condizioni di Teredo tipo di interfaccia specificato. Quando implementato, questo filtro indica la presenza di un firewall host con riconoscimento perimetrale nel sistema. Questo filtro viene visualizzato come contratto API tra il firewall host e Windows. Per impostazione predefinita, questo filtro blocca il traffico attraversato dal bordo a qualsiasi applicazione.
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;
Nota
Le classi "Recapito", "Arrivo" e "Hop successivo" delle condizioni di interfaccia vengono usate per controllare un modello host debole e l'inoltro dei pacchetti tra interfacce. Nell'esempio precedente viene usano la classe "Delivery". Esaminare Le condizioni di filtro disponibili in ogni livello di filtro nella documentazione di WFP SDK, in quanto la progettazione della sicurezza deve prendere in considerazione ogni caso.
Consenti filtro per applicazioni esentate
Se un'applicazione non riceve Teredo traffico in un socket di ascolto, è necessario implementare un filtro di autorizzazione all'interno del livello di filtro ALE_AUTH_RCV_ACCEPT_V6 nel firewall host. È importante notare che a seconda del modo in cui l'esenzione è configurata dall'utente o dall'applicazione, il firewall host può includere un'opzione socket.
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;
Filtro callout di dormancy
Il servizio Teredo in Windows implementa un modello di dormancy. In qualsiasi momento, se nessuna applicazione è in ascolto su un socket UDP o TCP con attraversamento perimetrale abilitato, il servizio passa a uno stato inattivo. Per il funzionamento del meccanismo di dormancy, il firewall host deve mantenere un filtro callout per ogni applicazione esentata specificata all'interno del livello di filtro ALE_AUTH_LISTEN_V6 per TCP e ALE_RESOURCE_ASSIGNMENT_V6 livello di filtro per le applicazioni basate su UDP. L'esempio seguente illustra un callout di dormancy per un'applicazione 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;