Tailscale exit node(イグジットノード)とは、手元のTailscaleネットワークにある1台を「インターネットの出口」にする機能です。ある技術ブログの実践記では、自宅のProxmoxサーバーにLXCコンテナ(1 vCPU、512 MB RAM)を立ててexit nodeにし、tracerouteで経路が変わる様子を確認しています。この記事ではその内容をもとに、仕組み、構築手順、確認方法、サブネットルーターとの違いを整理します。

30秒でわかる

・exit nodeは0.0.0.0/0と::/0をアドバタイズし、選んだクライアントの全通信をそのマシン経由にする
・有効にするとtracerouteの1ホップ目がexit nodeのTailscale IPになり、Webサイトからは自宅回線のIPが見える
・LXCでは/dev/net/tunの許可とIPフォワーディングが要る。カフェWiFiの代わりに自宅マシンを信頼する構成になる

ROUTE CHANGE経路の変化

exit nodeを選ぶと、1ホップ目と出口が変わる

exit nodeなし

カフェWiFiのまま

  • Hop 1: ローカルゲートウェイ
  • 出口: カフェ側のISP
  • Webサイトにはカフェ側のIPが見える

exit node有効

自宅マシン経由

  • Hop 1: exit nodeのTailscale IP
  • 出口: 自宅ISP
  • Webサイトには自宅回線のIPが見える
出典: 元記事(stonecharioteer.com)のtraceroute観測

サプライチェーン攻撃の観点でネットワーク構成を見直したい場合は サプライチェーン攻撃とは|手口・防御ツール比較・npm 12の新機構まで実践解説 も参照してください。

Tailscale exit nodeとは:コントロールプレーンとWireGuardの分担

Tailscaleは単なるWireGuardトンネルではなく、その上に制御レイヤーを乗せたものです。WireGuardが「道路」、コントロールプレーンが「地図と信号機」にあたります。

身元確認・ピア発見

NAT貫通調整

ACL配布

exit node設定

暗号化パケット

失敗時フォールバック

Control Plane (Tailscale)

Data Plane (WireGuard)

P2P通信

DERP Relay

コントロールプレーンの責務は次のとおりです。

・SSO/IdPベースの身元確認
・ピア(デバイス)の相互発見とNAT貫通(ホールパンチング)の調整
・ACLとルート(exit nodeの設定を含む)の配布
・MagicDNS、デバイス失効の反映

2台のデバイスが接続するまでの流れは次のとおりです。

1. 両デバイスがコントロールプレーンに認証
2. コントロールプレーンが各ピアの到達可能エンドポイントと暗号鍵を共有
3. 両ピアがUDPパケットを送り合ってNAT穴あけを試行
   成功: 直接のWireGuard暗号化パスを確立
   失敗: DERPリレーにフォールバック(エンドツーエンド暗号化は維持)

exit nodeを有効にすると、次の3つが起きます。

・exit nodeが0.0.0.0/0と::/0をアドバタイズし、コントロールプレーンが適切なクライアントへ通知する
・クライアントがそのexit nodeを選ぶと、デフォルトルートがトンネル向きに書き換わる
・exit nodeの実パブリックIP宛の通信は通常のゲートウェイを使う(トンネルが自分自身をトンネルするのを防ぐ)

tracerouteで見る経路の変化(exit node有効と無効の比較)

次の出力は元記事の筆者が公開しているtracerouteです(IPとホスト名は伏せ字・ダミー、遅延は環境で変わります)。exit node有効時は、1ホップ目がexit nodeのTailscale IPになります。

# exit node有効(元記事の出力から抜粋)
Hop 1: tailscale-gw (100.x.y.z)            ~7ms
Hop 2: 192.168.x.1                         ~7ms
Hop 3: 10.x.x.1                            ~9-177ms
Hop 4-6: * * *
Hop 7: home-isp-edge.example (自宅ISP)     ~11-14ms
...
github.com到達(以降のホップは省略)

exit nodeを使わない場合の出力も元記事にあります。

# exit nodeなし(元記事の出力から抜粋)
Hop 1: 192.168.x.1                         ~4-5ms
Hop 2-6: * * *
Hop 7: cafe-or-local-isp-edge.example      ~11-16ms

