/
カテゴリー

概要

名前解決をしてくれるコードを用意した。これを実際に使用した所うまくキャッシュを参照できていない様子。
DNSキャッシュサーバとしてsystemd-resolvedが動いているのだが、どうにかしてキャッシュを参照するようにしてほしい。

前提条件

  • ~/配下にresolve.c,resolveというファイルが存在するがこれを編集してはいけない。
  • /etc/resolv.conf に変更を加えてはならない。

初期状態

./resolver hoge.hogeを実行してもキャッシュサーバを参照してくれない。

終了状態

./resolver hoge.hogeを実行した時にキャッシュを参照してくれる。
キャッシュのヒット数などはresolvectl statisticsなどで確認できる。

解説

systemd-resolvedはDNSキャッシュサーバーです、resolver.cではgethostbyname()が利用されており、通常glibcはnsswitchを利用してgethostbyname()のバックエンドを切り替えるのですが、nsswitchがresolve(つまりnss_resolve.so)を読むような設定にしていないと、files(つまりnss_files.so)しかよみこまれないため、/etc/hostsへDNSリクエストをしてしまい、キャッシュが使えません。

回答例

・・・
group:       sss files systemd
hosts:      resolve files dns

services:   files sss
netgroup:   sss
・・・

このhostsの部分にresolveを書き加えることで、この問題は解決できます。
この並びにも意味が有り、左が参照される優先度が一番高く、右に行くほど優先度が低くなります。

講評

この問題で /run/systemd/resolve/stub-resolv.conf のシンボリックリンクを/etc/resolv.confに置き換えて回答している方がいましたが、これは「/etc/resolv.confに変更を加えてはならない。」という条件に抵触しているため、採点に影響させています。