Tailscaleロゴ

Exit Node(すべての通信をルーティングする)

最終検証日:
翻訳: 竹洞 陽一郎

Exit Nodeは、すべてのプランで利用できます。

Exit Nodeを使うと、インターネット向けの通信を、tailnet内の特定のデバイス経由でルーティングできます。
既定のTailscaleはオーバーレイネットワークとして動作し、Tailscaleに接続されたデバイス間の通信だけを扱うため、インターネット向けの通信の経路は変わりません。
Exit Nodeは、デフォルトルート(0.0.0.0/0、::/0)を使ってすべての通信を特定のデバイス経由に切り替える機能で、従来のVPNに近い動作になります。

利点

ユースケース

仕組み

Exit Nodeは、すべての通信をtailnet内の特定のデバイス経由でルーティングする機能です。
次のような使い方ができます。

セキュリティ上、次の3つがすべて明示的に必要です。

既定では、Exit Nodeは、サブネットルーターやアプリコネクタへ向けられていないすべての通信を引き受けます。
Androidでは、アプリ単位のスプリットトンネリングも利用できます。

ローカルネットワークへのアクセス

既定では、Exit Nodeを使用しているデバイスは、自身のローカルネットワークへアクセスできません。
アクセスを許可するには、TailscaleクライアントのExit Nodesの項目で「Allow Local Network Access」を有効にするか、tailscale upまたはtailscale setコマンドに--exit-node-allow-lan-accessフラグを指定します。

設定手順

  1. 前提条件を確認します。
  2. デバイスをExit Nodeとして設定します。
  3. 管理コンソールでExit Nodeを許可します。
  4. Exit Nodeを使う側のデバイスを設定します。

前提条件

Linuxの場合:

まず、IP転送を有効にします。

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としてアドバタイズします。

sudo tailscale set --advertise-exit-node

Androidの場合:

Tailscaleクライアントを開き、Exit Nodeの項目で「Run as exit node」を選択します。

macOS、Windows、iOS、tvOSでの手順は、原文の該当セクション(英語)で、それぞれのタブを参照してください。

管理コンソールでExit Nodeを許可する

この操作には、Adminのロールが必要です。
なお、tailnetポリシーファイルのautoApproversに含まれるユーザーがデバイスを認証した場合、そのExit Nodeは自動的に承認されます。

  1. 管理コンソールのMachinesページを開きます。
  2. 対象のデバイスを探します。property:exit-nodeで絞り込むこともできます。
  3. 行末の三点メニューからEdit route settingsを開きます。
  4. Use as exit nodeを有効にします。

Exit Nodeの利用を許可する

アクセス制御ポリシーを既定のままにしている場合、tailnetのどのユーザーもExit Nodeを使用でき、グラントやACLの追加は不要です。
アクセス制御ポリシーをカスタマイズしている場合は、dstにautogroup:internetを指定したグラントまたはACLを追加する必要があります。

Exit Nodeのデバイス自体を宛先に指定しても、そのデバイスへの接続(SSHなど)が許可されるだけで、そのデバイスを経由したインターネットへの通信は許可されません。
この違いは、設定を誤りやすい箇所です。

たとえば、次のポリシーではgroup:developersはExit Nodeを使用できません。autogroup:internetへの許可がないためです。

{
  "grants": [
    {
      "src": ["group:developers"],
      "dst": ["tag:prod"],
      "ip": ["*"]
    }
  ]
}

Exit Nodeを使えるようにするには、dstにautogroup:internetを指定したグラントを追加してください。
記述例は、グラントの例を参照してください。

Exit Nodeを使う

Androidの場合:

  1. Tailscaleアプリを開き、Exit Nodeの項目へ移動します。
  2. 使用するExit Nodeを選択します。
  3. Exit Node経由でもローカルネットワークへアクセスしたい場合は、「Allow LAN access」を有効にします。
  4. Exit Nodeの項目に選択したデバイスが表示され、有効時は青く表示されます。
  5. パブリックIPアドレスを確認できるサイトで、Exit NodeのIPアドレスが表示されることを確認します。
  6. 使用を止めるには、Exit Nodeのドロップダウンから「None」を選択します。

Exit Nodeを使用する選択肢は、tailnet内に利用可能なExit Nodeがある場合にのみ表示されます。

ネットワークフローログでの宛先の記録

宛先の記録は、PremiumおよびEnterpriseプランでのみ利用でき、有効化には販売契約が必要です。

プライバシー、不正利用の防止、セキュリティ上の理由から、Exit Node経由の通信の宛先の記録は、すべてのtailnetで既定では無効になっています。
Enterpriseプランのtailnetでは、これを有効にすることで、tailnet全体の通信の可視性を高め、セキュリティインシデントの調査に利用できます。
宛先はネットワークフローログに記録されます。
利用にあたっては、事前にログストリーミングを有効にしておく必要があります。

  1. 管理コンソールのLogsページを開きます。
  2. Network flow logsを選択します。
  3. Logging Actionsメニューから、Enable exit node destination loggingを選択します。

無効にする場合は、同じメニューからDisable exit node destination loggingを選択します。

注意事項

ユーザースペースでの実装

AndroidのExit Nodeはユーザースペースで実装されており、Linuxの既定の実装とは異なります。成熟度と最適化の度合いも同等ではありません。
Androidでの運用については、次の点に注意してください。

デバイスキーの期限切れ

アプリコネクタ、サブネットルーター、Exit Nodeといったコネクタのキーが期限切れになると、アドバタイズされたルートは他のデバイス上に設定として残る一方で、到達できなくなります。
これは、信頼できないネットワークへ意図せずトラフィックが漏れることを防ぐための、フェイルクローズの設計です。

対策としては、次の方法があります。

原文:Exit nodes (route all traffic)(Tailscale公式ドキュメント)