Tailscaleロゴ

CGNATとの相互運用性

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

Tailscaleは、CGNAT範囲100.64.0.0/10)のアドレスを割り当てます。
この範囲を保護するため、Linuxクライアントは、正当なTailscaleトラフィックではないこの範囲のトラフィックを破棄するファイアウォールルールをインストールします。

CGNATとの相互運用性はLinuxクライアントにのみ適用されます。
WindowsとmacOSでは、この破棄ルールは実装されていません。

このデフォルト動作は、この範囲を使用しているのがTailscaleだけであることを前提にしています。
しかし、100.64.0.0/10は汎用のキャリアグレードNAT(CGNAT)範囲であり、以下のように、すでにこの範囲で自社のインフラを運用している組織もあります。

破棄ルールは、正当な社内トラフィックと偽装されたTailscaleトラフィックを区別できないため、両方をブロックします。
その結果、Tailscaleが動作している間、デバイスはローカルのCGNATアドレスを持つサービスに到達できません。
破棄ルールを無効にすると、それらのデバイスはTailscaleを使いながら、同時に社内のCGNATアドレスを持つサービスにも到達できるようになります。

破棄ルールを無効にするのは、100.64.0.0/10にTailscale以外のサービスがある場合に限ってください。
該当しない場合は、有効のままにしておいてください。

最小権限モデルの動作変更

CGNAT破棄ルールを無効にし、かつRPFが有効になっていない場合、システムは偽装トラフィックに対してより脆弱になります。

CGNAT破棄ルールを無効にすると、ローカルネットワークからのIPスプーフィングに対する組み込みの保護が失われます。

破棄ルールがなければ、ローカルネットワーク上のデバイスが、Tailscale IPアドレスから送信されたように見えるパケットを送ることができてしまいます。
これは、Tailscaleのデフォルトである最小権限モデルを弱めることになります。

これを緩和するため、Reverse Path Filtering(RPF)が有効になっていることを確認してください。

RPFの状態を確認する

多くのディストリビューションでは、以下のコマンドでRPFの状態を確認できます。


sysctl net.ipv4.conf.all.rp_filter

Fedoraなど一部のディストリビューションでは、RPFをグローバルには無効にし、インターフェイス単位で有効にしています。
allの部分を対象のインターフェイス名に置き換えることができます。
例えば、sysctl net.ipv4.conf.wlp2s0.rp_filterを実行すると、wlp2s0インターフェイスの状態を確認できます。

RPFに関する警告のトラブルシューティング

以下のような警告が表示されることがあります。

CGNAT破棄ルールを無効にする

tailnetポリシーファイルを編集し、disable-linux-cgnat-drop-ruleノード属性を設定します。

以下の例では、internal-subnet-routersタグが付いたすべてのデバイスを対象にしています。

{
  "nodeAttrs": [
    {
      "target": ["tag:internal-subnet-routers"],
      "attr": ["disable-linux-cgnat-drop-rule"]
    }
  ]
}

この属性を削除すると、破棄ルールは自動的に復元されます。

CGNAT破棄ルールが無効になっていることを確認する

iptablesコマンドを-Lフラグ(一覧表示)付きで実行します。


iptables -L

ts-inputチェーンにおいて、100.64.0.0/10に対するルールがDROPではなくRETURNになっていることを確認してください。

制限事項

nodivertとの関係

disable-linux-cgnat-drop-ruleが利用可能になる前は、デバイスがTailscaleを使い続けながら社内のCGNATアドレスを持つサービスにも同時に到達できるようにする方法として、--netfilter-mode=nodivertが推奨されていました。

disable-linux-cgnat-drop-rulenodivertの両方が設定されている場合は、nodivertが優先されます。
このモードでは、ファイアウォールの動作は利用者が手動で管理することになります。