サービス検出の実行

Azure Sphere 上の高度なアプリケーションでは、DNS サービス検出 (DNS-SD) を使用してサービス検出を実行できます。 アプリケーションは、サービス検出を使用してネットワーク サービスを検索し、ホスト名解決を実行して、Azure Sphere ファイアウォールを介してサービスと対話できるようにします。 マルチキャスト DNS (mDNS) を使用して、ローカル ネットワーク上でピアツーピア検出を実行することもできます。これは、宛先エンドポイントの IP アドレスとホスト名が設計時に不明な場合に特に便利です。

アプリケーションでは、DNS-SD クエリを使用して、ローカル以外の DNS サーバーまたはマルチキャスト リンク経由で DNS レコードを取得します。 クエリ対象の名前が .local トップレベル ドメイン (TLD) の下にある場合、クエリはすべての有効なネットワーク インターフェイスを介してローカル ネットワーク上でマルチキャストされます。それ以外の場合は、ユニキャスト サービス検出が実行されます。 サービス検出サンプルは、Azure Sphere でサービス検出を実行する方法を示しています。

メモ

Azure Sphere ファイアウォールを使用すると、アプリケーションが未承認のサービスと通信できなくなります。 ただし、アプリケーション マニフェストで .local TLD への送信接続を許可すると、アプリケーションがローカル ネットワーク上でアドバタイズされる未承認のサービスに接続できるようにすることで、デバイスへのセキュリティ リスクが高まる可能性があります。 アプリケーションでは、承認されていないパーティがサービスをアドバタイズできないようにするセキュリティで保護された環境の .local TLD への送信接続のみを許可する必要があります。 このシナリオで追加の保護を提供するために、Azure Sphere では、ローカル ネットワークで検出されたサービスもローカル サブネット上に存在する必要があります。

ヘッダー ファイルを含める

サービス検出を実行するアプリケーションには、解決ヘッダー ファイルが含まれている必要があります。

 #include <resolv.h>

サービス接続を許可する

DNS-SD クエリを実行する前に、 アプリケーション マニフェストの AllowedConnections 機能にサービスを追加する必要があります。 Azure Sphere ファイアウォールにより、アプリケーションは、関連付けられているホスト名と IP アドレスを使用して、検出されたサービス インスタンスに接続できるようになります。 .local TLD サービスが指定されている場合、ファイアウォールはローカル サブネット上の検出されたリソースへの接続のみを許可します。

AllowedConnections 機能では、次の種類のサービス名がサポートされています。

  • "_sample._tcp.local" などのローカル DNS サービス名
  • "_sampleinstance._tcp.dns-sd.org" などのローカル以外の DNS サービス名
  • "_sampleinstance._tcp.hostname.local" などのローカル サービス インスタンス名
  • "samplehost.contoso.com" などのドメイン名
  • IP アドレス

ローカル以外のサービス名を含むアプリケーション マニフェストからの抜粋を次に示します。

"AllowedConnections": [ "_http._tcp.dns-sd.org" ]

DNS-SD クエリを実行する

DNS-SD クエリを実行するには、いくつかの種類の DNS レコードを要求する必要があります。

  • DNS サービスのインスタンスを列挙する PTR レコード。
  • ホスト名やポートなど、サービス インスタンスの詳細を含む SRV レコードと TXT レコード。
  • 取得したホスト名の IP アドレスを含むレコード。

クエリを送信する前に、クエリを作成して初期化してから、DNS レコードを要求するクエリ メッセージを追加する必要があります。 POSIX 関数 res_init() を呼び出すことで、DNS-SD クエリを作成および初期化できます。 POSIX 関数 res_mkquery() を呼び出すことで、クエリのメッセージを作成できます。

ユニキャスト DNS クエリを送信する

ユニキャスト サービス検出を実行するときは、POSIX 関数 res_send() を呼び出すことで、DNS-SD クエリを送信し、応答を取得できます。

マルチキャスト リンク経由で DNS-SD クエリを送信するには、アプリケーションでソケットを開き、ソケット経由でループバック IP アドレス 127.0.0.1 (宛先ポート 53) に要求を送信する必要があります。 要求が送信された後、複数の応答が返される場合があります。 アプリケーションは、すべての応答を収集するために数秒待機してリッスンする必要があります。 これは、 サービス検出サンプルで示されています。

大事な

このループバック IP アドレスはベータ機能であり、今後のリリースで廃止され、置き換えられます。 これは、アドレスに依存するアプリケーションの破壊的変更になります。

複数の IP アドレスを持つホストに対して許可される接続

Azure Sphere ファイアウォールでは、ホスト名ごとに 1 つの IP アドレスへの接続のみが許可されます。 ホストに複数の IP アドレスがある場合、Azure Sphere ファイアウォールでは、いずれかのアドレスへの接続のみが許可されます。 アプリケーションは curl を使用して、複数の IP アドレスを持つホストに HTTPS 要求を行うことができます。curl は、許可されたアドレスが見つかるまで各 IP アドレスに接続しようとします。 ただし、これにより、アプリケーションが許可されたアドレスを見つける間に遅延が発生する可能性があります。