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

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

ローカルな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"
}