権威DNSサーバがらみの検証用にPolarDNSを使ってみました。
レスポンスを遅延させたいとか、大量のRR(リソースレコード)を必要とする場合とかに便利に使えそうです。
※ PolarDNS のインストール方法については PolarDNS をインストール を参照。
※ここでは実際に設定、動作したものを掲載していますが、内容について保証するものではありません。流用される場合は各自の責任でお願いします。
機能概要
PolarDNS の役回りは権威DNSサーバとなる。
どのようなレスポンスが欲しいかをクライアントから指定できる。
クライアントからのリクエストの際にオプション付きのクエリ名を指定することで、PolarDNS はクエリ名に応じたレスポンスを返す。
例えば、クエリ名に size.512.slp1000.yourdomain.com を指定した場合、PolarDNS はサイズを 512バイトを上限としたレスポンスを 1000ms(1秒)の遅延で返す。
# dig @polardns size.512.slp1000.yourdomain.com +noall +stats
;; Query time: 1001 msec
;; SERVER: 172.18.1.40#53(172.18.1.40)
;; WHEN: Thu Oct 31 09:57:13 JST 2024
;; MSG SIZE rcvd: 497
クエリ名に always.ttl20000.yourdomain.com を指定した場合は、TTL=20000 の Aレコードを返す。
# dig @polardns always.ttl20000.yourdomain.com +noall +answer
always.ttl20000.yourdomain.com. 20000 IN A 2.3.4.5
PolarDNSでは、クライアントからのリクエスト時のクエリ名に対して、Features と Response modifiers という指定項目がある。
例えば、クエリ名が size.512.slp1000.yourdomain.com ならば、size が Features で、slp が Response modifiers にあたる。
Features と Response modifiers は、今示した例のように組み合わせて使うことができる。
Features はモジュール化(例えば、size を処理するのは size.toml ファイル内のコード)されており、PolarDNS 起動時に polardns_real.py に組み込まれ機能する。逆に size.toml が polardns_real.py に組み込まれていなければ、クエリ名に size を指定することはできない。
(polardns_real.py は PolarDNS起動時に polardns.py に Features が組み込まれて生成されるファイル。初回起動前には polardns_real.py は存在しない。)
Features のモジュールファイルは PolarDNS の modules フォルダを参照。
Response modifiers については polardns.py に簡易な説明が記載されているのでそちらを参照。
always(Features の1つ) と Response modifiers は、最初から polardns.py に実装されているため、独立したモジュールファイルなどは無い。
Features の使用例
always
format : always<ANYTHING>
常にAレコードで解決される
# dig @polardns always.example.com +noall +answer
always.example.com. 60 IN A 2.3.4.5
# dig @polardns always123.example.com +noall +answer
always123.example.com. 60 IN A 2.3.4.5
# dig @polardns alwaysABC.example.com +noall +answer
alwaysABC.example.com. 60 IN A 2.3.4.5
size
format : size.<BYTES>
レスポンスを<BYTES>
以下のサイズで応答する(default 512 bytes)
タイプ指定は無視され、常にAレコードが返るらしい。
# dig @polardns size.example.com +noall +stats
;; Query time: 2 msec
;; SERVER: 172.18.1.40#53(172.18.1.40)
;; WHEN: Sat Oct 19 17:32:01 JST 2024
;; MSG SIZE rcvd: 498
# dig @polardns size.100.example.com +noall +stats
;; Query time: 1 msec
;; SERVER: 172.18.1.40#53(172.18.1.40)
;; WHEN: Sat Oct 19 17:32:10 JST 2024
;; MSG SIZE rcvd: 86
self
format : self
もしくは whatismyip
クライアントが使用したIP/ポートをレスポンスとして返す。
事前にクライアント側のIPアドレスを確認。
# ip a | grep -w inet
inet 127.0.0.1/8 scope host lo
inet 172.18.1.30/24 brd 172.18.1.255 scope global eth0
inet 172.18.2.30/24 brd 172.18.2.255 scope global eth1
# dig @polardns self.example.com +noall +answer +additional
self.example.com. 60 IN A 172.18.1.30
self.example.com. 60 IN TXT "172.18.1.30:52551"
# dig @polardns whatismyip.example.com +noall +answer +additional
whatismyip.example.com. 60 IN A 172.18.1.30
whatismyip.example.com. 60 IN TXT "172.18.1.30:53289"
# dig @polardns self.example.com A +noall +answer +additional
self.example.com. 60 IN A 172.18.1.30
self.example.com. 60 IN TXT "172.18.1.30:43028"
# dig @polardns self.example.com TXT +noall +answer +additional
self.example.com. 60 IN TXT "172.18.1.30:52738"
self.example.com. 60 IN A 172.18.1.30
chunkedcnames
format : chunkedcnames<ANYTHING>.<NUMBER-OF-CNAMES>
CNAMEレコードを<NUMBER-OF-CNAMES>で指定された件数返す。
# dig @polardns chunkedcnames.6.slp150.example.com +noall +answer
chunkedcnames.6.slp150.example.com. 60 IN CNAME always777458.example.com.
chunkedcnames.6.slp150.example.com. 60 IN CNAME always718496.example.com.
chunkedcnames.6.slp150.example.com. 60 IN CNAME always155865.example.com.
chunkedcnames.6.slp150.example.com. 60 IN CNAME always226698.example.com.
chunkedcnames.6.slp150.example.com. 60 IN CNAME always438170.example.com.
chunkedcnames.6.slp150.example.com. 60 IN CNAME always247017.example.com.
※遅延(slp150)の指定は元の例に従ったため。指定しなくても問題なさそうだがなぜ指定しているのかはよくわからない。
bigtxt
format : bigtxt.<NUMBER-OF-LABELS>.<LABEL-SIZE>
分割されたTXTレコードを返す。<NUMBER-OF-LABELS>はラベルの分割数(Max:65535)。<LABEL-SIZE>は各ラベルのASCII文字(ランダム)の数(Max:255)。
# dig @polardns bigtxt.5.20.example.com +noall +answer +stats
bigtxt.5.20.example.com. 60 IN TXT "c0zv799v08dr32g22146" "eih9idvgcy6iskntu6ky" "3cp200amm3ys9qa4svvc" "v9ih9h2mcxtg2a0idgml" "ypvhyjsrs3o2zsc0ew7w"
;; Query time: 1 msec
;; SERVER: 172.18.1.40#53(172.18.1.40)
;; WHEN: Sun Oct 20 15:59:36 JST 2024
;; MSG SIZE rcvd: 158
bigbintxt
format : bigbintxt.<NUMBER-OF-LABELS>.<LABEL-SIZE>
分割されたTXTレコードを返す。<NUMBER-OF-LABELS>はラベルの分割数(Max:65535)。<LABEL-SIZE>は各ラベルのバイトデータ(ランダム)の数(Max:255)。
# dig @polardns bigbintxt.5.20.example.com +noall +answer +stats
bigbintxt.5.20.example.com. 60 IN TXT "\010c\240\217^\230\221#`\220\192\250\222\183\215\206\190^\230\192" "gz\139W\008\165\196\025\026\223 .GP\209Nx\0166\135" "Kv;\159w\154\145RY\147\237\181V-\143\156\227\182\166\145" "\021_\135\234b\162R\197\253\023\226M\128\248\191\251\222\006J\209" "%dg\184q\193_\166\248`\254\242\144\189\159\164\029\160A\187"
;; Query time: 1 msec
;; SERVER: 172.18.1.40#53(172.18.1.40)
;; WHEN: Sun Oct 20 16:02:16 JST 2024
;; MSG SIZE rcvd: 161
manytxt
format : manytxt.<NUMBER-OF-TXT-RECORDS>.<TXT-RECORD-SIZE>
TXTのRRSetを返す。<NUMBER-OF-TXT-RECORDS>はレコード数(Max:65535)。<TXT-RECORD-SIZE>は各レコードのASCII文字(ランダム)の数(Max:255)。
# dig @polardns manytxt.5.20.example.com +noall +answer
manytxt.5.20.example.com. 60 IN TXT "9pm7tp32g0klx6tahalp"
manytxt.5.20.example.com. 60 IN TXT "yrrtk05gr6lyc3ql03jl"
manytxt.5.20.example.com. 60 IN TXT "91ryoklmhii5k7fatten"
manytxt.5.20.example.com. 60 IN TXT "drzyyl3xnomo2x7o6qyj"
manytxt.5.20.example.com. 60 IN TXT "02cqzmgubw2r5httenkk"
manybintxt
format : manybintxt.<NUMBER-OF-TXT-RECORDS>.<TXT-RECORD-SIZE>
TXTのRRSetを返す。<NUMBER-OF-TXT-RECORDS>はレコード数(Max:65535)。<TXT-RECORD-SIZE>は各レコードのバイナリデータ(ランダム)の数(Max:255)。
# dig @polardns manybintxt.5.20.example.com +noall +answer
manybintxt.5.20.example.com. 60 IN TXT "\005\199\186\154w\208\219\016\009\140m\248\224\188l\164R\170\147\138"
manybintxt.5.20.example.com. 60 IN TXT "\250\146\192rq\170h\155\153y\0107\208:\005\"S\252v\008"
manybintxt.5.20.example.com. 60 IN TXT "\237P\169\181\140^?\129\185\131FS\183\227\143l\2274\192\""
manybintxt.5.20.example.com. 60 IN TXT "\159d\022\233a\137Z%e\132\146\228\178J\158\240d{\027\215"
manybintxt.5.20.example.com. 60 IN TXT "\134\245H\188\196r\206\214\203t\167\149d%k\149\156/\0009"
afuzz1
format : afuzz1.<BYTE-0-255>
<BYTE-0-255>で指定したバイト値を含めたクエリ名(不正な応答)で応答する。
# dig @polardns afuzz1.0.example.com +noall +answer
af\000zz1.0.example.com. 60 IN A 6.6.6.0
afuzz2
format : afuzz2.<NUMBER-OF-RECORDS-0-256>
0から始まるバイト値を含めたクエリ名(不正な応答)で<NUMBER-OF-RECORDS-0-256>で指定された件数分応答し、最後に正当なクエリ名で応答する。
# dig @polardns afuzz2.5.example.com +noall +answer
af\000zz2.5.example.com. 60 IN A 6.6.6.0
af\001zz2.5.example.com. 60 IN A 6.6.6.1
af\002zz2.5.example.com. 60 IN A 6.6.6.2
af\003zz2.5.example.com. 60 IN A 6.6.6.3
af\004zz2.5.example.com. 60 IN A 6.6.6.4
afuzz2.5.example.com. 60 IN A 2.3.4.5
# dig @polardns afuzz2anything.7.example.com +noall +answer
af\000zz2anything.7.example.com. 60 IN A 6.6.6.0
af\001zz2anything.7.example.com. 60 IN A 6.6.6.1
af\002zz2anything.7.example.com. 60 IN A 6.6.6.2
af\003zz2anything.7.example.com. 60 IN A 6.6.6.3
af\004zz2anything.7.example.com. 60 IN A 6.6.6.4
af\005zz2anything.7.example.com. 60 IN A 6.6.6.5
af\006zz2anything.7.example.com. 60 IN A 6.6.6.6
afuzz2anything.7.example.com. 60 IN A 2.3.4.5
customtype
format : customtype<ANYTHING>.<DNS-TYPE-IN-DECIMAL>
<DNS-TYPE-IN-DECIMAL>で指定した数値に対応するタイプのレコード(値はランダム)を返す。
# dig @polardns customtype.1.example.com +noall +answer
customtype.1.example.com. 60 IN A 113.122.132.2
# dig @polardns customtype.2.example.com +noall +answer
customtype.2.example.com. 60 IN NS hello.cp80h6hyzx1tegqayn3z43i79.com.
# dig @polardns customtype.5.example.com +noall +answer
customtype.5.example.com. 60 IN CNAME hello.gyn50o42eb46sgj7wp6wn0b2b.com.
# dig @polardns customtype.16.example.com +noall +answer
customtype.16.example.com. 60 IN TXT "v2j0r3pb8ei3rr8nmkzfq01lcij4k78d08gzqj0f1t3pzcisnltp1cjf277rim4zzmos5xblkld2n1w84ywev2hsuxunbqptxww3cokmb7si8bhunirnzx0vmx60tngv48rm1bofob8dadq34dqij27tpuj2vsp6vrxcbcq9s8zytuxcmah6k8198uv5ncbenph01hj5b82cl9ufxayt76acug6e7qvyv2pgjfib69t1abq5rrw6qfm2e5uhm"
# dig @polardns customtype.25.example.com +noall +answer
customtype.25.example.com. 60 IN KEY 1384 101 108 bG8ZN3AxbnRjZXN6cHJzZDM2MDJ4MXNwZG9maANjb20A
# dig @polardns customtype.43.example.com +noall +answer
customtype.43.example.com. 60 IN DS 64887 107 114 6A796D79366A713678346B33716A6B7839677933686274636F75667A 766F7878356E7A746E6179683272726D68646E7876716B3861306E61 70347A7339333876307834396A73623539626267366B746A35323972 39796635736D356B3073616B66687679693073766C3363307875396A 38767A6A32767935377A75366E626A70387861353171707838626468 396E696A3364727663696B673177616D3837716C7668696F79737473 753966636E316A70646434626E63703565313137713031786B77657A 6D6D6939627336626739317873796D303973626468626B6D7A646834 7875696A387665656979706269366732796867676A6B6E6C7777
# dig @polardns customtype.48.example.com +noall +answer
customtype.48.example.com. 60 IN DNSKEY 64889 105 122 eTdvN3MxaWdoZnNqNDJyZTNpdnJmdXgyd3phaWgyZDRmM2hvN2NsYWQz b2Y4d21yYjN5MDM3ZXRtYnRqY3NiZnF2c213dHBhbXpkZHpiNzRhZXJs cmMzM2h0aWt2MzlybjdwaG04cDVtNHJ6OTlnem5rNDdmNGpwZjB4ZGZp dTNmZzRrdTIzYm51MGxkcm15MXI2OXgxazJvb3oyNTdtdXFtZTFhaXFs cDZkaHh5cXplbzI4YzBucjA5bTQxdDFnYWd4cTVhdDRkdzNjdDZmbTBo OXg5bXBxcXg1N2h6bWhwZzBrd3lpZWh6Njc5OXQ5NTc5cWxmeGExdw==
# dig @polardns customtype.59.example.com +noall +answer
customtype.59.example.com. 60 IN CDS 64875 98 48 6A6F6171696B67657136397A30316F6F377834367A39623773646662 7730307967657766706D766F696C726F6F6C7A6D63636E7069716333 666766303238716D70336C6E3639627532716D6B6E76697067676677 33646476333577646D717671677A336967307533367267666B363072 6170663577703767786F377736756A6A6D706F7236343175656B6562 777233767334736430626C7271737273646C6B72766533696B656C30 356B33797333687A367973657132656175756234613930346E653565 7567326B356F396C636D7335747573696F66797266777438356F706A 34746C386B6536306C6E707A736638706B7A6D3773727876687A
# dig @polardns customtype.60.example.com +noall +answer
customtype.60.example.com. 60 IN CDNSKEY 64867 121 101 NnVzaGppcGlzN3BneTZvcnhta2x5eGNhcG1oeW5uZGM3YnRmdXhnMm5v ejl1cjgwNWI0bWtjc3VpemFwMjh3ZjYxN2pyeHNsanBia2R2emt2dnB2 NGFidGZlMmZ2OGtqa3RrejA5N2xxd2h1Mmt4YzQ1ZzVueDVxcngzc3V0 bDk5Mm56b2Juc2NhaGxlMXl1cTJ1M3cyamhubDdqcnFwZXZrZTJuM3hq MjB2MGdqOG5zYTc2NW01cjVzd2ZteDJrN2dqbzQ1aWp4YXo0dzEzZ3Z2 Y2hybnlzMXZ6NzhyNzBuOXZ1d2I3Z3dmZWViaDE5dW55eXUyYmdtYw==
# dig @polardns customtype.65.example.com +noall +answer
customtype.65.example.com. 60 IN TYPE65 \# 254 FD35706274383374767335716762377463306B3963376D6165637135 7A356A69336D75753534713631397A7A6E3930777A613239376B3772 68647A6763717462306475736C386F63706D64353076747065303865 696C68627A6138337062706365756D626A3372636177643477666267 38773278786867726336666733396B7A706E64733277757A32796261 327A7A376F393573306D6F7536346F7369646F73776F633078337279 617A61647539336771747463367A35353673703236737A6E676E6266 6B71386E6A30626E73383973707672386833736E7666716E7978666D 74386A7169676D676C3668757265377576797873666876616D363173 7534