Tailscaleで自宅LANの他の機器に届かない:サブネットルーターとDNS設定を見直す

Photo: Vladimir Srajber / Pexels
先に結論です。Tailscale をサブネットルーターにしたのに、外出先から自宅 LAN の NAS やプリンターへ届かないときは、原因はだいたい次のどこかにあります。上から順に見ると早く絞り込めます。
- 管理コンソールで経路(ルート)が承認されていない
- 接続する側が Linux で、経路を受け取る設定(
--accept-routes)が入っていない - サブネットルーター側で IP 転送やファイアウォールが通信を止めている
- 出先のネットワークと自宅 LAN のアドレス帯が重なっている
- IP では届くが、名前(
nas.lanなど)で引けない=DNS の問題
この記事では、それぞれの確認方法と直し方をまとめます。サブネットルーターの基本的な立て方は、以前の記事「Tailscaleでポート開放なしに外出先から自宅NASへ接続する設定」で書いています。
まず「IP で届くか」と「名前で届くか」を分ける
最初に切り分けたいのは、IP アドレスを直接指定しても届かないのか、名前だと届かないのか です。外出先の端末(スマホのテザリングなど、自宅 LAN の外にいる状態)から、NAS の LAN 側 IP に ping やブラウザでアクセスしてみます。
ping 192.168.1.20
IP で届かないなら経路の問題なので、次の「手順1」から見ます。IP では届くのに名前だと届かないなら、経路は正常なので「手順5:DNS」へ飛んでください。
手順1:管理コンソールで経路を承認したか
tailscale set --advertise-routes=192.168.1.0/24 を実行しただけでは、経路は有効になりません。管理コンソールの Machines 画面で、サブネットルーターにした端末のメニューから「Edit route settings」を開き、広告した経路にチェックが入っているかを確認します。
承認待ちの端末には「Subnets」の表示に注意マークが付くとされています。経路を変更して広告し直したときも、改めて承認が必要になる点に注意してください。
サブネットルーター側では、自分が何を広告しているかを次のコマンドで確認できます。
tailscale debug prefs | grep -A3 AdvertiseRoutes
手順2:接続する側が Linux なら –accept-routes
Tailscale の公式ドキュメントでは、Windows・macOS・iOS・Android のクライアントは承認済みの経路を自動で使う一方、Linux のクライアントは初期状態では経路を受け取らない とされています。外出先のノート PC が Linux の場合は、その端末で次を実行します。
sudo tailscale set --accept-routes
受け取れているかは、Linux ならルーティングテーブル 52 番で確認できます。
ip route show table 52 | grep 192.168.1.0
ここに自宅 LAN のアドレス帯が出ていなければ、経路が届いていません。なお、tailscale up をオプション付きで打ち直すと、以前に付けた設定がリセットされることがあるため、設定の追加には tailscale set を使うのが安全です。
手順3:サブネットルーター側の IP 転送とファイアウォール
経路が届いているのに通信が返ってこない場合は、サブネットルーター(ラズパイやミニPC)の中を確認します。
IP 転送が有効か
sysctl net.ipv4.ip_forward
= 1 になっていなければ、パケットを LAN 側へ流してくれません。/etc/sysctl.d/ に設定ファイルを置き、再起動後も有効になるようにします。
ファイアウォールが転送を止めていないか
Ubuntu の ufw は、初期状態で転送(FORWARD)を拒否する設定になっています。ufw を有効にしているなら、Tailscale 側からの転送を許可します。
sudo ufw route allow in on tailscale0
firewalld を使うディストリビューションでは、マスカレードを有効にする手順が公式ドキュメントに書かれています。
SNAT を無効にしていないか
サブネットルーターは初期状態で、転送する通信の送信元を自分の LAN 側 IP に書き換えます(SNAT)。そのため LAN 側の機器から見ると、通信相手はサブネットルーターに見え、返事も自然に戻ってきます。--snat-subnet-routes=false にしている場合は、自宅ルーターに「100.64.0.0/10 宛てはサブネットルーターへ」という静的経路を足さないと、返事が戻ってこなくなります。特別な理由がなければ初期値のままにしておくのが無難です。
常時動かすサブネットルーターには、消費電力の小さい Raspberry Pi 5 や N100 クラスのミニPC がよく使われています。
手順4:出先と自宅 LAN のアドレス帯が重なっていないか
意外と多いのがこれです。自宅 LAN が 192.168.1.0/24 で、出先のホテルや実家の Wi-Fi も 192.168.1.0/24 だった場合、端末はまず目の前の LAN を優先するため、自宅の 192.168.1.20 ではなく、出先の同じ番号の機器を探しに行ってしまいます。
確認は簡単で、出先の端末の IP アドレスを見て、自宅と同じアドレス帯になっていないかを比べます。根本的に避けるには、自宅ルーターの LAN 側を 192.168.47.0/24 のように、家庭用ルーターの初期値と重なりにくい番号に変えておく方法があります。ただし DHCP の範囲や固定 IP の機器もすべて変わるので、変更する前に IP アドレスの一覧を手元に控えておくことをおすすめします。
手順5:名前で届かないときは DNS を見直す
MagicDNS で引けるのは、Tailscale を入れた端末の名前だけ です。サブネットルーターの先にある NAS やプリンターの名前(ルーターが配る nas.lan や printer.home.arpa など)は、MagicDNS では解決されません。また、nas.local のような mDNS の名前は Tailscale を越えて届かないとされています。
LAN 内の名前を外から引きたい場合は、管理コンソールの DNS 画面で Split DNS を設定します。
- DNS 画面の Nameservers で「Add nameserver」→「Custom」を選ぶ
- 自宅の DNS サーバーの LAN 側 IP(ルーターや AdGuard Home など)を入れる
- 「Restrict to domain」をオンにし、
lanやhome.arpaなど自宅で使っているドメインを入れる
こうすると、そのドメインの問い合わせだけが自宅の DNS へ送られます。DNS サーバーの IP にはサブネットルーター経由で届く必要があるので、手順1〜4で IP の到達を先に確保しておくのが前提です。
Linux のクライアントで名前が引けない場合は、--accept-dns=false にしていないかも確認してください。
確認の順番まとめ
- IP 直打ちで届くか、名前だけ届かないのかを分けた
- 管理コンソールで経路を承認した
- Linux クライアントで
--accept-routesを有効にした - サブネットルーターの IP 転送・ufw / firewalld・SNAT を確認した
- 出先と自宅の LAN アドレス帯が重なっていないか見た
- 名前解決は Split DNS で自宅の DNS へ振り分けた
まとめ
- 届かないときは「IP で届くか」「名前で届くか」を最初に分ける
- IP で届かないなら、経路の承認 →
--accept-routes→ IP 転送・ファイアウォール → アドレス重複の順に見る - 名前で届かないなら、MagicDNS ではなく Split DNS で自宅の DNS サーバーへ振り分ける
- 自宅 LAN を珍しいアドレス帯にしておくと、出先での重複トラブルを避けやすい
運営者が作った Excel テンプレートを BOOTH で配布しています。IT 資産管理台帳(無料 Lite 版あり) / IT 資格の学習管理シート


