Systemd-resolveを使っていても/etc/resolv.confを見るソフトウェア(GnuPG等)があるのでスタブを置く必要がある

要約

  • GnuPG(gpg)は /etc/resolv.conf を見るので、名前解決にsystemd-resolveを使っていると機能しなくなる
  • ln -nfs /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf をしておきましょう

Systemd-resolvedを使っていても/etc/resolv.confを見るソフトウェアがあるので注意、という感じだった。

多分、普通は遭遇することはないんだろうけど、Arch Linuxだとこういうの全部自分でやれって感じだから引っ掛かる気がする。

Alma LinuxとかUbuntuを触ってるときは全く気にしたことなかったんだけども。ブラックボックスに慣れてしまうとダメですな。

背景

Arch Linuxで AURにあるパッケージ(zfs-dkms)を入れようとmakepkgをしたところ、 ==> ERROR: One or more PGP signatures could not be verified! になった。

gpgよくわからんけど、鍵がないんだろうと思い以下を実施。

gpg --recv-keys 6AD860EED4598027

しかし、これはgpg: keyserver receive failed: Server indicated a failure になる

ちなみにキー自体はちゃんと存在するようだった。

https://keyserver.ubuntu.com/pks/lookup?search=6AD860EED4598027&fingerprint=on&op=index

デバッグログ出してみてもよくわからん。

$ gpg --verbose --debug-all --search-keys 6AD860EED4598027
gpg: reading options from '[cmdline]'
gpg: reading options from '/home/ryozi/.gnupg/common.conf'
gpg: enabled debug flags: packet mpi crypto filter iobuf memory cache memstat trust hashing ipc clock lookup extprog
gpg: enabled compatibility flags:
gpg: DBG: [no clock] start
gpg: DBG: chan_3 <- # Home: /home/ryozi/.gnupg
gpg: DBG: chan_3 <- # Config: /home/ryozi/.gnupg/dirmngr.conf
gpg: DBG: chan_3 <- OK Dirmngr 2.4.7 at your service, process 6056
gpg: DBG: connection to the dirmngr established
gpg: DBG: chan_3 -> GETINFO version
gpg: DBG: chan_3 <- D 2.4.7
gpg: DBG: chan_3 <- OK
gpg: DBG: chan_3 -> KS_SEARCH -- 6AD860EED4598027
gpg: DBG: chan_3 <- ERR 219 Server indicated a failure <Unspecified source>
gpg: error searching keyserver: Server indicated a failure
gpg: keyserver search failed: Server indicated a failure
gpg: DBG: chan_3 -> BYE
gpg: DBG: [no clock] stop
gpg: keydb: handles=0 locks=0 parse=0 get=0
gpg:        build=0 update=0 insert=0 delete=0
gpg:        reset=0 found=0 not=0 cache=0 not=0
gpg: kid_not_found_cache: count=0 peak=0 flushes=0
gpg: sig_cache: total=0 cached=0 good=0 bad=0
gpg: objcache: keys=0/0/0 chains=0,0..0 buckets=0/0 attic=0
gpg: objcache: uids=0/0/0 chains=0,0..0 buckets=0/0
gpg: random usage: poolsize=600 mixed=0 polls=0/0 added=0/0
              outmix=0 getlvl1=0/0 getlvl2=0/0
gpg: rndjent stat: collector=0x0000000000000000 calls=0 bytes=0
gpg: secmem usage: 0/32768 bytes in 0 blocks

そもそもkeyserverどこみてるのかわからんし、名前解決してるのかもわからん。そういうログは出ないのか?

でもpingcurlは使えるんだからネットワーク的に問題はないだろう。…これが長引いた原因だった。

1時間ほど解決できず調べていたら以下のtopicにたどり着いた。

https://bbs.archlinux.org/viewtopic.php?id=268048

これっぽい、と思った。

systemd-resolveを使っていると、/etc/resolv.conf が空っぽになるのだが、これがgpg(dirmngr?)にはよくないようだった。

$ cat /etc/resolv.conf
# Resolver configuration file.
# See resolv.conf(5) for details.

というわけで、topicにあった以下を試した。

sudo ln -nfs /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf

その後、うまくいった。難しいなぁ。

$ gpg --recv-keys 6AD860EED4598027
gpg: key 6AD860EED4598027: public key "Tony Hutter (GPG key for signing ZFS releases) <hutter2@llnl.gov>" imported
gpg: Total number processed: 1
gpg:               imported: 1

なお、gpgコマンドを叩くと、裏でdirmngrが立ち上がるようで、pkill dirmngrをしたほうがいい場合もあるかもしれない。(disable-ipv6の設定を反映させる場合は必要だった)

でもなんでこんなことに、と思って調べることにした。Arch Linuxwikiを見てるとこんなことが書かれていた。

systemd-resolved - ArchWiki

ウェブブラウザ や GnuPG など、/etc/resolv.conf を直接読み取るソフトウェアにドメイン名前解決を提供するために、systemd-resolved にはファイルを処理するための 4 つの異なるモード( スタブ、スタティック、アップリンク そしてフォーリン )があります。それらは、systemd-resolved(8) § /ETC/RESOLV.CONF で説明されています。ここでは推奨モード、すなわち、/run/systemd/resolve/stub-resolv.conf を使用するスタブモードにのみ注目します。

そうですか…