grpc

ソースコード

grpc は、gRPC プロトコルを介してDNSメッセージをアップストリームリゾルバにプロキシすることを容易にします。

説明

grpc プラグインは、gRPCとTLSをサポートしています。

このプラグインは、サーバーブロックごとに一度だけ使用できます。

構文

最も基本的な形式では

grpc FROM TO...
  • FROM は、プロキシされるリクエストに一致するベースドメインです。
  • TO… は、プロキシ先の宛先エンドポイントです。アップストリームの数は15に制限されています。

複数のアップストリームは、初回使用時にランダム化されます(policy を参照)。プロキシがエラーを返すと、リストの次のアップストリームが試行されます。

拡張構文では、追加のノブを使用できます。

grpc FROM TO... {
    except IGNORED_NAMES...
    tls CERT KEY CA
    tls_servername NAME
    policy random|round_robin|sequential
}
  • FROMTO… は上記と同じです。

  • except 内の IGNORED_NAMES は、プロキシから除外するドメインのスペース区切りリストです。 これらの名前のいずれにも一致しないリクエストは通過します。

  • tls CERT KEY CA は、TLS接続のTLSプロパティを定義します。 0〜3個の引数を指定でき、その意味は以下に説明する通りです。

    • tls - クライアント認証は使用されず、システムのCAを使用してサーバー証明書が検証されます。
    • tls CA - クライアント認証は使用されず、ファイルCAを使用してサーバー証明書が検証されます。
    • tls CERT KEY - 指定された証明書/鍵ペアを使用してクライアント認証が使用されます。 サーバー証明書は、システムのCAによって検証されます。
    • tls CERT KEY CA - 指定された証明書/鍵ペアを使用してクライアント認証が使用されます。 サーバー証明書は、指定されたCAファイルを使用して検証されます。
  • tls_servername NAME を使用すると、TLS設定でサーバー名を設定できます。 たとえば、9.9.9.9では、これを dns.quad9.net に設定する必要があります。 このシナリオでは、複数のアップストリームが引き続き許可されますが、同じ tls_servername を使用する必要があります。 たとえば、9.9.9.9(QuadDNS)と1.1.1.1(Cloudflare)を混在させることはできません。

  • policy は、アップストリームサーバーの選択に使用するポリシーを指定します。 デフォルトは random です。

また、TLS設定はgrpcプロキシ全体で「グローバル」であることに注意してください。異なるアップストリームに異なる tls-name が必要な場合は、運が悪いです。

メトリクス

モニタリングが有効になっている場合(prometheus プラグインを介して)、以下のメトリックがエクスポートされます。

  • coredns_grpc_request_duration_seconds{to} - アップストリームインタラクションごとの期間。
  • coredns_grpc_requests_total{to} - アップストリームごとのクエリ数。
  • coredns_grpc_responses_total{to, rcode} - アップストリームごとのRCODEの数。 ランダムに(これは常に random ポリシーを使用します)アップストリームにスプレーしています。

example.org. 内のすべてのリクエストを、別のポートで実行されているネームサーバーにプロキシします。

example.org {
    grpc . 127.0.0.1:9005
}

すべてのリクエストを3つのリゾルバ(そのうちの1つはIPv6アドレスを持つ)間で負荷分散します。

. {
    grpc . 10.0.0.10:53 10.0.0.11:1053 [2003::1]:53
}

example.org へのリクエストを除くすべてを転送します。

. {
    grpc . 10.0.0.10:1234 {
        except example.org
    }
}

ホストの resolv.conf のネームサーバーを使用して、example.org を除くすべてをプロキシします。

. {
    grpc . /etc/resolv.conf {
        except example.org
    }
}

TLSプロトコルを使用してすべてのリクエストを9.9.9.9にプロキシし、すべての回答を最大30秒間キャッシュします。 9.9.9.9はTLSネゴシエーションで使用できないため、動作する設定にするには tls_servername が必須であることに注意してください。

. {
    grpc . 9.9.9.9 {
       tls_servername dns.quad9.net
    }
    cache 30
}

または、同じプロバイダーからの複数のアップストリームを使用する場合

. {
    grpc . 1.1.1.1 1.0.0.1 {
       tls_servername cloudflare-dns.com
    }
    cache 30
}

Unixドメインソケットでリッスンしているローカルアップストリームにリクエストを転送します。

. {
    grpc . unix:///path/to/grpc.sock
}

バグ

TLS設定はgrpcプロキシ全体でグローバルです。異なるアップストリームに異なる tls_servername が必要な場合は、運が悪いです。