はじめに
先日、新居に引っ越しました。以前の家ではVPNサーバ(WireGuard)を構築し、外からポートを開け、ポートフォワーディングをすることで、家の外からセキュアな接続を実現していました。
しかし、新居ではマンション敷設の無料のインターネットを使っています。壁の中に終端機器が埋め込まれていて自分ではいじれません。ポートを開けないし、フォワードもできないし、固定IPも振れない、つまりはVPNサーバが建てられないという課題がありました。
Tailscaleによる解決案
TailscaleはP2P技術を核とした「メッシュVPN」サービスです。従来のVPNのような複雑な設定(ポート開放や固定IPの取得など)が一切不要で、アプリをインストールしてログインするだけで、外出先から自宅のPCやNAS、クラウド上のサーバーに安全にアクセスできるようになります。
まさに、今抱えている問題を突破できる素晴らしい技術です。
Tailscaleで実現する環境
始めは、母艦(Proxmox)にのみTailscaleをインストールし、ノートパソコンからのアクセスを考えていました。しかし、すべてのVMにTailnetを入れることで、あらゆる制約を無視したVALNが1つできるとことに気が付きます。これが、この技術の革新の1つではないかと考え、これを実現してみることにしました。
Tailscaleは下記の通り各物理機器およびVMにインストールしました。

Tailscaleで各デバイスに割り当てられるIPアドレスは、100.64.0.0/10(100.64.0.0~100.127.255.255)の範囲内から自動的に割り当てられます。これはキャリアグレードNAT用として予約されたIPアドレス空間であり、デバイスの場所に関わらず、Tailscaleネットワーク内(Tailnet)で固定の安定したIPとして使用されます。

このTailnetを論理的に表現すると以下のようになります。

しかしこれだけでは、P2P接続ができる環境でしかありません。
元々は自宅の環境に外からアクセスをすることを目的としていたので、VPN接続中は接続先のVMからインターネットに抜けたいです。
Exit Nodeについて
Tailscaleには、「Exit Node」を設定することができます。Tailscaleの「Exit Node」は、端末のすべてのインターネット通信を、指定した別のTailscale端末(自宅PCやサーバーなど)を経由させてから送信することができる機能です。図の中にGatewayと書いてあるVMがあります。今回はこれ使って、出口を作成します。

家の外からVPNで自宅のLaboのVMにP2Pで接続し、そこから家のGW経由でインターネットに抜けることができる、よくあるセキュアな構成をとることができるようになります。
1点注意したいのが、クライアント端末からExit Nodeにアクセスする分には問題ないですが、サーバからExit Nodeの設定したGWを経由させたい場合です。Tailscaleは「1つが死んだら自動で別のExit Nodeに切り替わる」というオートフェイルオーバー機能がありません。そのため手動で切り替えが必要になります。つまり、Exit Nodeをデフォルトゲートウェイのように使用することは、あまり想定された使い方ではないようです。(公式ドキュメントではSubnet Routerや直接のP2P通信を推奨しています)
Tailscaleの導入
Tailscaleインストール
インストールは非常に簡単です。Linuxであっても時に困ることはありませんでしたので割愛します。
1.公式サイトにアクセスし、アカウントを作成してください(無料です)
2.公式HPを参照しながらダウンロードとインストールをしてください
3.インストールが完了したら、管理コンソールにアクセスしてください
https://login.tailscale.com/admin/machines

Exit Nodeの導入
※この VM を tailnet に参加している前提です
| タイトル | 内容 |
|---|---|
| ホスト名 | uni-gw |
| Tailscale IPv4 | 100.116.148.59 |
| OS | Ubuntu 24.04 |
exit node は他のノードから受け取ったトラフィックを外部ネットワークへ転送するため、IP forwarding が必須です。IPv4/Ipv6の転送を有効化する設定を追加し、再起動後も設定が残るように /etc/sysctl.d配下へ保存するします。
printf 'net.ipv4.ip_forward = 1\nnet.ipv6.conf.all.forwarding = 1\n' | sudo tee /etc/sysctl.d/99-tailscale-exit-node.conf >/dev/null
設定を反映します。
sudo sysctl -p /etc/sysctl.d/99-tailscale-exit-node.conf
このVM を exit node として広報します。
sudo tailscale set --advertise-exit-node
設定完了後、管理コンソールにアクセスします。
Exitnodeで設定したVMの3点リーダからExitroutesettingsを選択します。

設定後、今度は接続元のクライアント(WindwosノートPC)から設定画面を開き、クライアント側(ノートPC)のTailscaleアプリ設定で、「Exit node」をドロップダウンから選択し、「uni-gw」を選択します。

以上で設定は完了です。
Exitnode側で以下を実行し、ノートPC側で適当なWEBサイトを観覧すると、ログの流れが確認できれば接続できている証拠です。
sudo tcpdump -ni ens18 -l -A 'udp port 53 or tcp port 53'
他に出来ること
日常的に使うのであれば、AdGuardDNSなどをExitnodeにいれると利便性が高くなります。
下記を参考に実行しました。
※Tailscaleの管理画面でDNSを追加した後、Override Local DNSをONにしてください。
※待ち受けインターフェースは、TailscaleのIPで問題ないです。
最後に
今更感ある内容になってしまいましたが、脳みそがアップデートとされていない私には新鮮でした。次は、Tailscale on k8sというのに興味が出たので、これを試してみたいと思います。
