ことあらまし
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...
参考
- Gentoo Wiki「NetworkManager」
- Arch Wiki「NetworkManager」
- Arch Wiki「resolvconf.conf(5)」
- Tailscale「Why is resolv.conf being overwritten?」