[Tailscale]DNS名前解決ができない原因と完全復旧

TIPS
TIPSツール

VPSを運用していて、「手元からSSH接続はできるのに、サーバー内部から apt update や curl、外部への通信が一切通らなくなった」という経験はありませんか?

今回、Tailscale を導入しているUbuntu VPSでまさにこの現象が発生しました。

結論として、原因は 「TailscaleのMagicDNS」と「Ubuntuのsystemd-resolved(/etc/resolv.conf のシンボリックリンク)」の不整合 による名前解決エラーでした。

同じトラブルでハマっている方のために、どこを見て切り分けるべきか、そして根本原因と復旧手順をまとめました。

1. 症状:何が起きていたか?

  • 外部PCからVPSへのSSHログインは問題なく可能。
  • VPS内部から外部IP宛の通信(ping 8.8.8.8)は 1ms台で快調に通る。
  • しかし、ドメイン宛(ping google.com や apt update)を実行すると以下のエラーで即死する。
    Plaintextping: www.google.com: Temporary failure in name resolution

「IPは通るのにドメインだけ通らない」= 100% DNS(名前解決)の問題 です。

2. 調査ステップと切り分けのポイント

① /etc/resolv.conf を確認する

まずDNSの設定ファイルを確認しました。

$ cat /etc/resolv.conf
# resolv.conf(5) file generated by tailscale
nameserver 100.100.100.100
nameserver fd7a:115c:a1e0::53
search tailxxxxxx.ts.net ...

DNSサーバーが 100.100.100.100(TailscaleのMagicDNS)に向けられていました。

② Tailscaleのログ(journalctl)を確認する

Tailscaleデーモンのログを見たところ、決定的なエラーが出ていました。

$ sudo journalctl -u tailscaled -n 30 --no-pager
...
tailscaled[3461578]: dns: resolver: forward: no upstream resolver
tailscaled[3461578]: dns: resolver: forward: no upstream resolver

「no upstream resolver(転送先の上位DNSサーバーが1つもない)」。

つまり、Tailscaleは「一般ドメイン(google.comなど)の名前解決リクエストを受け取ったが、それをどこに転送すればいいか分からないためパケットを破棄していた」状態でした。

③ なぜ上位DNSを見失ったのか?(最大の盲点)

さらに調査を進めるため、Tailscaleの内部ステータスとOS側のDNSマネージャー(systemd-resolved)の状態を確認しました。

$ tailscale status --json | grep -i \"failed\"
\"Tailscale failed to fetch the DNS configuration of your device: exit status 1\"

$ ls -l /etc/resolv.conf
-rw-r--r-- 1 root root 268 /etc/resolv.conf   # ← シンボリックリンクではなく通常ファイル!

$ resolvectl status
...
resolv.conf mode: foreign  # ← ここが最大の異常ポイント!
...

ここで根本原因がすべて繋がりました。

[Tailscale]DNS名前解決ができない原因と完全復旧
[Ubuntu]Tailscaleで安全なVPN環境を構築
UbuntuにTailscaleを導入し、安全なメッシュVPNを構築する手順を解説します。複雑なポート開放なしでデバイス間を接続する方法から、接続確認、応用的なExit Node(踏み台)の設定まで、実用的なコマンド付きで紹介します。

3. 今回の根本原因

原因は 2重の不整合 にありました。

【破綻した名前解決の図】
アプリ (curl / ping)
    │
    ▼
/etc/resolv.conf (静的ファイル / foreign 状態)
    │
    ▼ nameserver 100.100.100.100 (MagicDNS)
