tailscaleの導入と使い方
今回はVPNサービスとして人気のtailscaleについて紹介します。
VPN(Virtual Private Network)は、パケットの暗号化とカプセル化・トンネリング技術を使用してネットワーク上に構築した 仮想的なプライベートネットワークです。
VPNを利用してネットワーク通信をすることで、第三者が盗聴できる余地のあるワイドエリアネットワーク(WAN)上でもプライベートネットワークのような データの機密性を維持した安全な通信ができます。
VPNは既存のインターネット回線を使用するインターネットVPN、プロバイダーが管理する閉域網を使用するIP-VPNなどがあります。
そんな中、tailscaleはインターネットVPNに分類されるP2P型のVPNサービスです。
tailnetと呼ばれるユーザーアカウントに紐づいた独自ドメインネットワーク内でP2P通信を実現します。
VPNサーバーで通信を集中制御していないため、tailscale利用者の同時接続数の影響によって通信速度が落ちるような心配はありません。
そんな特徴を持つtailscaleについて、この記事ではその導入と使用方法を紹介したいと思います。
目次
tailscaleの導入と接続
- 【Windows】アプリインストールとVPN接続
- 【Ubuntu(Linux)】アプリインストールとVPN接続
- 【Android】アプリインストールとVPN接続
tailscaleの使い方
tailscaleを利用する上で知っておきたい知識
導入方法と使い方を紹介する前にtailscaleを利用する上で知っておくと良い基礎知識について説明します。
tailnet
tailscaleは、アカウントに紐づいた通信デバイス(スマホやパソコン)同士をtailnetと呼ばれる仮想的なプライベートネットワーク内で相互接続します。 これにより、tailnetを通信インフラとした端末間のP2P通信を実現します。

tailnetはWAN上に構築されますが、通常のプライベートネットワークのように同一ネットワーク(tailnet)内に配置されたデバイス同士は 透過的なアクセスができる一方、外部ネットワークからtailnetへの能動的なアクセスはできません。
これによって、遠く離れたデバイス同士も安全に通信することができます。
tailnetは各ユーザーアカウントに応じて専用のものが作成されます。作成されるタイミングはユーザーが初めてtailscaleにログインしたときです。
tailnetができることは、ユーザーが選択したtailscaleのプランによって決まります。
今回、この記事で試した無料プランでは以下のことができます。
Free Plan
- 最大100台のデバイスと3人のユーザーまでTailscaleの機能を無料で利用
- 登録デバイス同士のP2P通信
- MagicDNS機能
- ACL機能
- ユーザー承認機能
- シングルサインオン対応
基本的にどのプランも使い方は同じです。
※有料プランはいくつか種類がありますので、知りたい方は以下のURLのプラン案内を確認してください。
MagicDNS
tailscaleでは、各登録デバイスに割り振られたホスト名を使用して登録デバイス同士の通信が可能です。
例えば、通信対象のデバイスのホスト名がkamo-phoneだった場合、 tailnet ip(第1オクテットが100から始まるtailnet専用の端末IPアドレス)を指定する代わりに次のようにホスト名kamo-phoneを指定することで通信が可能です。※下に掲載したコンソール画面はkamo-phoneに対してpingコマンドを実行した結果です。

これは、デバイス個々の内部システムが他のデバイスのホスト名とそのtailnet ipの対応を管理する ことで実現される一種の名前解決です。
この名前解決機能はWindowsやLinuxなどのOSに標準搭載されています。MagicDNSは、この名前解決機能をそのまま利用した機能です。
つまり、MagicDNSとは各デバイスのOSに備わる名前解決機能とtailscaleサービスを連携させた機能です。 MagicDNSはクライアント用tailscaleアプリをインストールし、そのデバイスがtailscaleサービスと連携したときに有効化されます。
MagicDNSはあくまでユーザー専用のtailnetに所属する端末に与えられた名前(初回ログイン時に付与されたホスト名)をtailnet ipに名前解決するだけですので、 通常のDNSのように外部サーバーに対する問い合わせはしませんし、そもそも外部サーバーに 対応関係を管理させることもありません。
そのため、MagicDNSでは次に示すように予め各デバイスに設定したホスト名とIPアドレスの設定を利用して名前解決を行い、 その結果として対応が取れたIPアドレス(tailnet ip)で通信を開始します。

