AppConnectorの仕組み
最終検証日:
翻訳: 竹洞 陽一郎
AppConnectorはすべてのプランでご利用いただけます。
AppConnectorを使用すると、自社ホスト型アプリケーションおよびSaaS(Software as a Service)アプリケーションのトラフィックを、Tailscaleネットワーク(tailnet)内の専用デバイスを経由してルーティングできます。AppConnectorはサブネットルータと同様に機能しますが、IPアドレスではなくドメイン名でアプリケーションへのルーティングを行える点で優れており、より安定した接続を実現します。
さらに、AppConnectorはアプリケーション接続・監視・最適化・セキュリティ・信頼性に関するさまざまなニーズに対応するために活用できます。
対応するアプリケーションの種類
- 社内ホスト型リソース
- クラウドインフラまたは仮想プライベートクラウド(VPC)
- Amplitude、Confluence、GitHub、Looker、Office 365、Salesforce、StripeなどのSaaSアプリケーション
- Mongo Atlas、Amazon RDS、Planetscaleなどのマネージドプラットフォーム
管理オプションとメリット
- tailnet内の個々のデバイスごとにアプリケーションアクセスを管理する代わりに、AppConnectorデバイスへのアクセスを一元管理できます。
- 設定監査ログで、tailnet内のAppConnectorの追加・削除をモニタリングできます。
- サードパーティツールを使用してAppConnectorとアプリケーションのトラフィックを監視できます。
- アプリケーション設定でIPアローリストを設定することで、AppConnectorデバイスを経由したアクセスのみに制限できます(任意)。これにより、tailnet内の許可されたデバイスのみが、AppConnectorへのアクセス権がある場合にアプリケーションにアクセスできます。
信頼性オプションとメリット
- 同一アプリケーションに複数のAppConnectorデバイスを追加することで、フェイルオーバールーティングによる高可用性を実現できます。
- AppConnectorのリージョナルルーティングを使用して、地理的にトラフィックを最適化できます。
- AppConnectorのサブネットルーティングを使用して、複数のルータ間のフェイルオーバーを自動管理できます。
AppConnectorの信頼性オプションの詳細については、高可用性の設定を参照してください。
仕組み
AppConnectorの動作を理解するための用語と定義を以下に示します。
- AppConnector(App connector)
- 機能全体を指す一般的な用語であり、tailnetでAppConnectorを追加・削除するための管理コンソールの設定も含みます。
- AppConnectorデバイス(App connector device)
- アプリケーションへのトラフィックルーティングを担当する、tailnet内のLinuxデバイスです。
- アプリケーション(Application)
- AppConnectorデバイスがtailnetトラフィックをルーティングする先の、自社ホスト型・クラウドベース・SaaSアプリケーションです。
AppConnectorのセットアップ手順を以下に示します。詳細については、tailnetでのAppConnector設定を参照してください。
- tailnetポリシーファイルを設定して、tailnet内のAppConnectorのデバイス権限(タグを含む)を定義します。
- 設定したタグをtailnet内のデバイスに割り当て、AppConnectorへのアクセスを許可します。
- tailnet上のLinuxデバイスを、アプリケーションへのトラフィックをルーティングする専用AppConnectorとして設定します。このデバイスはパブリックIPアドレスを持ち、IPフォワーディングが有効になっている必要があります。
- 管理コンソールでAppConnectorを設定し、タグとアプリケーションのドメイン名を指定します。
- AppConnectorデバイスのIPアドレスからのリクエストのみを許可するIPアローリストなど、追加のアクセス・セキュリティ要件をアプリケーション側で設定します(任意)。
アクセス制御ポリシーでtailnet内の特定のユーザとデバイスのみがAppConnector経由でアプリケーションにアクセスできると仮定した場合の、AppConnectorの動作概要は以下の通りです。
- 指定のタグが付与されたデバイスがアプリケーションにアクセスします。
- リクエストがAppConnectorとして指定されたデバイスに転送されます。
- AppConnectorは、アプリケーションドメインによってアドバタイズされたIPアドレスへのエグレスによってトラフィックをアプリケーションにルーティングします。
- (任意)アプリケーションは、リクエストがAppConnectorのパブリックIPアドレスから来ていることを検証します。
- アプリケーションからのトラフィックはAppConnectorを経由して折り返され、tailnet内のユーザデバイスに送信されます。
DNSディスカバリの仕組み
AppConnectorはPeerAPIを使用してDoH(DNS over HTTPS)によるDNSディスカバリを実行します。
- アクセス要件:クライアントデバイスがAppConnectorタグにアクセスできる必要があります。これにより、AppConnectorがピアとして表示されます。
- DNS解決:AppConnectorはDoHを使用して設定済みドメインをIPアドレスに解決します。
- ルートのアドバタイズ:探索されたIPアドレスは自動的にtailnetへのルートとしてアドバタイズされます。
ICMP程度の最小限のアクセスがあればピアディスカバリは有効になります。アプリケーションへのフルアクセスは必要ありません。
注意事項
- ユーザがtailnetに接続していない場合でも、アプリケーション設定でIPアローリストが設定されていない限り、アプリケーションへのアクセスは継続されます。IPアローリストを設定した場合、
AlwaysOn.Enabledなどのシステムポリシー設定を強制することで、デバイスが常にtailnetに接続していることを確保できます。 - ユーザがTailscaleクライアントでルートを受け入れるオプションを無効にすると、そのデバイスはAppConnectorを経由してルーティングされなくなります。
UseTailscaleSubnetsシステムポリシーを使用することで、ユーザがこの設定を無効にできないようにできます。 - tailnet上のLinuxデバイスはデフォルトでルートを受け入れません。AppConnectorへのアクセスが必要なすべてのLinuxデバイスで、Tailscale CLIコマンド
tailscale set --accept-routes=trueを実行してください(まだ設定していない場合)。 - アプリケーションを手動で設定する場合、プロバイダは複数のドメインを使用することがよくあります。これらのドメインをすべてAppConnectorの設定に追加する必要があります。既知のアプリケーションとそれに対応するドメインの一覧については、GitHubのV2Flyプロジェクトを参照してください。
- 複数のFQDN(完全修飾ドメイン名)が同一IPアドレスを共有し、そのうちの1つがAppConnectorのターゲットである場合、解決されたIPアドレスを共有するすべてのFQDNへの接続がAppConnector経由でルーティングされます。これは、AppConnectorがIPアドレスを解決すると、解決方法やDNS名の代わりにIPアドレスが直接使用された場合でも、そのIPへのトラフィックをコネクタ経由でルーティングするためです。
- 最適なパフォーマンスと信頼性のために、1つのAppConnectorに複数のAppConnectorデバイスを用意することをお勧めします。
- 使用中のAppConnectorが利用不能になり、他に利用可能なAppConnectorがない場合、AppConnectorが復旧するまでドメインへの解決が失敗し始めます。
- TerraformやGitOpsなどの外部プロバイダを使用してtailnetポリシーファイルを管理している場合、管理コンソールでAppConnectorに加えた変更は次回の同期時に上書きされます。AppConnectorの管理は外部プロバイダを通じて行ってください。
デバイスキーの有効期限切れ
コネクタ(AppConnector、サブネットルータ、出口ノードなど)のキーが有効期限切れになると、コネクタがアドバタイズしたルートは他のデバイス上で設定されたままですが、到達不能になります(「フェイルクローズ」ポリシーとも呼ばれます)。Tailscaleがこれらのルートを意図的に維持するのは、削除すると信頼されていないネットワークへのトラフィック漏洩が発生する可能性があるためです。
この動作による障害を防ぐには、コネクタのキーの有効期限を無効にするか、高可用性を設定してください。キーの有効期限切れ時にルートを取り消したい場合は、管理コンソールまたはAPIを使用して、特定の条件が満たされたときにアドバタイズされたルートを有効化・無効化できます。