tailscaled デーモン
    │
    ├─► OSのDNS設定を読み取ろうとするが失敗 (\"failed to fetch... exit status 1\")
    │   (※ /etc/resolv.conf が正規の symlink でないため連携破壊)
    │
    ▼
転送先(Upstream DNS)が 0 件になりパケット破棄! (\"no upstream resolver\")
  1. Ubuntuの仕様:
    モダンなUbuntuでは、/etc/resolv.conf は /run/systemd/resolve/stub-resolv.conf(127.0.0.53 を指すスタブリゾルバ)へのシンボリックリンクになっているのが正常な状態です。
  2. シンボリックリンクの破損(mode: foreign):
    手動編集や過去のネットワークスクリプト等により、リンクが剥がれて「静的な通常ファイル」に置き換わっていました。
  3. Tailscaleの検知失敗:
    Tailscaleは起動時にホストOSのDNS設定を取得して上位DNSを自動構成しようとしますが、ファイルが foreign 状態だったため読み取りに失敗(exit status 1)。
  4. 結果:
    Tailscaleの管理画面でいくらNameserverを追加・同期しようとしても、ローカル側でOSとの連携が取れず、no upstream resolver となって名前解決が全滅していました。
[Tailscale]DNS名前解決ができない原因と完全復旧
LLM Wikiとは?
LLM Wikiの定義やRAGとの違い、3層アーキテクチャ、運用サイクルを解説。Obsidianを活用して、AIにより非構造化データを構造化された知識ベースへと再構成・構築する具体的な手順と技術的知見を提供します。

4. 解決手順(復旧コマンド)

復旧は、/etc/resolv.conf を本来の systemd-resolved のスタブへのシンボリックリンクに修復し、Tailscaleに再認識させる だけで一発で治ります。

STEP 1: resolv.conf を正規のシンボリックリンクに戻す

# 既存の壊れた静的ファイルをバックアップ退避
sudo mv /etc/resolv.conf /etc/resolv.conf.bak

# systemd-resolved のスタブファイルへシンボリックリンクを再作成
sudo ln -s /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf

STEP 2: 関連デーモンを再起動する

sudo systemctl restart systemd-resolved
sudo systemctl restart tailscaled

STEP 3: 疎通確認

# 外の名前解決ができるか
ping -c 3 www.google.com

# Tailscale内のホスト名が引けるか
ping -c 2 <Tailscaleネットワーク内の端末名>

これで無事に外部ドメインもTailscaleの内部ホスト名(MagicDNS)も両方引けるようになりました!

5. まとめと注意点

  • 「IPは届くのに名前解決だけ死ぬ」ときは、まず journalctl -u tailscaled を疑うべし
    no upstream resolver が出ていたらTailscaleが名前解決を握りつぶしています。
  • /etc/resolv.conf を手動で編集して通常ファイルにしてはいけない
    Ubuntu環境では ls -l /etc/resolv.conf を叩いて、/run/systemd/resolve/stub-resolv.conf へのシンボリックリンクになっているか必ず確認しましょう。
  • 一時的に外へ抜けたいだけの緊急回避策:
    もしTailscale内の名前解決が不要で、とにかく今すぐaptなどを通したい場合は、以下のコマンドでTailscaleによるDNS乗っ取りを即座に解除できます。
    Bashsudo tailscale up --accept-dns=false

Q よくある質問 (FAQ)
Q. 「Temporary failure in name resolution」と出て外部通信ができません。何から確認すべきですか?
A.
まず「ping 8.8.8.8」などのIP直指定で疎通確認を行います。IPが通る場合はDNSの問題です。Tailscale環境下であれば「journalctl -u tailscaled」でログを確認し、「no upstream resolver」のエラーが出ていないかチェックしてください。
Q. Ubuntuで/etc/resolv.confを手動編集してはいけないのはなぜですか?
A.
モダンなUbuntuではsystemd-resolvedがDNSを管理しており、/etc/resolv.confはシンボリックリンクである必要があります。手動編集で実ファイル化(foreign状態)してしまうと、Tailscale等のサービスがOSのDNS設定を正しく検知できず、名前解決の不整合が発生するためです。

コメント

タイトルとURLをコピーしました