Exit Node(すべての通信をルーティングする)
最終検証日:
翻訳: 竹洞 陽一郎
Exit Nodeは、すべてのプランで利用できます。
Exit Nodeを使うと、インターネット向けの通信を、tailnet内の特定のデバイス経由でルーティングできます。
既定のTailscaleはオーバーレイネットワークとして動作し、Tailscaleに接続されたデバイス間の通信だけを扱うため、インターネット向けの通信の経路は変わりません。
Exit Nodeは、デフォルトルート(0.0.0.0/0、::/0)を使ってすべての通信を特定のデバイス経由に切り替える機能で、従来のVPNに近い動作になります。
利点
- すべての通信を保護する: インターネット上のサイトやアプリケーションへの通信も含めて、Exit Nodeが暗号化します。
- 世界規模で展開できる: 地理的な要件に合わせて、各地にExit Nodeを配置できます。
- 可視性を高める: 宛先のログを取得することで、tailnet全体の通信の可視性が高まり、事後の調査にも使えます(PremiumおよびEnterpriseプランのみ)。
ユースケース
- 移動の多い従業員: どの物理ネットワークからでも、インターネット向けの通信を保護できます。
- 各地からのテスト: 各地にExit Nodeを配置し、アプリケーションの動作を地域ごとに検証できます。
- コンプライアンス要件への対応: 規制やコンプライアンスでVPNの使用が求められる場合に対応できます。
仕組み
Exit Nodeは、すべての通信をtailnet内の特定のデバイス経由でルーティングする機能です。
次のような使い方ができます。
- Tailscale以外の宛先へのすべての通信を、Exit Node経由にする。
- 推奨されるExit Nodeの機能により、クライアントの情報に基づいて最適なExit Nodeを自動的に選ばせる。
- MDMのポリシーにより、Exit Nodeの使用を必須にする。
セキュリティ上、次の3つがすべて明示的に必要です。
- Exit Nodeを使う側の各デバイスが、明示的に利用を選択していること。
- Exit Nodeとなるデバイスが、自身をExit Nodeとしてアドバタイズしていること。
- Owner、Admin、またはNetwork adminが、そのデバイスをExit Nodeとして承認していること。
既定では、Exit Nodeは、サブネットルーターやアプリコネクタへ向けられていないすべての通信を引き受けます。
Androidでは、アプリ単位のスプリットトンネリングも利用できます。
ローカルネットワークへのアクセス
既定では、Exit Nodeを使用しているデバイスは、自身のローカルネットワークへアクセスできません。
アクセスを許可するには、TailscaleクライアントのExit Nodesの項目で「Allow Local Network Access」を有効にするか、tailscale upまたはtailscale setコマンドに--exit-node-allow-lan-accessフラグを指定します。
設定手順
- 前提条件を確認します。
- デバイスをExit Nodeとして設定します。
- 管理コンソールでExit Nodeを許可します。
- Exit Nodeを使う側のデバイスを設定します。
前提条件
- tailnetが構築済みであること。
- Exit Nodeとなるデバイスと、それを使うデバイスの双方で、Tailscale v1.20以降を実行していること。
- Exit NodeとなるデバイスのOSが、Linux、macOS、Windows、Android、iOS、tvOSのいずれかであること。
- Exit Nodeの利用を、対象のユーザーに許可していること。
デバイスを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は自動的に承認されます。
- 管理コンソールのMachinesページを開きます。
- 対象のデバイスを探します。
property:exit-nodeで絞り込むこともできます。 - 行末の三点メニューからEdit route settingsを開きます。
- 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の場合:
- Tailscaleアプリを開き、Exit Nodeの項目へ移動します。
- 使用するExit Nodeを選択します。
- Exit Node経由でもローカルネットワークへアクセスしたい場合は、「Allow LAN access」を有効にします。
- Exit Nodeの項目に選択したデバイスが表示され、有効時は青く表示されます。
- パブリックIPアドレスを確認できるサイトで、Exit NodeのIPアドレスが表示されることを確認します。
- 使用を止めるには、Exit Nodeのドロップダウンから「None」を選択します。
Exit Nodeを使用する選択肢は、tailnet内に利用可能なExit Nodeがある場合にのみ表示されます。
ネットワークフローログでの宛先の記録
宛先の記録は、PremiumおよびEnterpriseプランでのみ利用でき、有効化には販売契約が必要です。
プライバシー、不正利用の防止、セキュリティ上の理由から、Exit Node経由の通信の宛先の記録は、すべてのtailnetで既定では無効になっています。
Enterpriseプランのtailnetでは、これを有効にすることで、tailnet全体の通信の可視性を高め、セキュリティインシデントの調査に利用できます。
宛先はネットワークフローログに記録されます。
利用にあたっては、事前にログストリーミングを有効にしておく必要があります。
- 管理コンソールのLogsページを開きます。
- Network flow logsを選択します。
- Logging Actionsメニューから、Enable exit node destination loggingを選択します。
無効にする場合は、同じメニューからDisable exit node destination loggingを選択します。
注意事項
ユーザースペースでの実装
AndroidのExit Nodeはユーザースペースで実装されており、Linuxの既定の実装とは異なります。成熟度と最適化の度合いも同等ではありません。
Androidでの運用については、次の点に注意してください。
- AndroidでExit Nodeを動作させるための最適化は、現在も進行中です。
- 長時間Exit Nodeとして使う場合は、デバイスを電源に接続してください。
- AndroidのExit Nodeは、ユーザースペースルーティングに限定されます。
- AndroidでのExit Nodeの性能は高くなく、多くの用途では速度が不足する可能性があります。
デバイスキーの期限切れ
アプリコネクタ、サブネットルーター、Exit Nodeといったコネクタのキーが期限切れになると、アドバタイズされたルートは他のデバイス上に設定として残る一方で、到達できなくなります。
これは、信頼できないネットワークへ意図せずトラフィックが漏れることを防ぐための、フェイルクローズの設計です。
対策としては、次の方法があります。
- コネクタのキーの有効期限を無効にする。
- 高可用性を設定する。
- 管理コンソールまたはTailscale APIを使い、状況に応じてルートを有効化・無効化する。