Table of Contents
記事のスコープ
- Ubuntu 24.04 LTS, 22.02 LTSにおけるTailscaleのインストール
- Ubuntu 24.04 LTS側をssh host serverとしてTailscale sshを実行する
Tailscaleの仕組み
サービスとしてのTailscale
- Tailscaleとは,tailnetとよばれるWireGuard protocolを用いたP2P型仮想プライベートネットワーク(VPN)を提供してくれるサービスのこと
- P2P型VPN(=VPNサーバーで通信を集中制御していない)のため,tailscale利用者の同時接続数の影響によって通信速度が落ちるような心配がない特徴がある
Traditional VPN(hub and spoke型) | Tailnet |
---|---|
Tailscaleでは,ネットワークに参加しているnodes同士を直接結んでいます,このネットワークのことをmesh networkと呼びます. Tailscaleではこの独自ドメインメッシュネットワークでP2P通信をするので,
- スループットが向上
- レイテンシーが低下
- 分散化により単一障害点が減少するため,安定性と信頼性が向上
一方,mesh netowrkでは10個のnodesが存在する時,
- connectionsは$10 \times 9 \div 2 = 45$個
- endpointsは90個
- 各nodeは自分のキーと他のnodesのキーの合計10個をデータとして管理する必要がある
- node間通信時において通信相手の各nodeの対応したfirewallルールの管理の必要性
以上の点を管理する必要が有ります.このようなnetwork configurationはTailscale側で負担してくれるので,ユーザーが意識する認証はTailscaleの認証のみとなり,細かいところはACL(access control lists)で設定します.
Tailscale SSH
Tailscale SSHでは,ailscaleがTailscaleネットワークからのSSH接続のためにポート22を利用します.Tailscale SSHを実行する際,内部的に以下の処理をTailscaleは実行しています:
- WireGuardを使用して接続を認証および暗号化
- Tailscaleノードキーを利用してSSH接続を作成
ポイントとして,Tailscale SSH作成後はさらなる認証(authentication)は要求されずにそのままssh接続することができます.また,/etc/ssh/sshd_config
や~/.ssh/authorized_keys
といったssh config fileは影響を受けません.つまり,~/.ssh/
以下に通常配置されるssh keyがなくてもssh接続をすることができます.
注意点としては以下,
- SCPやSFTPは実行可能ですが,普通のssh接続と異なり2024-06-08時点ではX11 forawrdingはできない...
- Linux or macOSのみssh host serverになれる
Install Tailscale
ここで紹介するInstall手順はTailnetに接続したいデバイス全てに対して実行します.各OSそれぞれに対応したインストール手順はこちらを参照してください.以下ではUbuntuにフォーカスしたインストール手順を紹介します.
手順
- (もしないなら)curlコマンドをインストールする
- https://tailscale.com/install.sh のスクリプトを実行する
まず,curl
コマンドをインストールします
1
% sudo apt install curl
続いて,Linuxでは以下のコマンドでtailscaleをインストールします
1
2
3
4
% curl -fsSL https://tailscale.com/install.sh | sh
Installing Tailscale for ubuntu jammy, using method apt
+ sudo mkdir -p --mode=0755 /usr/share/keyrings
[sudo] password for kirakira-bushi:
その後,インストールが完了すると以下の画面が表示されます.
1
2
3
Installation complete! Log in to start using Tailscale by running:
sudo tailscale up
Column: curlコマンドのオプション
curl
コマンドはURLを指定してファイルをダウンロードする際に使用するコマンドです.
short option | long option | 説明 |
---|---|---|
-o |
--output ファイル名 |
保存するファイル名(指定しない場合は標準出力) |
-f |
--fail |
失敗してもエラーメッセージを表示しない |
-s |
-silent |
実行中のメッセージを表示しない |
-L |
–location |
要求したページにリダイレクトが掛かっていた場合に追従する |
Tailscaleのuninstall
UbuntuやDebian versionsでは,apt-get
を用いてuninstallします
1
% sudo apt-get remove tailscale
上記だけでは,Tailscale IP addressなどのlocal側の情報が残ってしまっているので,完全に削除する場合は以下のファイルの削除も行います
1
% rm /var/lib/tailscale/tailscaled.state
上記実行後に再度デバイスにTailscaleをインストールすると,新しいIPアドレスが割り当てられます.
Tailscale SSH接続前準備
作業手順
- SSH host server側でのTailscaleのインストールとssh hostの立ち上げ
- client側でのTailscaleセットアップ(基本的にはインストールのみ)
- Access rulesの設定
ミニマムでssh接続を実現したい場合は上記1,2の手順を実施するのみですが,ssh host serverのログインユーザーの制限をしたい場合は手順3の実施が必要となります.
SSH host server側でのTailscaleのセットアップ
上で紹介したインストール及び認証手順が完了した後, Advertise SSH on the hostという工程が必要です.これは,nodeがssh host serverになりますという宣言に相当する工程です.コマンドでは以下を実施,
1
% tailscale up --ssh
このコマンドの効果の詳細は以下です
- host keyparirを生成
- 生成したhost keypairのうち,の公開鍵をTailscaleと共有し,tailnet上の各クライアントに配布
- Tailscale IPアドレスのポート22にルーティングされるtailnetからのすべてのトラフィックを
tailscaled
(daemonみたいなもの)がインターセプトできるようにする
このコマンドはhost serverにつき,一回入力すれば完了です,
Client側でのTailscaleセットアップ
Client側もTailscaleをインストールします.インストール後,authenticationが必要となります.
1
% sudo tailscale up
を実行すると以下のような表示が現れます.
1
2
3
To authenticate, visit:
https://login.tailscale.com/a/hogehogehogehoge
実施後は,Tailnetに参加している状態となります.参加状態を確認するためには tailscale status
コマンドを入力します.
1
2
3
% tailscale status
100.xxx.xxx.xxx kirby-desktop kirakirabushi@ linux -
100.xxx.xxx.xxx dev-machine kirakirabushi@ linux -
ほかのデバイスが参加している状態ならばそのデバイス一覧が確認できるはずです.
Tailscaleからdisconnectしたい場合は
1
% sudo tailscale down
再接続の場合は,tailscale up
をもう一度実行します.
Block incoming connections
Tailscaleに接続した時,デフォルトでは
- Allow incoming connections
- Tailscale DNSの有功
という設定になっています.Client側では少なくとも前者の設定はいらないので
1
% sudo tailscale up --shields-up
と実行することが推奨されます.Tailscale DNS設定を利用しない場合は
1
% sudo tailscale up --accept-dns=false
設定内容を確認したい場合は,tailscale debug prefs
で確認することができます.
SSH接続の実行
作業手順
- Tailnetを介したnodes間の疎通確認
- SSH hostserver側でのユーザー設定
- Tailscale sshの実行
Tailnetを介したnodes間の疎通確認
各デバイスのTailnetへの接続状況は tailscale status
で確認することができますが,実際に疎通できるかは
tailscale ping
nmap
コマンド
のいずれかの方法で確認できます.
ping
コマンドでも確認することできますがtailscale ping
で簡潔に以下のように確認できます.
1
2
3
% tailscale ping 100.xxx.xxx.xxx
pong from kirakirabushi-server (100.xxx.xxx.xxx) via xxx.xxx.xxx.xxx:yyyy in 2ms
より詳細な状態を確認したい場合は,nmap
コマンドを以下のように用います.
1
2
3
4
5
6
7
8
% nmap 100.xxx.xxx.xxx
Starting Nmap 7.80 ( https://nmap.org ) at 2024-06-09 03:18 JST
Nmap scan report for kirakirabushi-server.tail0pkk5.ts.net (100.xxx.xxx.xxx)
Host is up (0.013s latency).
Not shown: 998 closed ports
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
SSH hostserver側でのユーザー設定
ssh接続を行うためには予めユーザーがホストサーバー側で作成されている必要が有ります.Linuxでは大きく分けるとユーザーは以下3つあります
ユーザー区分 | 説明 |
---|---|
スーパーユーザー | システム唯一の特権ユーザー,すべてのアクセス制御を無視することができる ユーザー名: root, ユーザーid: 0と決まっている |
システムユーザー | 各種サーバープログラムやシステムプログラムの実行に利用されるユーザー,ユーザーIDは主に1~99の範囲で割り当てられる |
一般ユーザー | システムの一般利用者,ユーザーIDは1000以降が割り当てられる(初めてのユーザーなら1000) |
ユーザーの作成
ユーザーを作成する場合は adduser
コマンドを使います.
- ホームディレクトリの雛形ディレクトリは
/etc/skel/
- ユーザー作成時に参照する設定ファイルはデフォルトでは
/etc/adduser.conf
という特徴が有ります.ユーザー作成時の段階からデフォルトのloginシェルをzshに変更したい場合は,/etc/adduser.conf
設定ファイルを変更する形でもできます.
1
% adduser <username who you want to create>
オプション | 説明 |
---|---|
--no-create-home |
ホームディレクトリが存在しない場合でも新規作成しない |
--uid ユーザーID |
新規作成時のユーザーIDを指定する(指定しない場合,他と重複しない値を自動で設定する |
--conf ファイル名 |
デフォルトの設定ファイル(/etc/adduser.conf )以外の設定ファイルを指定する |
ユーザー作成後は, id <作成ユーザー名>
で念の為作成結果を確認することが推奨されます.実行時に,fatal: Only root may add a user or group to the system.
というエラーが出た場合,
1
% sudo adduser <username who you want to create>
とsudo
コマンドを用いて実行してください.誤ったユーザーを作成してしまった場合は
1
% sudo deluser -r <username>
--remove-home
or -r
オプションを付与することで,ユーザー削除時にホームディレクトリも合わせて削除することができます.
注意 !
Ubuntuではadduser
と似た名前のコマンドとしてuseradd
コマンドが有りますが,デフォルトではホームディレクトリが作成されません.誤ってuseradd
でユーザーを作成しホームディレクトリの作成の必要が出てきたならば
1
% mkhomedir_helper <username>
コマンドを実行します.Desktop
やDownloads
といったX-relatedフォルダーはGUIログインのときに自動的に作成されます.
ユーザーをグループに追加する
作成したユーザーにsudo
実行権限を付与したい場合,作成したユーザーをsudo
グループに追加するのが基本方針となります.やり方は大きく2つあり
- ユーザー作成時に
sudo
グループに追加する - ユーザー作成後に,改めて
sudo
グループに追加する
1
2
3
4
5
6
7
8
# ユーザー作成時に`sudo`グループに追加する場合
% adduser <username> <groupname>
# ユーザー作成後に,改めて`sudo`グループに追加する: gpasswdの場合
% gpasswd -a <username> <groupname>
# ユーザー作成後に,改めて`sudo`グループに追加する: usermodの場合
% usermod -G <groupname> <username>
上記実行後は,groups <username>
でグループ所属状況を確認できます.
Tailscale sshの実行
ssh
コマンドの利用の仕方は通常のOpenSSHクライアントコマンドと同様に
1
% ssh <username>@<hostname>
でログインすることができます. ログアウトする場合は
exit
コマンドctrl
+D
のいずれかで抜けることができます.
VSCodeを介したssh接続
Remote-ssh機能を利用することでGUI操作でssh接続先を開くことができますが, 以下のようにコマンドでssh先directoryを対象に 直接workspaceを開くこともできます
1
% code --folder-uri "vscode-remote://ssh-remote+<ssh接続名>/<path>"
個人では以下のようなスクリプトを組みました:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#!/bin/bash
## open a directory at the ssh server as a vscode workspace
## Author: Ryo Nakagami
## Revised: 2024-06-25
## REQUIREMENT: code + ssh setup
set -eu
function usage {
cat <<EOM
Usage: $(basename "$0") [OPTION]...
-h Display help
-s sshconfig_name reference .ssh/config hostname
-r directory relative-path directory
-a directory abolute-path directory
EOM
exit 2
}
while getopts ":s:r:a:h" optKey; do
case "$optKey" in
s)
SSH_CONFIG="${OPTARG}";
USER_ROOT=$(ssh -G ${SSH_CONFIG} | grep ^"user "| sed 's/user //')
;;
r)
RELATIVE_TARGET_DIRECTORY="${OPTARG}"
TARGET_DIRECTORY="/home/${USER_ROOT}/${RELATIVE_TARGET_DIRECTORY}/"
;;
a)
TARGET_DIRECTORY="${OPTARG}";
;;
'-h' | '--help' | *)
usage
;;
esac
done
code --folder-uri "vscode-remote://ssh-remote+$SSH_CONFIG$TARGET_DIRECTORY"
.ssh/config
ファイルの設定
~/.ssh/config
にssh接続のときに参照するパラメータを設定できます
1
2
3
4
5
6
# yushima ml server connection
Host kirbyserver
Hostname tmp-kirbyserver
User kirakira-bushi
ForwardAgent yes
RequestTTY yes
上記のように設定すると以下のコマンドはssh kirakira-bushi@tmp-kirbyserver
の代わりに
1
% ssh kirbyserver
だけでアクセスできるようになります. ForwardAgent yes
はSSH 先のホストでSSH公開鍵認証を利用して GitHub にアクセスするための設定となります.
SSH Agent Forwarding機能
SSH Agent Forwarding 機能を使うと,ssh-agentを介して,秘密鍵をローカルPCに置いたまま,ログイン先のサーバーからさらに別のサーバーにログインすることもできます.
事前に ssh-add
コマンドを用いてssh-agentに秘密鍵を登録する必要が有ります.
1
2
3
% ssh-add ~/.ssh/<ssh private key>
Enter passphrase for ~/.ssh/<ssh private key>:
Identity added: ~/.ssh/<ssh private key> (hogehoge@foo.com)
例として,上記の手順を踏んでGitHub用の秘密鍵を登録した後に,ssh接続先で以下のコマンドを叩いて接続確認してください.
1
2
% ssh -T git@github.com
Hi hoshinokirby! You've successfully authenticated, but GitHub does not provide shell access.
Access Control Listsを用いたSSHログインユーザーの制限
TailscaleのAccess Controlsを用いると, ユーザーグループや接続先に応じたログインユーザーの設定ができます. 個人で使用する範囲では必要ない機能ですが,知人を簡易的に自分のネットワークに招待するときに使用したりします.
設定のポイントとしては2つ
groups
を作成するgroups
に対応したssh
ルールを作成する
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
{
"groups": {
"group:admin": ["kirakirabushi@hoge.com"],
"group:dev": ["dedede@daioh.com"],
},
"tagOwners": {
"tag:pupupuserver": ["autogroup:admin"],
"tag:devserver": ["group:dev"],
},
"ssh": [
// Allow all users to SSH into their own devices in check mode.
// Comment this section out if you want to define specific restrictions.
{
"action": "accept",
"src": ["group:admin"],
"dst": ["tag:pupupuserver"],
"users": ["autogroup:nonroot", "root"],
},
{
"action": "check",
"src": ["group:dev"],
"dst": ["tag:pupupuserver"],
"users": ["ubuntu-daioh"],
},
],
}
上のACLでは次のような設定をしています
kirakirabushi@hoge.com
はadmindedede@daioh.com
はdevというグループに配属- devグループのユーザーは
pupupuserve
にアクセスするときにubuntu-daioh
というusernameしか接続することができない
ACL設定項目 | 説明 |
---|---|
action |
accept :tailnet上ですでに認証されたユーザーからの接続を受け入れるcheck :ユーザーに定期的な再認証を要求する |
src |
ssh接続元, user:dedede@daioh.com のようにユーザーを直接指定することができる |
dst |
ssh接続先 |
Tailscaleにおけるuser switching
Tailscaleは一つのデバイスで同時に複数のアカウントでloginすることはできない(=1時点に一つのアカウントのみ)ですが,userの切り替えは簡単に実施することができます.
swithcingの際にre-authenticationは要求されないですが以下の場合は要求されます
- 使用しているデバイスから初めてloginする場合
- デバイスのtailnet node keyが期限切れの場合
Tailscale accountをswitchする場合
tailscale login
コマンドを実行することでaccount switchすることができます.
1
2
3
4
5
6
7
% sudo tailscale login
[sudo] password for kirakirabushi:
To authenticate, visit:
https://login.tailscale.com/a/hogehoge
Activeアカウント一覧はtailscale switch --list
で確認することができます.
Activeアカウントに対してニックネームを以下のようにつけることができます.
1
% tailscale set --nickname=work
すると sudo tailscle switch work
でwork
ニックネームのアカウントに切り替えることができます.
Appendix: 用語整理
Terminology | 説明 |
---|---|
Authentication | ユーザー認証のこと.いわゆる「check who you are」のプロセス |
Authorization | ユーザー認証のをベースに,ユーザーに対して認可するリソースやアクションを決定するプロセス |
Firewall | ファイアウォールは,2つのポイント間で通過できるネットワークトラフィックを制限します.ファイアウォールには,ハードウェアベースのものとソフトウェアベースのものがあります.Tailscaleには,ドメインのアクセスルールによって定義される組み込みのファイアウォールが含まれています. |
MagicDNS | Tailscaleネットワーク内のデバイスに対して人間が覚えやすいホストネームを割り当てる機能 |
Node(Tailscale) | ユーザーとデバイスの組のこと |
Peer | コミュニケーション先のNodeのこと.Peerは同じdomain,異なるdomainの両方のケースがあり得る. |
SSO | Single sign-onの略.SSOはユーザーが別のサイトの認証情報を使用して1つのサイトにログインできるようにする仕組み. |
References
(注意:GitHub Accountが必要となります)