冒頭の例で言えば、デスクトップパソコンkamo-laptop-windowsのコンソールでping kamo-phoneを実行 すると、先ずkamo-laptop-windowsのシステム内部が持つ名前解決の仕組み(※)を使用してホスト名kamo-phone とtailnet ip(例:100.10.20.20)の対応を取ります(①と②)。
その後、得られたIPアドレス(100.10.20.20)でtailnet内に通信リクエストを送信します。(③)
MagicDNSが機能することで、tailscaleを利用するユーザーは自分のデバイスのIPアドレスを覚える必要はありません。
※Windowsであれば、C:/Windows/System32/drivers/etc/hosts、Linuxであれば/etc/resolv.confと /usr/bin/tailscale にホスト名とIPアドレスの名前解決設定が存在します。基からOSに備わるこれらの仕組み(とクライアント用tailscaleアプリ)をうまく利用して実装されたものがMagicDNSです。
一般的に言われるDNSとは?
DNSとは、以下のようにユーザーのクライアント端末がWebサイトにアクセスする際、入力したURLドメインをIPアドレスに変換するための仕組み・機能を指します。

ユーザーがWebブラウザでhttps://utakamo.comと入力して アクセス(①)を試みると、DNSサーバーによって名前解決(②)が行われます。その後、utakamo.comのIPアドレスを基に、WebサーバーにHTTPリクエストが送信されます(③)。
このように、DNSとはWebサーバーのドメイン名とIPアドレスの名前解決をする際に使用される仕組みです。
tailscaleのアカウント作成
ここからはtailscaleの導入方法について紹介します。
先ず、tailscaleを利用するためには、専用アカウントを以下の公式サイトで作成する必要があります。
事前にGoogleやMicrosoftなどのアカウントを持っていると、とても簡単にtailscaleアカウントが作成できます。
アカウント作成手順は以下の通りです。
アカウント作成
最初に公式サイトのトップページにあるGet Startedをクリックします。

すると次のように、GoogleやMicrosoftアカウントによるログイン認証の選択画面が表示されます。 読者ご自身が予め利用しているであろうサービスのアカウントを以下からクリックしてtailscaleにログインしてみてください。
今回、私はGoogleアカウントでtailscaleにログインしてみました。

ログインが成功すると、次のユーザー管理画面に遷移します。 初回ログイン時はVPN接続登録をしたデバイスは存在しません。そのため、右側にWaiting for your first deviceというメッセージが表示されます。 またこの時に、左側に各デバイスのクライアント用tailscaleアプリのインストール案内も表示されます。

ということで、簡単にtailscaleにログインできました。
次節からは各デバイス(プラットフォーム)別にクライアント用tailscaleのインストールとVPN接続について紹介します。
【Windows】アプリインストールとVPN接続
クライアント用tailscaleアプリのインストール
Windowsのクライアント用tailscaleアプリは以下の公式サイトのダウンロードページから入手できます。
クリックしてアクセスすると、次の画面が表示されますのでWindowsを選択し、下部のDownload Tailscale for Windowsを押します。

クライアント用tailscaleアプリのインストーラがダウンロードされますので、ダウンロード完了後に起動します。
すると、次のダイアログが表示されます。チェックホックスにチェックを入れてinstallボタンをクリックしてインストールを開始してください。

インストール完了後はCloseボタンを押してインストーラを終了します。

以上で、tailscaleを使用する準備がすべて整いました。
次の節で、ここでインストールしたtailscaleアプリを使用してWindowsデバイスをVPN接続してみます。
VPN接続
上記の作業でクライアント用tailscaleアプリがインストールされたら、Windowsデバイスのメインウィンドウの右下に隠れているインジケーターを表示してください。 次の図のように、tailscaleのアイコンが存在するはずです。

このアイコンをクリックすると、次のログイン認証画面が表示されますので初回ログイン時と同じように既に持っている サービスのアカウントで認証します。

ログイン認証が成功するとWindowsデバイスがVPN接続待ちに移行します。ここで特に問題なければConnectボタンを押してVPN接続を実行します。

するとVPN接続が成功し、デバイス名としてWindowsのPC名(OSホスト名)がtailscaleのユーザーアカウントに紐づいたtailnetに登録されます。

