メインコンテンツまでスキップ

Raspberry PiによるTailscaleサブネット変換手順書

192.168.101.xxx → 192.168.100.xxx への1対1 NAT構成

1. 構成の目的

この手順では、既に 192.168.100.0/24 がTailscaleのサブネットルートとして他の拠点で使用済みの場合に、別のサブネットである 192.168.101.0/24 をTailscale上に広告し、Raspberry Pi側で 192.168.101.xxx への通信を 192.168.100.xxx に変換します。

これにより、内部機器側のIPアドレスやゲートウェイ設定を変更せずに、Tailscale経由でアクセスできるようになります。

構成イメージは以下の通りです。

外部PC

Tailscale

192.168.101.150 宛にアクセス

Raspberry Piで変換

192.168.100.150 の実機へ通信

例えば、内部にあるレコーダーの実IPが以下の場合、

レコーダー実IP:192.168.100.150

外部PCからは以下のようにアクセスします。

外部PCから見えるIP:192.168.101.150

Raspberry Piが以下のように変換します。

192.168.101.150 → 192.168.100.150
192.168.101.197 → 192.168.100.197

2. 前提条件

この手順では、以下の構成を前提とします。

Raspberry Piの内部側IP:192.168.100.10
内部ネットワーク:192.168.100.0/24
Tailscaleで広告する仮想サブネット:192.168.101.0/24
内部機器例:192.168.100.150
外部からのアクセス先例:192.168.101.150

Raspberry Piは、Tailscaleに参加済みであるものとします。


3. Raspberry PiをDHCPから固定IPに変更します

まず、Raspberry Piの有線LAN接続名を確認します。

nmcli con show

多くの場合、接続名は以下のようになっています。

Wired connection 1

以下のコマンドで、Raspberry Piの内部側IPを 192.168.100.10 に固定します。

sudo nmcli con mod "Wired connection 1" \
ipv4.addresses 192.168.100.10/24 \
ipv4.gateway 192.168.100.1 \
ipv4.dns "192.168.100.1 8.8.8.8" \
ipv4.method manual

設定を反映します。

sudo nmcli con up "Wired connection 1"

確認します。

ip a

eth0 に以下のようなIPが表示されればOKです。

192.168.100.10/24

4. DHCPに戻す方法

動作確認後、Raspberry PiをDHCPに戻したい場合は、以下を実行します。

sudo nmcli con mod "Wired connection 1" ipv4.method auto
sudo nmcli con up "Wired connection 1"

これで、Raspberry Piは再びDHCPでIPアドレスを取得する状態に戻ります。

確認します。

ip a

5. IPフォワーディングを有効化します

Raspberry PiがTailscale側と内部ネットワーク側の通信を中継できるように、IPフォワーディングを有効化します。

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 /etc/sysctl.conf

設定が反映されたか確認します。

cat /proc/sys/net/ipv4/ip_forward

以下のように 1 が表示されればOKです。

1

再起動後に設定が戻る場合

上記設定で一時的に 1 になるものの、再起動後に 0 に戻ってしまう場合は、以下のように設定します。

echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
sudo sysctl -p /etc/sysctl.d/99-tailscale.conf

再度確認します。

cat /proc/sys/net/ipv4/ip_forward

1 が表示されればOKです。


6. Tailscaleで192.168.101.0/24を広告します

Raspberry Piから、Tailscaleに対して 192.168.101.0/24 のサブネットを広告します。

sudo tailscale up --advertise-routes=192.168.101.0/24 --accept-routes --snat-subnet-routes=true

ここでは、実際の内部ネットワークである 192.168.100.0/24 は広告しません。 192.168.100.0/24 は既に別のTailscaleサブネットで使用済みのため、代わりに 192.168.101.0/24 を広告します。


7. Tailscale管理画面でルートを承認します

Tailscaleの管理画面を開き、Raspberry Piが広告したサブネットルートを承認します。

手順は以下の通りです。

  1. Tailscale管理画面を開きます。
  2. 対象のRaspberry Piを探します。
  3. 右側のメニューから Edit route settings... を選択します。
  4. 192.168.101.0/24 のサブネットルートにチェックを入れます。
  5. Save を押します。

これで、外部PCから 192.168.101.xxx 宛の通信がRaspberry Piに届くようになります。


8. 101 → 100 のDNATを設定します

ここが最も重要です。

外部PCから 192.168.101.xxx に送られた通信を、Raspberry Pi上で 192.168.100.xxx に変換します。

sudo iptables -t nat -I PREROUTING 1 \
-i tailscale0 \
-d 192.168.101.0/24 \
-j NETMAP --to 192.168.100.0/24

これにより、以下のようにホスト部を維持したまま変換されます。

192.168.101.150 → 192.168.100.150
192.168.101.197 → 192.168.100.197

