DNSサーバの改訂

基盤:どうも新設した de.its-more.net と us.its-more.net へのアクセスが不安定だと思ったら、DNSの応答のAレコードが2つ返ってました。

基盤:このため、アプリから見るとどっちかのアドレスで行ったり来たりします。

基盤:この応答は、このデフォルトのマッチングルールのためと思われます。

開発:おや。でも7月5日のドメインの一斉引っ越し時に問題は起きてなかったような…

基盤:それは、それらのドメインがこのデフォルトルールに「のみ」マッチしたからだと思います。要するに、xso で取得してこちらにネームサーバを向け変えたドメインについてのAレコードは一切定義されていません。結局全て、デフォルトのアドレスに向けられていた。そもそもの私がDeleGate DNSサーバの仕様を勘違いしていたわけですが。

 投稿者: SATOXITS
ネームサーバ独立記念日

基盤:あ、hosts に 1.2.3.4 * って書いとけば、デフォルトが 1.2.3.4 になりますね。当面はこれで良さそうです。

開発:完全マッチが見つかったらそれ以上探さないという仕様では無いんですね?

社長:うーん、そうだったかな。何にしても、マニュアルに書かなかったってことは、決心が付いてなかったのかな。というか、DNSのオリジンサーバ部分ってほぼ自家用のつもりだったし…

社長:ちょっとソースコードを確認します。ああ、resolvy/reshosts.c の中の、RES_matchLine から呼んでる rexpmatchX でマッチングしてますね。この関数は hosts file と nis のマッチングで呼ばれている… マッチしたらそのさきは探さないというようなコードは無い。だからそういう振る舞いになります。

社長:それにしてもこの reshosts.c というソースファイル、19950817 created で 、CHANGES によるとワイルドカードを入れたのが 9.2.3 20060615です。その後 9.9.2 20090310 でユーザの要望に答えて小さな拡張、9.9.8 20140506 で yp_match にタイムアウトを入れた、となっています。足掛け20年間。青春の思い出ですね。

開発:それはそうと、今回どう対処しましょう。選択肢としては bind あたりに乗り換える。Goでシンプルなのを作る。これは小さなパッケージを作ってくれてる人がいますね。それか、DeleGateに手を入れる。

基盤:このDNSサーバが残すログとか検索カウンターとは、DeleGateの他のサービスに利用できる部分もあるので、DeleGate で行く線が有益な感じがします。

社長:そうですね。これは出身組織の知財なので、、、まあでもそれは調整します。うーん。一番簡単に実現するには。とりえあず “*” という最強ワイルドカードに対するマッチングを抑制できれば良いのかなと思いますね。これを適用するかどうかはドメイン名によるから、名前のフィールドにそういう指示を入れるのが良いでしょう。

社長:いや、ちょっと待った!CHANGESによるとこうです。

9.9.2 090310 new reshost.c: “#!max=N” in hosts-file to limit results

社長:つまり、hosts に #!max=1 って書けば、最初の一つしか結果を返さないのでは。

基盤:なるほど。やってみます。

基盤:大当たり。

開発:解決しちゃいましたね。

基盤:これはこれでとりあえず良いと思います。ただ別件ですが、例えば全ドメイン名に us. というのを頭につけたら、ドメイン名によらず xx.xx.xx.xx になるように出来ると楽なのですが。

社長:hosts に xx.xx.xx.xx us.* って書けばよいかも。

基盤:やってみます。

基盤:大当たり。

開発:けっこう気合を入れていたんですが、気が抜けてしまいました。返す最大レコード数を制限するという回避方法は、DNS/DNS や NIS/DNS の中継ではうまくいくとは限らないですが、ローカルのhostsファイルなら、単に上に書いたのが残るので確実ですね。

社長:DNSのプロキシというかリゾルバは、マッチングの結果でフィルタしたり、複数のソースからの情報を統合するのに便利なんですよね。ミクロなマウントですね。どこから聞かれたらどこを見せるとか。ドメイン名限定ですが、名前の空間を歪めたいという我社の方向性には有用なツールなんだと思います。

社長:午後までかかると思ってたんですが、終わっちゃったんでゆっくり飲んできます。

— 2020-0715 SatoxITS

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です