そのため、上図に表示されたvisit the consoleをクリックして管理画面を見ると、VPN接続したWindowsデバイスが登録されていることが確認できます。 接続状態も見ることができ、この時の状態はConnected(VPN接続済み)になるはずです。

以上により、WindowsデバイスのVPN接続ができました。
※この記事では、この後の説明の都合のため、Windows端末のデバイス名を上に掲載した図のホスト名kamo-laptop-windowsに変更します。
ホスト名は管理画面の端末一覧右端の・・・をクリックして表示される「Edit Machine Name」で変更できます。

これでホスト名がkamo-laptop-windowsになりました。

Windowsのクライアント用tailscaleアプリのインストールとVPN接続は以上になります。
注意
VPN利用中は他のインターネット通信が上手く行かない場合があります。その場合は、tailscaleをdisconnectしてください。
接続後の設定確認
今後発生するかもしれないネットワークトラブルのために、tailscaleによって作成された仮想インタフェースや MagicDNS用のホストフィルタの設定を把握しましょう。
まず、仮想インタフェースを見てみます。
Windowsでは検索バーに「cmd」と入力してコマンドプロンプトを起動し、そのコンソール上でipconfigと入力することで システムが認識しているインタフェース(NIC)を表示できます。

tailscaleによってVPN接続をしているデバイスには上図のように、「tailscale」という名前の仮想インタフェースがあります。 そして、このtailscaleインタフェースにユーザーアカウントに紐づいたtailnet用のIPアドレスが割り振られていることが確認できます。
このIPアドレスはtailscaleの管理コンソール画面に表示されているデバイスのIPアドレス情報と同じものです。
つまり、このインタフェースはtailscaleが構築したVPN(tailnet)上のP2P通信で使用される仮想NICです。
そのため、パケットキャプチャをしてVPN上でパケットが正しく送受信されているか確認したい場合、このインタフェース名でフィルタリングして 見ると良いと思います。(とはいえ、何のパケットキャプチャソフトを使用するかによりますが。)
次に、MagicDNS用のホストフィルタ設定について見てみます。
Windowsでは、C:/Windows/System32/drivers/etc/hostsにフィルタ設定があります。 # TailscaleHostSectionStartというコメント行以降の部分です。

MagiDNSはtailnet上で各デバイスに割り当てられたIPアドレスに対してホスト名を設定する機能です。
Windowsデバイスでは、Windows内のhostsファイルの設定でIPアドレスとホスト名の対応を取っています。 つまり、MagicDNSによってtailnetの実際の名前解決として機能する部分になります。
hostsファイルの設定変更は悪用される危険性があるので、ホスト名変更を頻繁にしていると Windows Defenderなどのウィルス対策ソフトに攻撃と検知されて変更を元に戻される場合もあるようです。
tailscaleのデバイス名(ホスト名)変更をした際に変更後の名前でアクセスできない場合、このことを疑ってみてもいいかもしれません。
Coffee Break
私はよく自分のWindows PC上で、「うたカモ技術ブログ」のテスト用Webサーバーをで立ち上げて、新しい記事の表示確認を行っています。 このとき、Windowsのhostsファイルのlocalhost(127.0.0.1/24)IPに対応するホスト名をutakamo.comに設定しています。 (なので、上に掲載しているhostファイルの内容中にutakamo.comの設定が存在するわけです。)
この設定により、私のPCのWebブラウザーで「utakamo.com」と入力すると、インターネット上に配置されている本番Webサーバーではなく、テスト用Webサーバー(127.0.0.1/24)にページ要求のHTTPリクエストが送信されるようになります。
これにより、本番用Webサーバーの「うたカモ技術ブログ」と同じURLでテスト用Webサーバーにアクセスできます。
WindowsのTailscaleはこの仕組みをそのまま利用してMagicDNS機能の一部として利用しています。
hostsファイルは便利な一方で、悪意のある操作によってホストに対応するIPアドレスが書き換えられる可能性があります。 その結果、知らず知らずに攻撃者のWebサーバーにアクセスしてしまうことも考えられます。
このような事態を避けるためには、定期的なアップデートの実施やWindows Defenderなどのウイルス対策ソフトを常に利用し、セキュリティに気を配ることが重要です。
【Ubuntu(Linux)】アプリインストールとVPN接続
クライアント用tailscaleアプリのインストール
Ubuntuのtailscaleアプリのインストール方法は公式サイトにも書いてありますが、 ここでも紹介します。
はじめに、curlコマンドをインストールします。※which curlを実行してみて、既にcurlがインストールされているようであれば、 ここはスキップしてください。
kamo@kamo:~$ sudo apt-get update kamo@kamo:~$ sudo apt-get install curl
次にUbuntuのパッケージマネージャーソフトのaptが読み込むパッケージリポジトリとしてtailscaleのリポジトリを追加します。
kamo@kamo:~$ curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/focal.noarmor.gpg | sudo tee /usr/share/keyrings/tailscale-archive-keyring.gpg >/dev/null kamo@kamo:~$ curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/focal.tailscale-keyring.list | sudo tee /etc/apt/sources.list.d/tailscale.list
リポジトリ追加後、さっそくパッケージリポジトリ情報をaptに読み込ませ、tailscaleをインストールします。
kamo@kamo:~$ sudo apt-get update kamo@kamo:~$ sudo apt-get install tailscale
これでインストールできました。
VPN接続
インストールしたtailscaleを次のコマンドで起動します。
kamo@kamo:~$ sudo tailscale up To authenticate, visit: https://login.tailscale.com/a/xxxxxxxxxxx <--- Webブラウザで、ここに表示されたURLにアクセスする
すると、コンソール上にログインURLが表示されるので、そのURLに対してWebブラウザーでアクセスしてconnectボタンを押してください。

