ノートTL;DRs
tailscale up --ssh: Tailscale SSH サーバーを起動し,tailnet 管理者が定義したアクセスポリシー(未定義ならデフォルトポリシー)に従ってアクセスを許可するコマンド--shields-upオプション: Tailscale ネットワーク上の他デバイスからの着信接続をブロックするオプション
📘 Tailscaleとアクセス制御ポリシー
基本ルール
- Tailscale では,ネットワーク(tailnet)上のデバイス管理は管理者(Admin)が,アクセス制御ポリシー(ACL)を設定することで接続制限を行う
- 一方,個々のユーザーも自分のデバイスに対しては制御権を持つ
- 例: Tailscaleからの着信接続をブロック(
tailscale up --shields-up)
- 例: Tailscaleからの着信接続をブロック(
ACLポリシーと方向性
- 「ノートPC → Web サーバー」への接続を許可するルールがあっても,逆方向,つまり「Web サーバー → ノートPC」への接続を許可することにはならない
- このことを,「ACLポリシーは方向性を持つ」と表現される
Tailscale クライアントのデフォルト挙動
Tailscale クライアントは,デフォルトで以下のように動作
- 着信接続を許可する
- Tailscale の DNS 設定を使用する
shields up
- すべての着信接続をブロックする状態のこと(
sshをブロック) - shields upを有効にしても,デバイス自体は tailnet 上で引き続き確認可能(
tailscale statusやブラウザ管理画面どちらでも)
例 1 コマンド例
# 着信接続をブロックする(shields up)
tailscale up --shields-up
# 着信接続を許可する(デフォルト)
tailscale up --shields-up=false🤔 はまったケース: ssh serverの再設定
ノートTL:DRs
Tailscale の key expire に伴い,再設定として
tailscale up --ssh --shields-upを実行してしまい,tailscale ssh は疎通しない状態にはまった.
起きたこと
--sshにより Tailscale SSH サーバー自体は有効化されている(tailscale debug prefsでもRunSSH: true)- しかし同時に指定した
--shields-upによって,着信接続がすべてブロックされる状態になっていた - そのため,L3レベルの疎通は生きているにもかかわらず,SSH 接続だけが確立できない状況が発生した
切り分けの手順
まず ICMP・TSMP レベルでの疎通を確認
% tailscale ping <device-ip>
pong from <device-name> (<device-ip>) via 192.168.10.104:41641 in 56ms
% tailscale ping --tsmp <device-ip>
pong from <device-name> (<device-ip>, 34043) via TSMP in 29mstailscale ping は成功しており,tailnet 上のデバイスとしては到達可能であることが分かる.
一方,ProxyCommand 経由の ssh はハンドシェイクが進まず停止
% ssh -vvv \
-o ProxyCommand="tailscale nc %h %p" \
<user>@<device-ip>
OpenSSH_9.6p1 Ubuntu-3ubuntu13.18, OpenSSL 3.0.13 30 Jan 2024
debug1: Reading configuration data ~/.ssh/config
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 19: include /etc/ssh/ssh_config.d/*.conf matched no files
debug1: /etc/ssh/ssh_config line 21: Applying options for *
debug2: resolve_canonicalize: hostname <device-ip> is address
debug3: expanded UserKnownHostsFile '~/.ssh/known_hosts' -> '~/.ssh/known_hosts'
debug3: channel_clear_timeouts: clearing
debug1: Executing proxy command: exec tailscale nc <device-ip> 22
debug1: identity file ~/.ssh/id_rsa type -1
...
debug1: Local version string SSH-2.0-OpenSSH_9.6p1 Ubuntu-3ubuntu13.18ここで止まったまま応答が返らず,tailscale ssh も同様に接続できなかった.tailscale debug prefs で RunSSH: true を確認していたため,「SSH サーバーは有効なのになぜ繋がらないのか」と原因の切り分けに時間がかかった.
原因
--shields-upは着信接続を全面的にブロックするオプションであり,SSH サーバーが有効かどうかとは独立した設定tailscale up --sshと--shields-upを同時に指定すると,SSH サーバー自体は起動しているにもかかわらず,shields up によって着信の SSH 接続そのものが弾かれるtailscale ping/tailscale ping --tsmpは疎通確認であり,shields up の影響を受けないため,「ping は通るのに ssh だけ通らない」という一見矛盾した状況になった
対応
# shields up を解除する
tailscale up --ssh --shields-up=false
# reset optionを用いる
tailscale up --ssh --resetこれにより着信接続のブロックが解除され,tailscale ssh / ProxyCommand 経由の ssh ともに疎通するようになった.
Appendix: Glossaries
glossary:
- def: ACL (Access Control List)
description: |
Tailscale における tailnet 全体のアクセス制御ポリシーを定義する仕組み.どのデバイス・ユーザーがどのデバイス・ポートに接続できるかをルールとして記述し,tailnet 管理者が管理する.ACL が明示的に定義されていない場合は,デフォルトポリシー(tailnet 内の全デバイス間で通信を許可)が適用される.
- def: ICMP (Internet Control Message Protocol)
description: |
IPネットワーク上でエラー通知や疎通確認に用いられるプロトコル.
`ping` コマンドはこの ICMP のエコーリクエスト/リプライを利用して
到達性を確認する.`tailscale ping` はデフォルトでこの ICMP による
疎通確認を行う.
- def: TSMP (Tailscale Message Protocol)
description: |
Tailscale 独自のping/疎通確認用プロトコル.`tailscale ping --tsmp`
で使用され,通常の ICMP ping とは異なり Tailscale の暗号化された
WireGuard トンネルを経由してピア間の直接疎通を確認する.