ssh接続セットアップ: Tailscaleを用いた接続設定

分析用サーバーとしてのUbuntu Desktop Noble Numbat Setup 2/N

公開日: 2024-06-08
更新日: 2024-06-24

  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
traditionalvpn 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にフォーカスしたインストール手順を紹介します.

手順

  1. (もしないなら)curlコマンドをインストールする
  2. 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接続前準備

作業手順

  1. SSH host server側でのTailscaleのインストールとssh hostの立ち上げ
  2. client側でのTailscaleセットアップ(基本的にはインストールのみ)
  3. 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接続の実行

作業手順

  1. Tailnetを介したnodes間の疎通確認
  2. SSH hostserver側でのユーザー設定
  3. 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> 

コマンドを実行します.DesktopDownloadsといった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はadmin
  • dedede@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 workworkニックネームのアカウントに切り替えることができます.

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



Share Buttons
Share on:

Feature Tags
Leave a Comment
(注意:GitHub Accountが必要となります)