Login successfulと出ればOKです。

ログインした後に再度コンソールを見ると、Successと表示されていれば成功です。
kamo@kamo:~$ sudo tailscale up To authenticate, visit: https://login.tailscale.com/a/xxxxxxxxxxx Success.
これでUbuntu端末とtailscaleの連携ができました。最後に次のコマンド実行することでUbuntu端末をtailnetに接続し、 IPv4アドレスを取得します。
kamo@kamo:~$ tailscale ip -4 100.10.20.30 <--- tailnet ip(4)が払い出されます
tailscaleの管理画面でもUbuntu端末の情報が確認できます。

これで接続完了です。
※この記事ではこの後の説明の都合のため、Ubuntu端末のホスト名をkamo-laptop-linuxに変更しています。 ホスト名の変更は管理画面の端末一覧右端の・・・をクリックして表示される「Edit Machine Name」で変更できます。

これでホスト名がkamo-laptop-linuxになりました。

UbuntuのtailscaleインストールとVPN接続は以上になります。
接続後の設定確認
今後発生するかもしれないネットワークトラブルのために、tailscaleによって作成された仮想インタフェースや MagicDNS用のホストフィルタの設定を把握しましょう。
まず、仮想インタフェースを見てみます。
Ubuntuではterminalコンソール上でip a (またはifconfig)と入力することで システムが認識しているインタフェース(NIC)を表示できます。

tailscaleによってVPN接続をしているデバイスには上図のように、「tailscale0」という名前の仮想インタフェースがあります。 そして、このtailscaleインタフェースにユーザーアカウントに紐づいたtailnet用のIPアドレスが割り振られていることが確認できます。
次に名前解決としてtailnetに対するDNS名前解決と他デバイスのホスト名とIPアドレスの対応関係を確認してみます。
まず、ユーザーアカウントに紐づいたtailnetへのドメイン修飾設定が/etc/resolv.confに記載されています。 (赤線部分です)

これにより、通信対象のホスト名(例えばkamo-phone)を指定してping kamo-phoneを実行すると、/etc/resolv.confに searchオプション付きで記載されているtailxxxx.ts.netをドメインとして修飾し、結果的にping kamo-phone.tailxxxx.ts.netでアクセスが実行されます。

この設定により、tailxxxx.ts.netは同ファイルに記載されているIPアドレスに変換されます。
次にホスト名とIPアドレスの対応を確認します。Ubuntuでは、クライアント用tailscaleアプリ(/usr/bin/tailscale) が対応関係を管理しています。
そのため、tailscale statusを実行することでホスト名とIPアドレスの対応確認ができます。

【Android】アプリインストールとVPN接続
クライアント用tailscaleアプリのインストール
今回取り上げる中でAndroidはインストールが一番簡単です。以下のGoogle Playからインストールボタンをタップするだけです。
接続方法も簡単なのでサクサク行きます。
VPN接続
tailscaleをインストールできたら、アイコンをタップして起動します。すると、次のようにtailscaleサービスを開始するボタンGet Started
が表示されるのでこれを押します。

