TailscaleとNetworkManagerによるDNS情報の書き換えバトルを止める方法

ことあらまし

TailscaleとNetworkManagerが/etc/resolv.confを好き勝手に書き換えてしまうので、大学に持ち込むラップトップPCで、TailscaleのVPN(tailnet)上にデプロイしたwebアプリにアクセス(名前解決)できない or 学内サービスにアクセス(名前解決)ができないといった問題が起こってしまいました。

systemd-resolvedを使えばいいよという情報がTailscaleの公式の記事には書いてあったのですが、ここでさらに如何せん自分の環境が非systemd環境(OpenRC環境)なもので、この方法も適用できないという問題が発覚してしまいました。

今回はそれらの問題を解決した話を書いていきます。

/etc/resolv.conf

DNS情報が書き込まれるファイルです。これにはDNSサーバのIPアドレスが記述され、基本的にはルータのアドレス、ないしはルータに設定された値が書き込まれます。デスクトップ用途で利用しているLinux環境では、ユーザがこのファイルをいじることはあまりなく、基本的にNetworkManagerやdhcpcdなどのネットワーク管理ソフトがこのファイルにDNS情報を書き込みます。また、Tailscaleもこのファイルに独自のDNS情報を書き込みます。

書き換えバトル

/etc/resolv.confは前述の通り、DNS情報がNetworkManagerによって書き込まれます。そして、Tailscaleもこのファイルを操作し、Tailscale用にDNS情報を書き込みます。そして、これらの書き込み操作にトランザクションのような概念は存在せず、それぞれ自分勝手に元あった情報を抹消して書き換えるので、片方のDNS情報が欠落してしまいます。これが、Tailnetあるいは学内で名前解決できなくなる原因になっていました。

resolvconf

resolv.confではありません。reolvconfです。/etc/resolv.confの管理ツールで、ネットワーク管理ツールから依頼を受けて書き換えを行います。加えて、ユーザが設定した値を先頭に書き込む機能などもあります。

この仁義なき書き換えバトルに終止符を

NetworkManagerの設定 for Gentoo

USEフラグにresolvconfを追加して以下のおなじみのコマンドでNetworkManagerをリビルドします。

# emerge -avuDN @world

NetworkManagerの設定 for Other Distributions

oepnresolvのインストールをします。インストール方法はディストリによって異なります。Archであればpacman、Ubuntuならapt、Fedoraならdnfで入るらしいです(情報量0の情報とはこのこと)。

その後、/etc/NetworkManager/conf.d/rc-manager.confに以下の内容を記述します。

[main]
rc-manager=resolvconf

これによって、NetworkManagerが取得したDNS情報の/etc/resolv.confへの書き込みをresolvconfが行うようになります。

Tailscaleの設定

以下のコマンドを管理者権限で実行してTailscaleからの/etc/resolv.confの書き換えを止めます。

# tailscale set --accept-dns=false

resolvconfの設定

/etc/resolvconf.confに以下の内容を記述します。

prepend_search="[MagickDns1] [MagickDns2]"
prepend_namesaervers="100.100.100.100"

これによって、/etc/resolv.confの先頭にTailnetのDNS情報が書き込まれるようになり、その下にNetworkManagerが取得したDNS情報が追記されます。

PCの再起動

以上の操作が完了したら、PCの再起動をしていきます。

再起動後十分に時間が経った後に/etc/resolv.confを確認して以下のようになっていれば完了です。

# Gemerated by resolvconf
search [MagickDns1] [MagickDns2]
nameserver 100.100.100.100
nameserver xxx.yyy.zzz.www
etc...

参考

  1. Gentoo Wiki「NetworkManager
  2. Arch Wiki「NetworkManager
  3. Arch Wiki「resolvconf.conf(5)
  4. Tailscale「Why is resolv.conf being overwritten?

Built with Hugo
テーマ StackJimmy によって設計されています。