諸般の事情で常時稼働のサーバに登録しておく DNS サーバを DHCP で配る以外にも登録しておきたかった。

ところが情報がなかなか見つからない。

しばらく寝かせておいたけど、解決できたので、めもめも。

環境

常時稼働させているサーバがある。定期的に外に接続してなんやかんやを する。

実はこのサーバには、物理的に 2 つの出口がある。 また、その 1 つは時々使えなくなる。

色々と伏せて書くとこんな感じ。

で、通常はデフォルトゲートウェイから出ていくので問題は無いのだが、 DNS だけ、他方の口から引いているため(/etc/resolv.conf に従って)、 そっちが使えなくなると外部接続しなくなり、目的の作業が失敗してしまう。

デフォルトゲートウェイを A 、もう一つを B とすると、 通信自体は A 経由でできる状態なのに B 経由で DNS を問い合わせするために IP アドレスが取得できず、通信そのものが失敗するって状況。

原因

DNS をどこから引くかは /etc/resolv.conf にある nameserver エントリ を参照する。このエントリは 3 つまで有効。

対象サーバの /etc/resolv.conf を見ると B サーバから配られた エントリ 1 つだけだった。

ここに手動で A 側の nameserver エントリを追加してもいつの間にか1 消えてしまう。

色々調べたけど、上手くヒットする情報が見つからない。基本的な情報が多すぎて、 こういうオプション情報が埋もれている感じ。

ただ、/etc/resolv.conf を書き換えるサービスが色々あるので、 その調停が問題になる事があるって事は分かった。

やりたいこと

通常は B 側の DNS 引きが動いているので問題は無い。 問題は、B 側が居なくなったとき。

おそらく、B 側へ DNS を引きに行って失敗するだろう。今までだと 他の nameserver エントリが無いので、そこで失敗が確定してしまう。

実際には A 側へ引きに行くこともできるので、B 側で失敗したら A 側で再度 引ける様に /etc/resolv.confnameserver エントリが もう 1 つあれば良い。

順序として次になる様、記述としては下に来る様にする。

何なら更なる予備として google (8.8.8.8) のエントリを入れても良いかもしれない。 エントリが 3 個まで有効なのだから、もう 1 つ記述できる。

検索

どうやら、ディストリビューション毎に事情が違うらしいので、Debian を 検索ワードに含めてやり直した。

最初に Debian の Wiki を見つけた。

/etc/resolv.conf を書き換えさせないために /etc/dhcp/dhclient.confsupersede domain-name-servers を 指定する例がある。 ただ、このページの日本語ページは無かった。

supersede と言うワードを追加して検索し man ページ に行き着いた。やっぱり日本語は良いなぁ

URL の通り、wheezy って事で資料としては古いけど、この辺りはあまり変わって いないはず。

で、やってみたら append で行けた。

修正内容

/etc/dhcp/dhclient.conf に以下を追加する

append domain-name-servers 127.0.0.1;

これで /etc/resolv.conf が、以前の DHCP で取得した内容に加えて

nameserver 127.0.0.1

という行を持つようになった。

これで B 側へ引きに行って失敗したら append で指定したサーバへ引きに 行く(はず)だ。

注:上記の 127.0.0.1 は例で実際には別の記述だ。8.8.8.8 でも 1.1.1.1 でも 良い。まぁ、推奨は自分のプロバイダだったはず。

その他の指定

append 以外にも default/supersede/prepend が 指定できる。 書式はどれも同じ。

以下は実際には試していないものも含むので、予想を含むのだが、 こんな感じになるのだろう。nameserver 行は 3 つまで有効で、 上からトライするのだから。

他(domain-name や domain-search など)は不明。

default

DHCP から設定が取得できなければこちらを使う

/etc/resolv.conf 中には指定した nameserver 行か DHCP から取得した行の一方が記述される(予想)

supersede

DHCP から取得した設定を使わない

/etc/resolv.conf 中には指定した nameserver 行以外の記述がなくなる

prepend

DHCP から取得した設定より優先する。

/etc/resolv.conf 中で、指定した nameserver 行がより上になる

append

DHCP から取得した設定のバックアップとして機能する

/etc/resolv.conf 中で、指定した nameserver 行がより下になる

  1. もちろん、次の DHCP の更新時だ