GoogleやMicrosoftアカウントでログインできるので読者の方が持っているであろうアカウントでログインします。 (私はGoogleアカウントを利用してログインしました。)

すると、tailscaleのダッシュボードが表示され、VPN接続をリクエストするか聞かれますので、問題なければOK
を押します。

トグルが接続済みを表すActiveに倒された状態でダッシュボードが完全に表示されたら接続成功です。すでに登録済みのデバイスがある場合、これらがリスト表示されます。

Androidのネットワーク設定を確認するとVPN接続として、確かにtailscaleが使用されていることが分かります。

Android端末のtailscale接続は以上です。
tailscale利用中の注意点
tailscale利用中は特定のWebサービスとの通信ができない可能性があります。外出中で使用していて、電子決済などが 使えなくなった場合はtailscaleをOFFにすることで改善しないか確認してみてください。
使い方その1:tailscaleを利用してSSH接続
注意
ここではtailscaleの通信確認をするために最低限の設定でSSH接続をします。 実際のSSHの運用では、安全性を確保するために認証鍵(RSA暗号など)を設定することが強く推奨されます。 例え、tailscaleが提供する安全性が高いVPN(tailnet)環境内であっても、認証鍵を使用することは重要です。
ここでは、tailnetに接続した端末同士でP2P通信をしてみます。
通信確認として、Windowsデバイスkamo-laptop-windowsからUbuntuデバイスkamo-laptop-linuxにSSH接続をしてみます。 (これらは前節までに紹介した内容でtailnetに接続したデバイスです。ホスト名は読者ご自身のものに置き換えて考えてください。)

手順は以下の通りです。
Ubuntu(SSH Server)側
まず、tailscaleを起動してUbuntuデバイスをtailnetに接続します。
kamo@kamo:~$sudo tailscale up
SSHサーバーを次のコマンドでインストールします。
kamo@kamo:~$sudo apt install open-ssh
ファイアウォールのフォワーディング設定をSSH許可とします。
kamo@kamo:~$sudo ufw allow ssh
最後に(停止していなければ)ファイアウォールを起動して、フォワーディング設定が正しくされているか確認したら完了です。
kamo@kamo:~$sudo ufw enable kamo@kamo:~$sudo ufw status Status: active To Action From -- ------ ---- 22/tcp ALLOW Anywhere 22/tcp(v6) ALLOW Anywhere (v6)
後はクライアントデバイスからSSH接続要求があるのを待ちます。
Windows(SSH Client)側
クライアントデバイスの方も先ずtailnetに接続します。Windowsであれば隠れたインジケータの中からtailscaleのアイコンをクリックします。

表示された画面で未接続状態であれば「connect」をクリックして接続します。

次にコマンドプロンプトを開き、表示されたコンソール上でssh kamo@kamo-laptop-linuxなどとして アクセスします。

これでkamo-laptop-linuxに対してSSH接続ができました。
おわりに
今回はtailscaleの導入方法と一般的な使い方について紹介しました。
tailscaleを利用すれば、遠隔地にあるデバイスとのP2P通信を安全にできることが分かっていただけたかと思います。
また、この記事ではtailscaleのクライアントアプリを各デバイスにインストールすることで機器登録とtailnetへの接続をしていました。
しかし、機器によってはtailscaleアプリをインストールできない場合があります。そこで、OpenWrtなどのルーターが tailscaleに連携することで、そのルーターが管理するローカルネットワークに所属するデバイスをtailnetに参加させる方法があります。
これにより、tailscaleのクライアントアプリをインストールすることができないデバイスでも、tailscaleによるVPNの恩恵を得ることが可能です。
これに関しては、次の記事として書きたいと思います。
参考文献
- What is a tailnet? https://tailscale.com/kb/1136/tailnet
- MagicDNS https://tailscale.com/kb/1081/magicdns
- The Sisyphean Task Of DNS Client Config on Linux https://tailscale.com/blog/sisyphean-dns-client-linux
- Subnet routers and traffic relay nodes https://tailscale.com/kb/1019/subnets
- Exit Nodes (route all traffic) https://tailscale.com/kb/1103/exit-nodes