tailscaleで安全にデスクトップにリモート接続したい!
はじめに
最近どうもパソコンが重くなってきたなと感じました。というのも、パソコンを買った当初はこんなにゴリゴリエンジニアリングや研究をするとは思っておらず、スペック自体がそこまで高くありませんでした。でも大学生の身分ではすぐにハイスペック機を買い換えるのも難しい……。そこで考えたのが「研究室の Ubuntu マシンを自宅から使えたら一番ラクでは?」ということ。
しかし大学ネットワークはプライベート環境かつファイアウォールや IP 制限が複雑で、従来の VPN やポートフォワードは管理者権限が必要でした。そこで今回は Tailscale を利用し、Google/GitHub アカウントだけで安全に「Mac ⇔ 学内 Ubuntu」を直結する手順と、仕組みを紹介します。
0. 前提条件
- 自宅 Mac: macOS 12 以上、Homebrew 利用可
-
学内 Ubuntu: Ubuntu 20.04 / 22.04、
sudo
権限あり - 双方とも外向き HTTPS (tcp/443) が通る
- 同じ Tailscale アカウント(Google / GitHub など)を使用
1. 学内 Ubuntu(受ける側)セットアップ
# Tailscale クライアント取得
curl -fsSL https://tailscale.com/install.sh | sh
sudo systemctl enable --now tailscaled
sudo tailscale up --ssh
tailscale status
の行末に ssh ✔
が付けば準備完了です。
2. 自宅 Mac(接続側)セットアップ
brew install tailscale
tailscale up
ブラウザが開き、Google や GitHub で SSO 認証→ Tailnet 参加となります。
3. 接続方法
# MagicDNS が有効ならホスト名で
tailscale ssh <ubuntuホスト名>
# Tailnet IP 直指定 (100.x.y.z)
tailscale ssh <user>@100.x.y.z
Tailscale SSH を使わず、従来通り ssh <user>@100.x.y.z
でも接続可能です。
4. MagicDNS を有効化
-
管理コンソール → DNS → Enable MagicDNS を ON
-
Mac で DNS を受け入れる
tailscale set --accept-dns=true tailscale down && tailscale up
-
名前解決を確認
tailscale ping <ubuntuホスト名>
5. トラブルシューティング
症状 | 対処 |
---|---|
Could not resolve hostname … |
MagicDNS が無効、または Mac 側で --accept-dns=true を忘れている |
permission denied (tailscale) |
Ubuntu で tailscale up --ssh 済みか? ACL で自分が許可されているか? |
応答なし |
sudo systemctl restart tailscaled でデーモン再起動 |
日本語が文字化け | Ubuntu /etc/environment に LANG=ja_JP.UTF-8 を追加 |
6. 便利コマンド
tailscale status # ノード一覧
tailscale ssh <host> -- "uptime" # リモート uptime 取得
tailscale ssh -p 10022 <host> # 任意ポート転送
sudo tailscale set --ssh=false # SSH 広告を無効化
7. 仕組みをざっくり理解する
WireGuard によるエンドツーエンド暗号化
Tailscale のデータプレーンは WireGuard® を使用しており、通信は常に暗号化されています。
NAT Traversal & DERP
STUN による UDP ホールパンチで直接通信を試み、失敗時は DERP リレーサーバーを経由して接続を確立します。
Tailscale SSH
tailscale up --ssh
を実行すると、WireGuard 層の認証を SSH に委譲し、鍵やパスワード管理が不要になります。
Node Key と OAuth
初回 tailscale up
で SSO 認証すると Node Key が端末に発行され、一定期間ごとに自動ローテーションされます。
ACL & MagicDNS
ゼロトラスト ACL によりユーザー・グループ単位で通信を許可。MagicDNS が Tailnet 内のホスト名を自動解決します。
7.5 ファイアウォール/IPフィルタリングを超えられる理由
大学ネットワークのように「外向き 443/TCP/80/TCP だけ開放 + 着信はすべて拒否」という厳しいファイアウォールでも Tailscale が通信できるのは、クライアントが状況に応じて次の 4 段階を自動で切り替えるためです。
ステップ | 使用技術 | しくみ | なぜ通るか |
---|---|---|---|
① STUN で外側ポート調査 | STUN (UDP/3478) | 端末→STUN サーバへ外向き UDP パケットを送信し、NAT が割り当てるポート番号を把握 | ほとんどのファイアウォールは“外向き”の 3478/UDP を許可している |
② UDP ホールパンチ | WireGuard over UDP | 双方で同時にパケットを撃ち合い、NAT に「往復通信あり」と誤認させて孔を開ける | すべて内側発の通信なので FW を“突破”せず合法通過できる |
③ DERP リレー | DERP + WebSocket (TCP/443) | UDP が遮断されていたら両端とも WebSocket で最寄り DERP へ接続し、暗号化パケットを中継 | 多くの環境が最後に許す 443/TCP を利用し、中継経由で到達 |
④ TLS ラッピング | WireGuard in TLS (TCP/443) | さらに厳しい環境では WireGuard フレームを TLS ストリームに包む | FW からは通常の HTTPS と見えるためブロックされにくい |
ポイントは「着信を待たず、すべて 自分から 外へ出る」こと。 公開ポートを開ける必要がなく、ファイアウォールは正規のアウトバウンド通信として処理します。
IP フィルタリングを無力化する補助要素
- 100.64.0.0/10 の CGNAT レンジ — Tailnet IP は外部に露出せず、社内予約帯域と衝突しにくい。
- 世界分散 DERP — 自動で最寄りリージョンを選択しレイテンシを最小化。必要なら自前 DERP で“許可 IP”だけを開放可能。
- ゼロトラスト ACL — 22 番を外部公開して IP フィルタを掛ける従来方式と異なり、最初から外部にポートが開いていない。
8. 最小手順(コピペ用)
# === Ubuntu ===
curl -fsSL https://tailscale.com/install.sh | sh
sudo systemctl enable --now tailscaled
sudo tailscale up --ssh
# === Mac ===
brew install tailscale
tailscale up
# === 接続 ===
tailscale ssh <user>@<ubuntuホスト名> # または IP
おわりに
インストールは 3 行、接続は 1 行。Tailscale を導入して、ストレスフリーなリモート開発環境を手に入れましょう!
Happy Remote Hacking!
Discussion