インフラブログ

とあるWEBサイトのインフラを構築運用するメモ

クライアント側の名前解決を設定する

インスタンスのリゾルバを設定する

VPCインスタンスの名前解決は下記の順に行います。

  1. /etc/hosts見る
  2. /etc/resolv.confに書かれたDNSサーバに問い合わせる

/etc/resolv.confは下記のように設定します。

options single-request-reopen
search example.internal
nameserver 127.0.0.1
nameserver 自前のBINDのIP
nameserver AWSの用意したDNSのIP

ローカルにdnsmasqをいれてDNSキャッシュする

127.0.0.1が何かというと、dnsmasqというDNSサーバで、各インスタンスのローカルで起動させておきます。毎回DNSサーバに問い合わせしないようにDNSキャッシュ機能をするためです。dnsmasqにキャッシュがない場合は/etc/resolv.confに書かかれたIPにフォワードしてくれます。

dnsmasqの導入は$sudo yum install dnsmasqですんなり入ります。 ネガティブキャッシュ(名前解決できなかったということをキャッシュする)はしないようにします。

  • /etc/dnsmasq.conf
# If you want to disable negative caching, uncomment this.
no-negcache

キャッシュを全クリアしたい場合は$sudo /etc/init.d/dnsmasq force-reloadします。

インスタンス起動時に/etc/resolv.confが初期化されてしまう

最初/etc/resolv.confに上記の内容を直接ベタ書きしていたのですが、インスタンス再起動時に/etc/resolv.confが初期化?されてしまい、AWSの用意したDNSサーバのIPのみに書き換わっていたりしました。 DHCPクライアントなので/etc/resolv.confも設定されるのでしょう。

調べてたところ/etc/dhcp/dhclient-enter-hooksのファイルを用意していると、DHCP更新時の/etc/resolv.confの書き換え処理を上書きできるようです。

make_resolv_conf() {
  rscf=`mktemp /tmp/XXXXXX`;
  echo 'options single-request-reopen' > $rscf
  echo 'search example.internal' > $rscf
  echo 'nameserver 127.0.0.1' >> $rscf
  echo 'nameserver 172.31.4.75' >> $rscf
  echo 'nameserver 172.31.0.2' >> $rscf
  change_resolv_conf $rscf
  rm -f $rscf
}

今のところこれで正常に動作しているようです。