この投稿は、知ってほしい技術 Advent Calendar 2022の6日目の記事です。
WireGuardは、いわゆる「メッシュ型」VPNと呼ばれるもので、Linuxカーネル内のモジュールとして提供されていますが、WindowsやmacOSでも使うことができます。
従来型のVPNでは、すべての利用者がひとつのVPNサーバーに一度接続して、VPNサーバーの先にあるプライベートネットワークにつながることを想定しています。

従来型のVPNは、「境界防御」とよばれるネットワークセキュリティを前提としています。
一方、メッシュ型のVPNでは、個々のコンピュータごとにピアトゥピアでネットワークを張ります。

Wireguardでは必ずコンピュータ同士を公開鍵暗号で認証しあい、認証が成功してはじめてピアを成立させる仕組みになっています。ピアが成立したコンピュータ同士ではグローバルなインターネットから切り離されたIPネットワークを作ることができ、そこにSSH通信など守るべき重要な通信を移行できます。
実際、筆者が管理しているサーバーの一部では、WireGuardを使ってプライベートネットワークを構築し、そのプライベートネットワーク上のSSHしか待受しないようにファイアウォールを設定していますので、インターネットからSSHポートを探そうと思っても、そもそも22/tcpが開いていない、というふうになっています。以下はMastodon.Tokyoのホストに対してnmapをかけてみた結果ですが、22/tcpやその他SSHっぽいポートが開いていないことが分かります。しかし、実際にはWireGuardで張ったVPN経由でSSHログインは可能です。
h12o@******** ~ % nmap mastodon.tokyo
Starting Nmap 7.93 ( https://nmap.org ) at 2022-12-** **:** JST
Nmap scan report for mastodon.tokyo (172.105.195.43)
Host is up (0.029s latency).
Other addresses for mastodon.tokyo (not scanned): 2400:8902::f03c:92ff:feff:7345
rDNS record for 172.105.195.43: ubuntu-7345.1f5fc.net
Not shown: 997 filtered tcp ports (no-response)
PORT STATE SERVICE
25/tcp open smtp
80/tcp open http
443/tcp open https
Nmap done: 1 IP address (1 host up) scanned in 42.58 seconds
ただし、WireGuardは、ホストとピアごとに設定を自分で書いていかなければならない難点があります。
[Interface]
PrivateKey = ********************************************
ListenPort = 51820
Address = 10.***.***.***/32, fd**:****:****:****:****:****:****:****/128
[Peer]
PublicKey = ********************************************
AllowedIPs = 10.***.***.***/32, fd**:****:****:****:****:****:****:****/128
Endpoint = ubuntu-7345.1f5fc.net:51820
PersistentKeepalive = 30
Tailscaleは、そのWireGuardの設定を集約して自動化するSaaSサービスです。
Googleアカウント・Microsoftアカウント・Githubアカウントがあれば、Tailscaleアカウントを作ることができます。そして、ひとりだけで運用するのであれば無料枠で使えるというものです。
すなわち、先に書いたようなホストの秘密鍵とネットワークの設定、ピアごとの公開鍵の交換とネットワークの制御が不要、ということになります。そして、リスクベースの認証(不審な通信に対してはTailscaleアカウントによる再認証をかける)も実装されています。この機能は、Tailscaleネットワーク中にマルウェアに感染してしまったホストがいたとしても、不審な通信を見分けて弾くことができるということを意味しています。つまり、自分のアカウントを守ることができれば、ネットワークのセキュリティを守ることもできてしまいます。ここまでくるともはや、個人で導入できる非常に安価なゼロトラスト・ネットワーク、とすら言えます。
なお、先に「筆者が管理しているサーバーの一部では、WireGuardを使ってプライベートネットワークを構築し」と書きましたが、残りのネットワークはどうしているかというと、Tailscaleで同じことをしています。
WireGuardは一度ピアを張ってしまうとリスクベース認証をする仕組みがないので(それでも、自分のシェルアカウントやSSH鍵ペアを守ることができればSSHログインによる横展開(ラテラル・ムーブメント)は防げます)、Tailscaleのように「ゼロトラスト」とまでは呼べません。そこで、「Tailscaleを使えるようならTailscale、難しければWireGuard」というふうに、私は考えています。
ちなみに、Mastodon.TokyoでTailscaleを使わないのは、Mastodon Server Covenant準拠と関係があります。Mastodon Server Covenantでは、最低もうひとりが緊急時にシェルアクセスができる体制を作ることが定められています。TailscaleでMastodon Server Covenant準拠を達成しようとするとその分の費用がかかってしまうので私の負担が増えてしまいます。