tech memo

調べたこと、試したことの覚書です

DNS ANAMEレコード (PowerDNS の ALIASレコード) を試してみる

DNS ANAMEレコード / PowerDNS ALIASレコード 関連記事

 

 

はじめに

Address-specific DNS aliases (ANAME) 」というDNS関連の Internet Draft が、2017年よりIETFに提出されており、つい先日 draft-03 が提出されました 🎉 

  • draft-00 ( 2017-03-24 提出, 2017-11-25 Expire )
  • draft-01 ( 2018-01-11 提出, 2018-07-15 Expire )
  • draft-02 ( 2018-10-15 提出, 2019-04-22 Expire )
  • draft-03 ( 2019-04-15 提出, 2019-10-17 Expire )  ← NEW

普段DNS関連技術は触れていないのですが、諸用により ANAMEレコード関連の情報を確認したり、draft-03 を確認したりなどをしていたため、微々たる情報量ではありますが、得た情報をこちらに書き留めておきます。

PowerDNS では ANAMEレコードの一部の機能を「ALIASレコード」として実装しているため、この機能を試してみた内容と併せて紹介しておきます。

なお、この記事においては、ANAMEレコードについての情報の一部分の紹介になります。すべての情報は書いていませんので、障りとしての参考情報程度にしていただけたらと思います。

 

CNAMEレコードの制約、ANAME レコードがなぜ必要なのか?

CNAMEレコードの制約

DNSプロバイダの DNS Made Easy が作成されている ANAMEレコードの紹介動画 ( Introducing the ANAME Record - YouTube ) がとても分かりやすかったのでお勧めです。英語が問題ない方はこちらの動画を確認していただくと、4分程度でざっと雰囲気を把握できるかと思います。

DNSではCNAMEレコードを使ってドメイン名の別名を定義することができます。しかし、CNAMEレコードには仕様上の制約があり、下記のことができません。

① Zone Apex(別名: Root Domain / Naked Domain) では CNAMEレコードを 作成することができない

私が所有している"1773.work"というドメインの例

(NG) 1773.work ← これはZone ApexなのでCNAME作成できない
(OK) example.1773.work ← これはサブドメインなのでCNAME作成可能

② CNAMEレコードはユニークでなければならない (同一の名前を他のレコードと共有することができない)

<NG その1> CNAMEを複数書いたりはできない

 examle.1773.work.    IN    CNAME    sv1.1773.work.
 examle.1773.work.    IN    CNAME    sv2.1773.work.

<NG その2> MXなど他のリソースレコードタイプと重複したりもできない

 example.1773.work.   IN    MX    10    mail.1773.work.
 example.1773.work.   IN    CNAME    origin.1773.work.

また、一般的なCNAMEレコードの参照では、DNS lookup を2度実行する必要があるため、参照速度が遅くなります。1度目のlookupでCNAMEレコードを見つけ、2度目のlookupで参照先のIPアドレスを見つけます。

これらの制約を解決するANAMEレコード

ANAMEレコードでは、CNAMEレコードのようにドメイン名の別名を定義できますが、上記のCNAMEレコードの仕様上の制約が取り除かれています

 

ANAME レコード 表示形式 と 専門用語

draft-03 より確認した  ANAMEレコードの表示形式 および 専門用語を紹介します。

表示形式

ANAMEレコードの表示形式はCNAMEレコードと同様です。

(owner)    (ttl)    (class)    ANAME    (target)
専門用語

Address Record : リソースレコードタイプが A または AAAA の DNSリソースレコード(名前やTTLなどを含むRRset全体)

Address Type : リソースレコードタイプ が A または AAAA のもの

Address Query : 任意の Address Type に対する DNSクエリ

Sibling Address Record : ANAMEと同じowner名のAddress Recordで、ANAMEの置き換えの対象

Target Address Record : ANAMEの最尾の対象 を解決して取得した Address Record

 

ANAMEレコードと、PowerDNS の ALIAS レコード について

PowerDNS は OSS の DNSサーバです。

Internet Draft 内 の Appendix では PowerDNS での実装について下記のように述べられています。

Appendix A. Implementation status

PowerDNS currently implements a similar authoritative-only feature using "ALIAS" records, which are expanded by the primary server and transfered as address records to secondaries.
======
PowerDNSは、現在、"ALIAS"レコードを使用して同様の権威のみの機能を実装しています。
プライマリサーバによって拡張され、アドレスレコードとしてセカンダリに転送されます。

 ( Address-specific DNS aliases (ANAME)  - draft-03 より抜粋)

 

PowerDNS Authoritaive Server の ALIAS レコードを試してみる

PowerDNS Authoritative Server ( 以降、PowerDNS と略 ) の 導入およびセットアップについては、公式ドキュメント  を参考に実施しました。

 PowerDNS での ALIASレコードの制御には pdns.conf に下記 3つのパラメタを記述しました。

  • expand-alias=yes : ALIASレコード拡張を有効にする。(v4.1.0以降)
  • resolver=(任意のアドレス):53 : ALIAS(と内部スタブリゾルバ)のリゾルバアドレス。(v4.1.0以降) 今回は自分の個人運用しているDNSサーバに向けています。
  • outgoing-axfr-expand-alias=yes : AXFRでのALIASレコード拡張を有効にする。(この内容についてはまだ検証できていませんが、一旦投入しています)
DNSレコードの準備

PowerDNSではいくつかのバックエンドの選択があります。私は PostgreSQL を選択しましたので、そちらの形式でレコードを準備します。

今回問い合わせ対象の name を "example.1773.work" とします。

■ ALIAS(ANAME)レコードの準備 (DNS-1 にて準備)

pdns=# SELECT * FROM domains ; 
id | name | master | last_check | type | notified_serial | account
----+--------------------+--------+------------+--------+-----------------+---------
1 | example.1773.work | | | NATIVE | |
pdns=# SELECT id, domain_id, name, type, content, ttl FROM records ;
id | domain_id | name | type | content | ttl
----+-----------+-------------------+-------+------------------+------
1 | 1 | example.1773.work | SOA | (略) | 60
2 | 1 | example.1773.work | NS | (略) | 60
3 | 1 | example.1773.work | ALIAS | origin.1773.work | 60

 ALIAS(ANAME)に利用するnameはSOA,NSと共用しており、CNAMEでは制限のため利用できないパターンになります。

■ Sibling Address Record の準備 (DNS-2 にて準備)

pdns.conf にてresolverとして指定したDNSサーバにレコードを準備します。こちらはNSDなので、その形式で準備しました。

origin.1773.work.    IN    A    10.20.100.10
DNS lookupの実行

この状態で DNS-1 に対して lookup を実行します。結果は下記のようになりました。

 # dig example.1773.work
 
 ; <<>> DiG 9.11.3-1ubuntu1.5-Ubuntu <<>> example.1773.work
 ;; global options: +cmd
 ;; Got answer:
 ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 35817
 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
 
 ;; OPT PSEUDOSECTION:
 ; EDNS: version: 0, flags:; udp: 512
 ;; QUESTION SECTION:
 ;example.1773.work.                        IN      A
 
 ;; ANSWER SECTION:
 example.1773.work.         358     IN      A       10.20.100.10
 
 ;; Query time: 190 msec
 ;; SERVER: (問い合わせ先)#53(問い合わせ先)
 ;; WHEN: Thu Apr 26 01:32:03 JST 2019
 ;; MSG SIZE  rcvd: 59
 

 

ANSWER SECTION にて 解決された Target Address Record が参照できることを確認しました。

 

DNS ANAMEレコード (PowerDNS ALIASレコード) を試してみた 紹介でした。