サブネットルーター
最終検証日:
翻訳: 竹洞 陽一郎
サブネットルーターは、Tailscaleクライアントを実行できないデバイスを含めてTailscaleネットワークを拡張する仕組みです。
tailnetと物理的なサブネットの間のゲートウェイとして動作し、すべての機器にクライアントを導入することなく、レガシーな機器やサービスへ安全にアクセスできるようにします。
サブネットルーターが必要になる理由
セキュリティと暗号化の観点では、各デバイスにクライアントを直接インストールする構成が最良です。
しかし実際には、プリンタのようにTailscaleを実行できない機器があり、AWSのVPCやレガシーネットワークのような大規模環境では、エンドポイントごとの導入は現実的ではありません。
サブネットルーターは、アクセス制御ポリシーを適用しながらトラフィックを中継することで、この差を埋めます。
なお、サブネットルーターの背後にあるデバイスは、料金プランのデバイス数の上限には計上されません。
利点
- Tailscaleクライアントを実行できないレガシー機器に接続できます。
- AWSのVPCのようなネットワーク全体を、デバイスごとの導入なしに統合できます。
- 既存のネットワークセグメント単位で、段階的にTailscaleを導入できます。
- ネットワーク全体にわたって、Tailscaleのポリシーでアクセス制御を維持できます。
ユースケース
- マネージドサービスへのアクセス: Amazon RDSやGoogle Cloud SQLなどのマネージドサービスへ、インターネットに公開することなく安全に接続します。
- クラウドネットワークの統合: クラウドのVPCをTailscaleネットワークに接続します。
- 機器への接続: プリンタやカメラなどを、クライアントを導入せずにリモートの利用者から利用できるようにします。
サブネットルーターの仕組み
サブネットルーターは、ゲートウェイとして動作するtailnet上のデバイスであり、Tailscaleクライアントを持たないデバイスへのルートをアドバタイズします。
このゲートウェイを経由して利用されるデバイスを、サブネットルーターの「背後にある」デバイスと呼びます。
サブネットルーターは、既定で送信元ネットワークアドレス変換(SNAT)を行います。
そのため、背後のデバイスからのトラフィックは、サブネットルーター自身から送信されたように見えます。
元の送信元IPアドレスを保持する必要がある場合は、SNATを無効にできます。
サブネットルーターとExit Nodeの違い
Exit Nodeは、インターネット向けの送信トラフィックをルーティングする、VPNサーバーのような役割を果たします。
トラフィックはExit Nodeの所在地から出ていくため、地域制限のあるコンテンツの利用やプライバシー確保に役立ちます。
一方サブネットルーターは、特定のプライベートサブネットへのアクセスのみを提供し、インターネット向けトラフィックの経路には影響しません。
オフィスのLANやクラウドのVPCへ接続する場合はサブネットルーターを、インターネット全体の経路を変えたい場合はExit Nodeを使用します。
サブネットルーターを設定する
- Tailscaleクライアントをインストールします。
- サブネットルーターとしてTailscaleに接続します。
- 管理コンソールでサブネットルートを有効にします。
- アドバタイズしたサブネットルートに対するアクセスルールを追加します。
- 接続を確認します。
- 他のデバイスからサブネットルートを利用します。
IP転送を有効にする
サブネットルーターとして接続するには、IP転送の有効化と、ルートのアドバタイズの2つの設定が必要です。
/etc/sysctl.dがあるLinuxの場合:
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
/etc/sysctl.dがないLinuxの場合:
echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.conf echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.conf sudo sysctl -p /etc/sysctl.conf
firewalldを使用している環境では、既知の問題への回避策として次のコマンドを実行します。
firewall-cmd --permanent --add-masquerade
ファイアウォールは、既定でトラフィックの転送を拒否する設定であるべきです(ufwやfirewalldでは標準の挙動です)。
サブネットルートをアドバタイズする
sudo tailscale set --advertise-routes=192.0.2.0/24,198.51.100.0/24
サブネットルートはカンマ区切りで複数指定できます。
Apple TVを除くすべてのプラットフォームでIPv4とIPv6に対応しています(Apple TVはIPv4のみです)。
tailnetポリシーファイルでautoApproversを設定しているルートは自動的に承認され、それ以外は手動での承認が必要です。
デフォルトルート(0.0.0.0/0、::/0)をアドバタイズするのではなく、Exit Nodeを使用してください。
管理コンソールでサブネットルートを有効にする
autoApproversを使用しない場合は、次の手順で承認します。
- 管理コンソールのMachinesページを開きます。
- Subnetsのバッジを探すか、
property:subnetで絞り込みます。 - 対象のデバイスを選択し、Subnetsセクションを開きます。
- EditからEdit route settingsを選択します。
- Subnet routesでルートを選択し、Saveを選択します。
サーバーでは、定期的な再認証を避けるためにキーの有効期限を無効にすることを検討してください。
タグを付けたデバイスでは、キーの有効期限は既定で無効になります。
詳細は、キーの有効期限を参照してください。
アドバタイズしたサブネットルートにアクセスルールを追加する
アクセスルールはどの通信を許可するかを制御し、ルートの承認はどのルートをクライアントのルーティングテーブルへ反映するかを制御します。
この2つは別々の仕組みです。
管理コンソールのAccess controlsページで、アドバタイズしたサブネットへのアクセスを許可するルールを作成します。
{
"groups": {
"group:dev": ["alice@example.com", "bob@example.com"]
},
"grants": [
{
"src": ["group:dev","192.0.2.0/24", "198.51.100.0/24"],
"dst": ["192.0.2.0/24", "198.51.100.0/24", "2001:db8::/32"],
"ip": ["*:*"]
}
]
}
この設定は、SNATを無効にしている場合、group:devから3つのサブネットへのアクセスと、192.0.2.0/24と198.51.100.0/24の間の相互通信を許可します。
ビジュアルポリシーエディタを使ってtailnetポリシーファイルを管理することもできます。
接続を確認する
tailnet上の別のデバイスから、サブネットルーターのTailscale IPアドレスにpingを送り、設定が正しいことを確認します。
Tailscale IPアドレスは、管理コンソールまたは次のコマンドで確認できます。
tailscale ip -4
他のデバイスからサブネットルートを利用する
Android、iOS、macOS、tvOS、Windowsでは、新しいサブネットルートを自動的に検出します。
Linuxでは、次のコマンドでルートの自動的な受け入れを有効にします。
sudo tailscale set --accept-routes
高度なサブネットルーティング
DNSの問い合わせを社内DNSサーバーへ向ける
管理コンソールのDNSページでSplit DNSを設定します。
アドバタイズしたサブネット上の社内DNSサーバーを使うことで、ハイブリッド環境でも名前解決が行えます。
詳細は、TailscaleにおけるDNSを参照してください。
高可用性を設定する
サブネットルーターを冗長化することで、個々のデバイスが停止した際にも接続を維持できます。これは本番環境では不可欠です。
詳細は、高可用性の設定を参照してください。
同一リージョン内で複数のサブネットルーターが同じルートをアドバタイズしている場合、待機系のルーターで--accept-routesを有効にしないでください。
待機系が自分の直結サブネット宛のトラフィックを、直接送らずに現用系経由で送ってしまい、非効率な経路になります。
多くの高可用性構成では--advertise-routesのみを使用してください。
プレフィックス長の異なる重複ルートを使う
Tailscaleは、複数のサブネットルーターからの重複するルートを、最長プレフィックス一致(LPM)で扱います。
たとえば、サブネットルーターAが10.0.0.0/16を、サブネットルーターBが10.0.0.0/24をアドバタイズしている場合、10.0.0.1宛のトラフィックはより具体的な/24を持つBへ、10.0.1.1宛のトラフィックは/16のみが一致するAへ送られます。
この構成は、特定のサブネットを専用のルーター経由にして性能を高める場合、サブネットごとに異なるセキュリティポリシーを適用する場合、サブネットを新しい基盤へ段階的に移行する場合に有効です。
より具体的なルートを持つサブネットルーターが停止しても、Tailscaleはより広いルートへフォールバックしません。
上の例でBが停止すると、10.0.0.1宛のトラフィックはAの/16へ切り替わらず、破棄されます。
Tailscaleはアドバタイズされたプレフィックスをそれぞれ独立に扱い、動的ルーティングではなく静的なルート選択を行うためです。
回避策として、広いプレフィックスを持つルーターにも、より具体的なプレフィックスを併せてアドバタイズさせてください。
SNATを無効にする
既定では、TailscaleはサブネットルーターのトラフィックにSNATを適用します。
次のフラグで無効にできます(Linuxのみ)。
tailscale up --snat-subnet-routes=false
無効にすると、背後のホストの送信元IPアドレスが保持されます。
一方で、背後のデバイスはtailnetのIPアドレスへアクセスできるものの、戻りの経路が自動では設定されません。
戻りの経路は、デバイスのOS、VPCの設定、またはDHCPサーバーで設定します。
- 宛先ネットワーク:
100.64.0.0/10(予約アドレスを含むTailscaleのIPアドレス範囲) - ネクストホップ(ゲートウェイ): サブネットルーターのLAN側IPアドレス
サブネットルーターとExit Nodeを兼ねるノードで--snat-subnet-routes=falseを設定すると、上流でパケットが破棄される場合があります。
SNATを無効にする必要がある場合は、サブネットルーターとExit Nodeを別々のノードに分けてください。
注意事項
デバイスキーの期限切れ
アプリコネクタ、サブネットルーター、Exit Nodeといったコネクタのキーが期限切れになると、アドバタイズされたルートは設定として残る一方で、到達できなくなります。
これは、信頼できないネットワークへ意図せずトラフィックが漏れることを防ぐための、フェイルクローズの設計です。
対策としては、次の方法があります。