Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
System Windows umożliwia aplikacjom ustawienie opcji gniazda, która umożliwia aplikacjom wskazanie jawnego zamiaru odbierania ruchu Teredo wysyłanego do zapory hosta za pośrednictwem platformy filtrowania systemu Windows. W systemie Windows opcja gniazda do ustawiania poziomu ochrony służy do zezwalania aplikacji na definiowanie typu ruchu, który chce odbierać. W szczególności w scenariuszach obejmujących ruch Teredo określono opcję gniazda IPV6_PROTECTION_LEVEL. Zaleca się, aby implementacje zapory hosta obsługiwały następujące filtry, aby selektywnie zezwalać na ruch Teredo dla aplikacji, jednocześnie blokując ruch domyślnie dla każdej aplikacji bez wykluczenia.
Domyślny filtr bloku dla ruchu przechodzącego przez krawędź
Zapora hosta musi zawsze utrzymywać domyślny filtr blokujący w warstwie filtrowania ALE_AUTH_RECV_ACCEPT_V6 dla ruchu zgodnego z warunkami określonymi przez typ interfejsu Tunel oraz typ tunelu Teredo. Po zaimplementowaniu ten filtr wskazuje obecność zapory hosta obsługującego przechodzenie brzegowe w systemie. Ten filtr jest postrzegany jako umowa API między zaporą hosta a systemem Windows. Domyślnie ten filtr zablokuje ruch przechodzący przez krawędź do dowolnej aplikacji.
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;
Notatka
Klasy "Delivery", "Arrival" i "Next Hop" warunków interfejsu służą do kontrolowania modelu słabego hosta i przekazywania pakietów między interfejsami. W powyższym przykładzie użyto klasy "Delivery". Zapoznaj się warunki filtrowania dostępne w każdej warstwie filtrowania w dokumentacji zestawu SDK programu WFP, ponieważ projekt zabezpieczeń musi wziąć pod uwagę każdy przypadek.
Zezwalaj na filtrowanie dla wykluczonych aplikacji
Jeśli aplikacja jest wyłączona z odbierania ruchu Teredo na gnieździe nasłuchującym, filtr zezwolenia musi być zaimplementowany w warstwie filtrowania ALE_AUTH_RCV_ACCEPT_V6 w zaporze hosta. Należy pamiętać, że w zależności od sposobu konfigurowania wykluczenia przez użytkownika lub aplikację zapora hosta może zawierać opcję gniazda.
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;
Filtr wywołania uśpienia
Usługa Teredo w systemie Windows implementuje model uśpienia. W danej chwili, jeśli żadna aplikacja nie nasłuchuje na gniazdach UDP lub TCP, które mają włączone przechodzenie krawędzi, usługa przechodzi do stanu uśpienia. Aby mechanizm uśpienia działał, zapora hosta musi utrzymywać filtr zgłoszeń dla każdej wykluczonej aplikacji określonej w warstwie filtrowania ALE_AUTH_LISTEN_V6 dla protokołu TCP i w warstwie filtrowania ALE_RESOURCE_ASSIGNMENT_V6 dla aplikacji opartych na protokole UDP. Przykład poniżej demonstruje wezwanie do uśpienia dla aplikacji 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;