CGNATとの相互運用性
最終検証日:
翻訳: 竹洞 陽一郎
Tailscaleは、CGNAT範囲(100.64.0.0/10)のアドレスを割り当てます。
この範囲を保護するため、Linuxクライアントは、正当なTailscaleトラフィックではないこの範囲のトラフィックを破棄するファイアウォールルールをインストールします。
CGNATとの相互運用性はLinuxクライアントにのみ適用されます。
WindowsとmacOSでは、この破棄ルールは実装されていません。
このデフォルト動作は、この範囲を使用しているのがTailscaleだけであることを前提にしています。
しかし、100.64.0.0/10は汎用のキャリアグレードNAT(CGNAT)範囲であり、以下のように、すでにこの範囲で自社のインフラを運用している組織もあります。
- 既存のVPNやプライベートネットワークシステム。
- Kubernetesクラスタ(例:CGNATアドレス空間に配置されたAPIサーバ)。
- サブネットルーティングされた社内サービス。
破棄ルールは、正当な社内トラフィックと偽装されたTailscaleトラフィックを区別できないため、両方をブロックします。
その結果、Tailscaleが動作している間、デバイスはローカルのCGNATアドレスを持つサービスに到達できません。
破棄ルールを無効にすると、それらのデバイスはTailscaleを使いながら、同時に社内のCGNATアドレスを持つサービスにも到達できるようになります。
破棄ルールを無効にするのは、100.64.0.0/10にTailscale以外のサービスがある場合に限ってください。
該当しない場合は、有効のままにしておいてください。
最小権限モデルの動作変更
CGNAT破棄ルールを無効にし、かつRPFが有効になっていない場合、システムは偽装トラフィックに対してより脆弱になります。
CGNAT破棄ルールを無効にすると、ローカルネットワークからのIPスプーフィングに対する組み込みの保護が失われます。
破棄ルールがなければ、ローカルネットワーク上のデバイスが、Tailscale IPアドレスから送信されたように見えるパケットを送ることができてしまいます。
これは、Tailscaleのデフォルトである最小権限モデルを弱めることになります。
これを緩和するため、Reverse Path Filtering(RPF)が有効になっていることを確認してください。
- RPFは、パケットが正しいインターフェイスに到着したことを検証します。
- 偽装トラフィックが受け入れられるのを防ぎます。
- 最近のLinuxディストリビューションでは、デフォルトで有効になっています。
RPFの状態を確認する
多くのディストリビューションでは、以下のコマンドでRPFの状態を確認できます。
sysctl net.ipv4.conf.all.rp_filter
0:無効(非推奨)1:strict(厳密)2:loose(緩和)
Fedoraなど一部のディストリビューションでは、RPFをグローバルには無効にし、インターフェイス単位で有効にしています。
allの部分を対象のインターフェイス名に置き換えることができます。
例えば、sysctl net.ipv4.conf.wlp2s0.rp_filterを実行すると、wlp2s0インターフェイスの状態を確認できます。
RPFに関する警告のトラブルシューティング
以下のような警告が表示されることがあります。
- CGNAT破棄ルールが無効になっている。
- 意味:システムが偽装されたCGNATトラフィックを受け入れる可能性があります。
- RPFが有効になっていない。
- 意味: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になっていることを確認してください。
制限事項
- 設計上、Linux専用です。他のプラットフォームではCGNAT破棄ルールは実装されていません。
- 範囲の一部だけを対象にする制御はできません。
- CGNATルールに対する
viaによるルート制限には対応していません。
nodivertとの関係
disable-linux-cgnat-drop-ruleが利用可能になる前は、デバイスがTailscaleを使い続けながら社内のCGNATアドレスを持つサービスにも同時に到達できるようにする方法として、--netfilter-mode=nodivertが推奨されていました。
disable-linux-cgnat-drop-ruleとnodivertの両方が設定されている場合は、nodivertが優先されます。
このモードでは、ファイアウォールの動作は利用者が手動で管理することになります。