サブネットルートが重複する場合のLANトラフィック優先順位の問題のトラブルシューティング
最終検証日:
翻訳: 竹洞 陽一郎
LANサブネット内に、Tailscaleデバイスと非Tailscaleデバイスが混在しており、それらすべてが別のサブネットと通信する必要がある、という構成になっている場合があります。
このうちTailscaleデバイスは、そのサブネットへ到達するためにアドバタイズされたルートを受け入れる必要があります。
(非Tailscaleデバイスは通常のLANルーティングで到達します)
このような状況ではルーティングが非対称になり、新たな設定上の課題が生じることがあります。
この課題を回避するには、対象デバイスのOSに応じて異なる解決策があります。
以下で説明する解決策を、ノートパソコンのWi-Fiのような固定されていないネットワークインターフェイスに適用すると、本来Tailscaleネットワーク宛てのトラフィックを公衆LANネットワークへ送信してしまう状況を招く可能性があります。
これらの解決策は、サブネットおよびそれにアクセスするデバイスのネットワーク構成が十分に把握されており、かつ固定されている環境でのみ使用することを推奨します。
Windows・macOSの場合
WindowsおよびmacOSのいずれでも、ルートはデフォルトで受け入れられます。
OSは、最長プレフィックス一致のルート、言い換えれば設定済みのすべてのルートの中で最も具体的なルートを優先します。
したがって、サブネットルートが重複する場合の解決策の1つは、Tailscaleがアドバタイズするルートを、ルーティングの競合を避けたいLANサブネットよりも具体性の低いものに調整することです。
たとえば、192.168.2.0/24 というLANサブネットがあり、デバイスがこのLANセグメント上にあるときにそのサブネット宛てのトラフィックをTailscale経由でルーティングしないようにしたい場合は、サブネットルーターが 192.168.2.0/23 のルートをアドバタイズするように設定できます。
Linuxの場合
Linuxでは、tailnet内の他のデバイスからのサブネットルートを受け入れるために、tailscale up に --accept-routes フラグを明示的に渡す必要があります。
Linux版Tailscaleは、ポリシールーティング(policy routing)と呼ばれるルーティング機能を使用しており、これによりルーティングに追加の優先順位付けの層が導入されます。
Tailscaleは、ルートの優先順位付けのために 5200 から 5500 の優先度範囲のIPルールを使用します。
現時点では 5210、5230、5250、5270 です。
mwan3が動作していると検出されたOpenWRTシステムでは、互換性のためにTailscaleのルールはより低い優先度でインストールされます。
そのようなシステムでは、IPルールは 5200〜5300 ではなく 1300〜1400 の優先度範囲でインストールされます。
Tailscaleのルールより前に、lookup を使ってそれらを飛び越えるルールをインストールします。
ip rule add to 192.168.2.0/24 priority 2500 lookup main
上記のコマンドは、192.168.2.0/24 宛てのトラフィックに一致するルールを、優先度 2500(Tailscaleのルールより高い優先度)でインストールします。
一致した場合、このルールはデフォルトのルーティングテーブルである main ルーティングテーブルにジャンプします。
したがって、このルールはTailscaleのルールより優先され、main ルーティングテーブル内の通常のLANルートが使用されます。
この変更は永続的ではなく、起動時に適用する必要がある点に注意してください。
systemd-networkd を使用している場合は、systemd.network(5) の RoutingPolicyRule 設定オプションを参照してください。
また、この設定は systemd.service(5) に記載されている「oneshot」サービスとして適用することもできます。