LAN内で、Tailscaleをインストールしていないほかのデバイスにもアクセスするには、Tailscaleのサブネットルータ機能が利用出来ます。これはLXDで沢山のコンテナを立ててテストしたい時にも有効です。
ここではTailscaleを利用して、複数のLXDコンテナへ外部からアクセスする方法を紹介します。
前提条件
- Tailscaleアカウントを持っていること
- コンテナ内にTailscaleが既にインストール済みであること
- ホスト側でLXDコマンドが実行できること
コンテナにTUN設定を追加
まず、1つのLXDコンテナ内にTailscaleをインストールします。さらにTUNデバイスが必要となるので、一旦コンテナを終了したあと、ホスト側でコンテナに対して次のコマンドを実行します。
# TUNデバイスをdeviceとして追加
lxc config device add コンテナ名 tun unix-char path=/dev/net/tun
# mount.entryをraw.lxcで追加
lxc config set コンテナ名 raw.lxc "lxc.mount.entry = /dev/net/tun dev/net/tun none bind,create=file"
LXD-UIで見るとこんな感じですね。

コンテナ内でTailscaleをサブネットルータとして起動
設定後、コンテナを再起動してから、まずはIPフォワーディングを有効化します。ちなみにLXD内ではsudoは不要ですが、色々な環境を想定して。
echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.conf
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
続いて、サブネットルータの設定を行います。
# LXDのコンテナネットワーク帯域を確認
ip route
# サブネットルータとして動作することを依頼(例:LXDのブリッジが10.80.23.0/24の場合)
sudo tailscale up --accept-routes --advertise-routes=10.80.23.0/24
既存設定がある場合はエラーになることがあります。その場合は–resetを追加して実施します。sudo tailscale up --accept-routes --advertise-routes=10.80.23.0/24 --reset
Tailscale管理画面でルートを承認
Tailscaleの管理画面(admin.tailscale.com/machines )を開きます。対象のマシンに「Subnets」アイコンが表示されているはずです。

そのマシン名をクリックして、Subnets項目で「Edit」を押して、依頼されているサブネット(今回の例では10.80.23.0/24 )を承認(チェックをつけて)保存します。

これで完了です。ほかのTailnetクライアントからping(ping 10.80.23.xxなど)して、通じているか確認してみましょう。
UDP GRO設定(パフォーマンス改善)
UDPのパフォーマンスを改善する設定を施しておきましょう。コンテナ内で以下のコマンドを実行します。
sudo apt install ethtool
sudo ethtool -K eth0 rx-udp-gro-forwarding on rx-gro-list off
この設定は再起動すると消えてしまうので、/etc/networkd-dispatcher/routable.d/ にスクリプトを置いて永続化します。
sudo tee /etc/networkd-dispatcher/routable.d/50-tailscale << 'EOF'
#!/bin/sh
ethtool -K eth0 rx-udp-gro-forwarding on rx-gro-list off
EOF
sudo chmod +x /etc/networkd-dispatcher/routable.d/50-tailscale


