CoreDNS:リクエストをrewriteする
https://1.bp.blogspot.com/-VUSfAXATfMs/Xexrcw92KDI/AAAAAAABWpI/fNuSWAtz01k0rWLI-EOoFvoo7dwZnXaLQCNcBGAsYHQ/s500/train_arashiyama_torokko.png
CoreDNS を使っているときに、特定のドメインへのリクエストを他のドメインのものに差し替えたい場合は rewrite プラグイン (デフォルトで有効) を利用します。早速設定例はこちら。 code:Corefile
example.test {
rewrite name regex example\.test httpbin.org answer name httpbin\.org example.test
forward . 8.8.4.4
log . "😺 8.8.4.4 >>> {proto} Request: {name} {type} {>id}"
}
. {
forward . 8.8.8.8
log . "🐶 8.8.8.8 >>> {proto} Request: {name} {type} {>id}"
}
設定例の内容は下記のように動作します。
example.test という存在しないドメインのレコードを聞かれたときに httpbin.org を 8.8.4.4 に聞きに行く
結果を受け取ったら CoreDNS で Answer Name を httpbin.org から example.test に変更する
ログに「😺」を出力する
それ以外のリクエストは 8.8.8.8 に聞きに行く
ログに「🐶」を出力する
dig を引いてみた結果はこちら。(dig を引く時 localhost:53 に対してリクエストすることを忘れないように)
code:dig-result(bash)
❯ dig example.test @localhost
# ...
;; QUESTION SECTION:
;example.test. IN A
;; ANSWER SECTION:
example.test. 58 IN A 34.230.193.231 # httpbin.org の IP
example.test. 58 IN A 35.170.216.115 # httpbin.org の IP
# ...
結果を受け取ったときの Answer Name の書き換えを行う場合は rewrite ルールを利用する際に 加えて answer name を利用する必要がありますが、これを指定すると rewrite で使えるルールが regex のみになるので注意しましょう。
ちなみに answer name を省略した場合 dig の結果の ANSWER SECTION が httpbin.org のものになります。 code:Corefile-without-answer-name
example.test {
rewrite name regex example\.test httpbin.org
forward . 8.8.4.4
log . "😺 8.8.4.4 >>> {proto} Request: {name} {type} {>id}"
}
. {
forward . 8.8.8.8
log . "🐶 8.8.8.8 >>> {proto} Request: {name} {type} {>id}"
}
code:dig-result-2(bash)
❯ dig example.test @localhost
# ...
;; QUESTION SECTION:
;example.test. IN A
;; ANSWER SECTION:
httpbin.org. 41 IN A 35.170.216.115
httpbin.org. 41 IN A 34.230.193.231
# ...
ちなみに・・・
このように、リクエストしたドメインに対して ANSWER SECTION の名前が異なるようなレスポンスを返す DNS を利用していると、 Node.js などのランタイムにおいては、HTTPリクエストを送る際に異常と判定して名前解決に失敗する事があるのでよほどの理由がなければ同じような環境を作る場合には answer name の書き換えを行い、レスポンスがリクエストと合致するようにしてあげましょう。