Teredo のファイアウォール フィルターの実装
Windows では、アプリケーションでソケット オプションを設定できます。これにより、アプリケーションは、Windows フィルタリング プラットフォームを介してホスト ファイアウォールに送信された Teredo トラフィックを受け取る明示的な意図を示すことができます。 Windows では、保護レベルを設定するためのソケット オプションを使用して、アプリケーションが受信するトラフィックの種類を定義できます。 具体的には、Teredo トラフィックに関連するシナリオでは、 IPV6_PROTECTION_LEVEL ソケット オプションが指定されます。 ホスト ファイアウォールの実装では、次のフィルターを維持して、アプリケーションの Teredo トラフィックを選択的に許可し、適用除外なしですべてのアプリケーションのトラフィックを既定でブロックすることをお勧めします。
エッジ 走査トラフィックの既定のブロック フィルター
ホスト ファイアウォールは、指定された インターフェイスの種類のトンネル と トンネルの種類の Teredo 条件に一致するトラフィックに対して、ALE_AUTH_RECV_ACCEPT_V6 フィルターレイヤー内で常に既定のブロック フィルターを維持する必要があります。 実装すると、このフィルターは、エッジ トラバーサル対応ホスト ファイアウォールがシステムに存在していることを示します。 このフィルターは、ホスト ファイアウォールと Windows の間の API コントラクトと見なされます。 既定では、このフィルターはエッジ トラバーサルトラフィックを任意のアプリケーションにブロックします。
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;
注意
インターフェイス条件の 'Delivery'、'Arrival'、および 'Next Hop' クラスは、インターフェイス間での弱いホスト モデルとパケット転送を制御するために使用されます。 上記の例では、'Delivery' クラスを使用しています。 セキュリティ設計では各ケースを考慮する必要があります。WFP SDK ドキュメントの 「各フィルターレイヤーで使用可能なフィルター条件 」を確認してください。
除外アプリケーションのフィルターを許可する
アプリケーションがリッスン ソケットで Teredo トラフィックを受信できないようにする場合は、ホスト ファイアウォールのALE_AUTH_RCV_ACCEPT_V6 フィルターレイヤー内に許可フィルターを実装する必要があります。 ユーザーまたはアプリケーションによる除外の構成方法によっては、ホスト ファイアウォールにソケット オプションを含めることができることに注意してください。
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;
休眠吹き出しフィルター
Windows の Teredo サービスは、休眠モデルを実装します。 エッジ トラバーサルが有効になっている UDP または TCP ソケットでリッスンしているアプリケーションがない場合、サービスはいつでも休止状態に移行します。 休止メカニズムを機能させるには、ホスト ファイアウォールは、TCP のALE_AUTH_LISTEN_V6 フィルターレイヤー内で指定された各除外アプリケーションのコールアウト フィルターと、UDP ベースのアプリケーションのフィルターレイヤー ALE_RESOURCE_ASSIGNMENT_V6維持する必要があります。 次の例は、 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;