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;