Implementieren von Firewallfiltern für Teredo

Windows ermöglicht Anwendungen das Festlegen einer Socketoption, mit der Anwendungen eine explizite Absicht angeben können, Teredodatenverkehr zu empfangen, der über die Windows-Filterplattform an die Hostfirewall gesendet wird. In Windows wird eine Socketoption zum Festlegen einer Schutzstufe verwendet, damit eine Anwendung definieren kann, welche Art von Datenverkehr sie empfangen möchte. Genauer gesagt wird in Szenarien mit Teredo-Datenverkehr die IPV6_PROTECTION_LEVEL Socketoption angegeben. Es wird empfohlen, dass Hostfirewallimplementierungen die folgenden Filter beibehalten, um teredo-Datenverkehr für eine Anwendung selektiv zuzulassen, während der Datenverkehr standardmäßig für jede Anwendung ohne Ausnahme blockiert wird.

Standardblockfilter für edgedurchquerten Datenverkehr

Eine Hostfirewall muss immer einen Standardblockfilter innerhalb der ALE_AUTH_RECV_ACCEPT_V6 Filterschicht für Datenverkehr beibehalten, der den angegebenen Bedingungen für Schnittstellentyptunnel und Tunneltyp teredo entspricht. Bei der Implementierung gibt dieser Filter das Vorhandensein einer edgedurchlauffähigen Hostfirewall im System an. Dieser Filter wird als API-Vertrag zwischen der Hostfirewall und Windows betrachtet. Standardmäßig blockiert dieser Filter edgedurchquerten Datenverkehr für jede Anwendung.

   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;

Hinweis

Die Klassen "Delivery", "Arrival" und "Next Hop" von Schnittstellenbedingungen werden verwendet, um ein Schwache-Host-Modell und die Paketweiterleitung über Schnittstellen hinweg zu steuern. Im obigen Beispiel wird die Klasse "Delivery" verwendet. Lesen Sie die Filterbedingungen, die auf jeder Filterebene verfügbar sind, in der WFP SDK-Dokumentation, da Ihr Sicherheitsentwurf jeden Fall berücksichtigen muss.

 

Filter für ausgenommene Anwendungen zulassen

Wenn eine Anwendung vom Empfangen von Teredo-Datenverkehr auf einem Lauschocket ausgenommen ist, muss ein Genehmigungsfilter innerhalb der ALE_AUTH_RCV_ACCEPT_V6 Filterschicht auf der Hostfirewall implementiert werden. Beachten Sie, dass die Hostfirewall je nachdem, wie die Ausnahme vom Benutzer oder der Anwendung konfiguriert wird, eine Socketoption enthalten kann.

   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;

Ruhezustands-Legendenfilter

Der Teredo-Dienst in Windows implementiert ein Ruhezustandsmodell. Wenn keine Anwendungen auf einem UDP- oder TCP-Socket mit aktiviertem Edgedurchlauf lauschen, wechselt der Dienst in einen ruhenden Zustand. Damit der Ruhezustandsmechanismus funktioniert, muss die Hostfirewall einen Legendenfilter für jede ausgenommene Anwendung beibehalten, die innerhalb der ALE_AUTH_LISTEN_V6 Filterschicht für TCP angegeben ist, und ALE_RESOURCE_ASSIGNMENT_V6 Filterschicht für UDP-basierte Anwendungen. Das folgende Beispiel veranschaulicht eine Ruhezustandsbeschriftung für eine TCP-Anwendung .

   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;