1ホップ目がローカルゲートウェイになり、7ホップ目の出口はカフェ側のISPです。

観点 exit node有効 exit nodeなし
1ホップ目 exit nodeのTailscale IP ローカルゲートウェイ
インターネットへの出口 自宅ISP カフェ側のISP
Webサイトから見えるIP 自宅回線のパブリックIP カフェのパブリックIP
通信を見られる相手 自分のexit nodeとその回線 カフェの管理者とそのISP

Tailscale exit nodeの構築手順:Proxmox LXC・IPフォワーディング・NAT

LXCでTUNを許可する

LXCコンテナはデフォルトで/dev/net/tunにアクセスできず、Tailscaleが動きません。コンテナ設定に次を追加します。

# /etc/pve/lxc/<CTID>.conf
lxc.cgroup2.devices.allow: c 10:200 rwm
lxc.mount.entry: /dev/net/tun dev/net/tun none bind,create=file

exit node側の設定とクライアント側の選択

まず、exit node側でIPフォワーディングを有効にします(/etc/sysctl.d/99-tailscale.confを作成)。

echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
sudo sysctl -p /etc/sysctl.d/99-tailscale.conf

次に、exit nodeとして広告します。広告しただけではクライアントに出ないため、Tailscale管理画面のマシン一覧でそのマシンの「Edit route settings」から「Use as exit node」を承認します(ACLのautoApproversで自動承認にもできます)。

sudo tailscale up --advertise-exit-node      # exit node側
tailscale set --exit-node=<exit-node名>       # クライアント側

クライアント側でexit node経由にしつつLANのプリンタやNASへ直接届かせたい場合は--exit-node-allow-lan-accessを併用します。

NAT(マスカレード)はTailscaleが設定するのが通常で、失敗が疑われるときはiptables -t nat -L POSTROUTING -vで確認します。

よくある落とし穴は、tailscale statusではピアが接続済みなのにインターネットに出られないケースです。原因の多くはIPフォワーディングかNATの未設定で、exit nodeが中継できていません。

tracerouteと出口IPで確かめる:切り替えチェックリストと信頼の移動

exit nodeの有効と無効を切り替えたときは、次の順に確かめます。

curl ifconfig.me          # 有効時は自宅のパブリックIP、無効時は現在のネットワークのIP
traceroute github.com     # 有効時はHop 1がexit nodeのTailscale IP
tailscale ping <exit-node名>   # direct/DERPのどちらで届いているか

exit nodeを使うと、信頼先がカフェのネットワークから「自分が所有・運用するマシンと自宅ISP」に移ります。匿名化ではなく、信頼の置き場所を変える仕組みです。その分、exit node機の保守と監視は自分の責任になるため、構成は最小限(Tailscaleのみ)に保つのが安全です。

DNSは別設定です。exit nodeが変えるのは出口であり、名前解決の経路ではありません。

exit nodeとサブネットルーターの違い

EXIT NODE VS SUBNET範囲の違い

exit nodeはインターネット全体、サブネットルーターは指定範囲だけ

アドバタイズ範囲

使う場面

アドバタイズ範囲: exit node: 0.0.0.0/0 と ::/0

使う場面: 外出先の通信をすべて自宅経由にする

アドバタイズ範囲: サブネットルーター: 192.168.1.0/24 など

使う場面: NASやProxmoxにだけ届かせる

アドバタイズ範囲: 両方を同じマシンで指定

使う場面: 内部サービスもインターネットも自宅経由

出典: Tailscale公式ドキュメント(Exit Nodes)

どちらも「自宅側に出入口を作る」機能ですが、アドバタイズする範囲が違います。

・exit node:0.0.0.0/0と::/0(すべてのインターネット)
・サブネットルーター:192.168.1.0/24など特定のプライベート範囲のみ

シナリオ 推奨 理由
カフェから自宅ISP経由でインターネットを使う exit node 全インターネットを自宅経由にしたい
NASやProxmoxにだけ届けばよい サブネットルーター 通常のブラウジングは直接、内部サービスだけトンネル
内部サービスもインターネットも自宅経由にしたい 1台が両方の役割 --advertise-exit-nodeと--advertise-routesを同時に指定する

参照ソース