つまり、外部PCから 192.168.101.150 にアクセスすると、実際には内部の 192.168.100.150 に通信が届きます。


9. 戻り通信用のSNATを設定します

次に、内部機器から見た送信元をRaspberry Piの内部側IPに変換します。

sudo iptables -t nat -I POSTROUTING 1 \
-o eth0 \
-d 192.168.100.0/24 \
-j SNAT --to-source 192.168.100.10

これにより、内部機器からは次のように見えます。

192.168.100.10 から通信が来た

例えば、レコーダー 192.168.100.150 は、Raspberry Pi 192.168.100.10 からpingが来たものとして認識し、応答をRaspberry Piに返します。 その後、Raspberry PiがTailscale側へ応答を戻します。


10. FORWARDを許可します

環境によってはFORWARDが既に許可されている場合もありますが、明示的に許可しておくと安全です。

sudo iptables -I FORWARD 1 \
-i tailscale0 \
-o eth0 \
-d 192.168.100.0/24 \
-j ACCEPT
sudo iptables -I FORWARD 1 \
-i eth0 \
-o tailscale0 \
-s 192.168.100.0/24 \
-m conntrack --ctstate RELATED,ESTABLISHED \
-j ACCEPT

11. 動作確認をします

外部PCから、内部機器のIPを 192.168.101.xxx としてpingします。

例えば、内部レコーダーが 192.168.100.150 の場合、外部PCからは以下を実行します。

ping 192.168.101.150

応答が返れば成功です。

実際の通信は以下のように変換されています。

外部PC

192.168.101.150

Raspberry PiでDNAT

192.168.100.150

Raspberry Piで戻り通信を処理

外部PCへ応答

12. iptables設定を確認します

現在のNAT設定を確認します。

sudo iptables -t nat -L PREROUTING -n --line-numbers
sudo iptables -t nat -L POSTROUTING -n --line-numbers

FORWARD設定を確認します。

sudo iptables -L FORWARD -n --line-numbers

期待される内容は以下のような形です。

PREROUTING
NETMAP all -- 0.0.0.0/0 192.168.101.0/24 to:192.168.100.0/24

POSTROUTING
SNAT all -- 0.0.0.0/0 192.168.100.0/24 to:192.168.100.10

13. iptables設定を保存します

再起動後も設定を維持したい場合は、iptables-persistent を使用します。

未インストールの場合は以下を実行します。

sudo apt install iptables-persistent

インストール中に、現在のIPv4ルールとIPv6ルールを保存するか確認されます。 今回の設定を保存したい場合は、IPv4については Yes を選択します。

その後、現在の設定を保存します。

sudo netfilter-persistent save

14. 再起動後の確認

Raspberry Piを再起動します。

sudo reboot

再起動後、以下を確認します。

cat /proc/sys/net/ipv4/ip_forward

1 が表示されればOKです。

次に、iptables設定を確認します。

sudo iptables -t nat -L -n
sudo iptables -L FORWARD -n

最後に、外部PCから再度確認します。

ping 192.168.101.150

応答が返れば、再起動後も設定が維持されています。


15. DHCPに戻す場合の注意点

Raspberry Piの内部側IPをDHCPに戻す場合は、以下を実行します。

sudo nmcli con mod "Wired connection 1" ipv4.method auto
sudo nmcli con up "Wired connection 1"

ただし、今回のSNAT設定では以下のIPを明示しています。

192.168.100.10

そのため、Raspberry PiをDHCPに戻してIPが変わった場合、SNAT設定も修正が必要になります。

例えば、Raspberry PiのIPが 192.168.100.20 になった場合は、以下のようにSNAT設定を変更する必要があります。

sudo iptables -t nat -D POSTROUTING \
-o eth0 \
-d 192.168.100.0/24 \
-j SNAT --to-source 192.168.100.10
sudo iptables -t nat -I POSTROUTING 1 \
-o eth0 \
-d 192.168.100.0/24 \
-j SNAT --to-source 192.168.100.20

したがって、今回の構成を継続利用する場合は、Raspberry Piの内部側IPは 192.168.100.10 のように固定しておくのがおすすめです。


16. まとめ

この構成では、Tailscale上では 192.168.101.0/24 を広告し、Raspberry Pi側で 192.168.100.0/24 に変換します。

ポイントは以下の通りです。

Tailscaleに広告するネットワーク:192.168.101.0/24
実際の内部ネットワーク:192.168.100.0/24
変換方式:NETMAPによる1対1 DNAT
戻り通信:SNATでRaspberry Piに戻す

これにより、内部機器のIP設定を変更せずに、外部からは以下のようにアクセスできます。

192.168.101.150 → 192.168.100.150
192.168.101.197 → 192.168.100.197

既存の 192.168.100.0/24 がTailscale上で使用済みの場合でも、192.168.101.0/24 として別名でアクセスできるため、拠点間のIP重複を回避しながら運用できます。