Tailscale: 「4via6 subnet routers」用のアドレス変換ツールを作ってみた

ローカルなIPv4空間は重複する
TailscaleのSubnet routers機能は強力でかつ簡単に使えて素敵です。しかしながら、自身がマネジメントする単一のtailnetの中で、IPv4形式での、Subnet routers機能を使いたいセグメント (例: 192.168.100.0/24) やIPアドレス (例: 192.168.100.10/32) が、他のLANとの間で重複することがあるかもしれません。その場合は、“それらのネットワーク・端末をtailnet内で区別するにはどうしたらいいか”という問題が発生するはずです。
っ「4via6 subnet routers」
最近知ったのですが、Tailscaleにはちゃんと、この問題を解決可能な機能が存在しており、それは、IPv6形式の表現を使う「4via6 subnet routers」というものです。
私なりの理解でざっくり言うと、「4via6 subnet routers」では、ユーザが任意選択する「Site ID」とIPv4のIPアドレスを、連結してIPv6形式で表現することで、自身のtailnetの中でのユニークな識別子とします。したがってtailnet内で全てを区別しての通信処理が可能、というものなのでしょう。
「4via6」用のアドレス変換のツールを作った
今日初めて「4via6 subnet routers」の設定に挑戦してみたところ、意外にすんなりと動作させることができました。ただし、今後も4via6を扱っていく上で、アドレス変換ツールがあった方が便利だなと直感もしたので、さっそく作ってGitHubで公開開始。
このツールの機能の一部を、READMEから抜粋すると以下の通りです。もしよかったらどうぞお使いください。
コマンドラインインターフェース (CLI)
1. エンコード (IPv4 + Site ID から 4via6 IPv6 への変換)
IPv4アドレスとSite IDを指定して、対応する4via6 IPv6アドレスを取得します。
# プレーンテキスト出力 (デフォルト)
$ ./tailscale_4via6.py encode 1 192.168.100.10
fd7a:115c:a1e0:b1a:0:1:c0a8:640a
# JSON出力
$ ./tailscale_4via6.py -f json encode 1 192.168.100.10
{
"site_id": 1,
"ipv4": "192.168.100.10",
"ipv6": "fd7a:115c:a1e0:b1a:0:1:c0a8:640a"
}2. デコード (4via6 IPv6 から IPv4 + Site ID への変換)
4via6 IPv6アドレスを、元のSite IDとIPv4アドレスに逆変換します。
# プレーンテキスト出力 (デフォルト)
$ ./tailscale_4via6.py decode fd7a:115c:a1e0:b1a:0:1:c0a8:640a
Site ID: 1
IPv4: 192.168.100.10
# JSON出力 (省略表記のIPv6アドレスも正しく処理されます)
$ ./tailscale_4via6.py -f json decode fd7a:115c:a1e0:b1a::1:c0a8:640a
{
"site_id": 1,
"ipv4": "192.168.100.10",
"ipv6": "fd7a:115c:a1e0:b1a:0:1:c0a8:640a"
}
