皆さんは、外出先から家のプリンターで書類を出したり、Tailscaleをインストールできない古いNASやIoT家電にアクセスしたくなったりしたことはありませんか?
Tailscaleは非常に便利ですが、全てのデバイスにアプリを入れられるわけではありません。そんな時に役立つのが「Subnet Router」という機能です。これを使えば、自宅のサーバー1台をゲートウェイにして、LAN全体をVPNに包み込むことができます。
今回は、その構築方法から、デメリットと注意点までを詳しく解説します。この記事は自分で検証済みです
1. Subnet Router(サブネットルーター)とは?
通常、Tailscaleはアプリを入れた端末同士(Node)を1対1で繋ぐメッシュVPNです。しかし、Subnet Routerを1台立てると、そのサーバーが「橋渡し」となり、Tailscaleが入っていないデバイスに対しても、ローカルIP(192.168.x.x など)で直接アクセスできるようになります。
これにより、外出先のPCから自宅のローカルネットワークにいるかのように振る舞うことが可能になります。
2. 構築手順:3分で自宅LANをVPN化する
今回は、自宅で常時稼働しているLinuxサーバー(UbuntuやDebianなど)をSubnet Routerにする手順を紹介します。
Step 1: IPフォワーディングの有効化
Linuxがパケットを中継(ルーティング)できるようにシステム設定を変更します。
Linux システムに/etc/sysctl.dディレクトリがある場合は、次を使用します。
# IPv4とIPv6のフォワーディングを有効化
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
# (firewalld使用者の場合のみ) マスカレードを許可
sudo firewall-cmd --permanent --add-masquerade
sudo firewall-cmd --reload
それ以外の場合は、次を使用します。
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
# 設定を即時反映
sudo sysctl -p /etc/sysctl.d/99-tailscale.conf
# (firewalld使用者の場合のみ) マスカレードを許可
sudo firewall-cmd --permanent --add-masquerade
sudo firewall-cmd --reload
⚠ufwを使ってる場合上記firewall-cmdのコマンドでなく設定ファイルを弄る必要があります。
1./etc/default/ufw を編集します。
sudo nano /etc/default/ufw
2.DEFAULT_FORWARD_POLICY を ACCEPT に変更します。
DEFAULT_FORWARD_POLICY="ACCEPT"
3.マスカレードの設定のために/etc/ufw/before.rules を編集します。
sudo nano /etc/ufw/before.rules
ファイルの一番最初(先頭)に、以下の内容を貼り付けてください。
# --- Tailscale Subnet Router Start ---
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 100.64.0.0/10 -o wlan0 -j MASQUERADE
COMMIT
# --- Tailscale Subnet Router End ---
注意点: -o wlan0 の部分は、自分のマシンのインターフェース名に変えてください。ip addr で確認して、IPアドレス(192.168.1.xなど)がついているインターフェース名(eth0 や enp1s0 など)に書き換えます。
4.設定の反映
最後にUFWをリロードして有効化します。
sudo ufw reload
Step 2: Subnet Routerとして起動
自宅のサブネット(例:192.168.1.0/24)をTailscaleネットワークに広報(advertise)します。自身の環境に合わせてIPアドレス帯を変更してください。
# 例: 192.168.1.0/24 のネットワークを公開する場合
sudo tailscale up --advertise-routes=192.168.1.0/24
Step 3: 管理画面でルートを承認
TailscaleのAdmin Consoleを開きます。
該当マシンの横にあるメニュー(三点リーダー)から [Edit route settings] を選択し、先ほどアドバタイズしたサブネットのチェックボックスをオンにして保存すれば完了です。
これで、外出先から 192.168.1.x などのローカルIPへのアクセスが可能になります。
Step 4: クライアント側の設定(Linuxのみ必要)
Windows、macOS、iOS、Androidは自動でルートを認識しますが、Linuxクライアントからそのサブネットへアクセスしたい場合は、以下のコマンドが必要です。
sudo tailscale set --accept-routes
WindowsやiPhoneなどは、Tailscaleに繋がると「新しい道(サブネットルート)ができたよ!」という通知をそのまま受け入れ、自動的に自分の地図(ルーティングテーブル)に書き込みます。
しかし、Linux(特にサーバー用途)は、「知らないやつが勝手に俺のルーティングテーブルを書き換えるな」というスタンスがデフォルトです。そのため、「Tailscaleが持ってきた道案内を信じていいよ」と明示的に許可を出す必要があるのです。
⚠注意点
1.IPアドレスの競合
「サブネット側」と「今いる場所(クライアント側)」のIPアドレス範囲が被ると、通信が非常に不安定になるか、失敗します。
対処法A
- 避けるべき(よくある)設定:
→192.168.0.0/24
→192.168.1.0/24
→192.168.11.0/24(バッファロー製ルーターなどのデフォルト) - おすすめの設定:
→192.168.123.0/24や172.16.50.0/24など、他人があまり使わなさそうな数字をランダムに選ぶ。
対処法B
Tailscaleの「4via6」機能を使う(高度な方法)
「どうしてもサブネット側のIPを変えられない!」という場合、Tailscaleには 4via6 という機能があります。これは、IPv4のサブネットにIPv6の特殊な住所を割り当てて、IPの重複を無視して通信できるようにする技術です。
対処法C
例えば「スタバのWi-Fiと自宅のIPが被った!」という場合は、iPhoneのテザリングに切り替えるだけで、クライアント側のIPアドレス帯域が変わるため、一時的に回避できます。
確認(クライアント側)
Step 1: Tailscaleの状態を確認する
まず、Tailscale自体がサブネットルーターを認識しているか確認します。
tailscale status
リストの中にサブネットルーター(サーバー)が表示され、その横にアドバタイズしたルート(例: 192.168.1.0/24)が表示されていればOKです。
Step 2: ルートが届いているか確認する
まず、Tailscale自体がサブネットルーターを認識しているか確認します。
ip route | grep tailscale
-
期待する結果:
192.168.1.0/24 dev tailscale0のような行が表示されること。 -
表示されない場合: クライアント側で
sudo tailscale set --accept-routesを実行したか、管理画面でルートを承認したか確認してください。
Step 3: 疎通確認(Ping)
サブネット内にある具体的な機器(ルーターや他のサーバーなど)のローカルIPに対して通信を試みます。
ping -c 4 192.168.100.1
-
期待する結果: 応答(
64 bytes from...)が返ってくること。 -
表示されない場合: サブネットルーター(サーバー側)で「IP転送(IP Forwarding)」の設定が反映されているか、
sudo sysctl -pを忘れていないか確認してください。
Step 4: 経路の確認(Traceroute)
パケットが本当にTailscaleのインターフェースを通って、サブネットルーターを経由しているか可視化します。
traceroute 192.168.1.1
- 最初の1歩目が TailscaleのIP(100.x.y.z) であれば、正しくサブネットルーターへ飛んでいます。
- もし1歩目が自宅のWi-Fiルーター(192.168.1.1など)になっている場合は、IPアドレスが競合してローカルにパケットが流れてしまっています。
Step 5: 名前解決の確認(必要な場合)
もしIPアドレスではなくホスト名でアクセスしたい場合は、TailscaleのMagicDNSが効いているか確認します。
tailscale ping [デバイス名]
- このコマンドはTailscale独自のpingで、ネットワーク内の経路が「直接接続(direct)」か「リレー経由(DERP)」かも教えてくれるので、トラブルシューティングに非常に便利です。
Step 6: マスカレードが動いているか?(UFWを使用している人のみ)
sudo iptables -t nat -L POSTROUTING -n -v
出力の中に MASQUERADE という文字があり、100.64.0.0/10 という範囲が含まれていれば成功です。
Step 7: パケット転送が許可されているか?(UFWを使用している人のみ)
sudo ufw status verbose
Default: ... forward (built-in)の部分がallow または ACCEPT になっていればOKです。
3. セキュリティ的なデメリット:LANが「丸裸」になるリスク
ここで少し、セキュリティの視点から注意点を挙げます。Subnet Routerは便利な反面、大きなリスクも伴います。
ラテラル・ムーブメント(横展開)の起点に
VPN経由でLAN内部に直接「土管」を突き刺す行為に等しい状態になります。もしVPNに参加しているスマホやPCが1台でもマルウェアに感染し乗っ取られたら、攻撃者はSubnet Routerを経由して、無防備なプリンターや脆弱なIoT機器へ自由にアクセス(横展開)できてしまいます。
「境界防御」の無力化
本来、家庭用ルーターやファイアウォールで守られていたはずの「内側」が、VPN経由で外部と直結します。「LAN内だから安全」というこれまでの信頼の連鎖が崩れるリスクを意識する必要があります。
4. 通信の方向性:基本は「外から内」への一方通行
「LAN全体をVPN化したら、家の中の全デバイスからVPN端末が丸見えになってしまうのでは?」と心配になるかもしれませんが、実はデフォルトでは「VPN側 → LAN内デバイス」という一方向(が起点となる通信)として振る舞います。
なぜ双方向にならないのか?
LAN内のデバイス(プリンターやテレビ等)は、TailscaleのIP帯(100.x.x.x)への帰り道(静的ルート)を知りません。LAN内デバイスが自主的にVPN側にパケットを送ろうとしても、通常のデフォルトゲートウェイ(家庭用ルーター)へ送られ、そのまま破棄されるためです。
応答は戻る
もちろん、TCP/IPの仕組み上、VPN側から開始したリクエストに対する「返事(戻りパケット)」は、Subnet Routerがよしなに処理(SNAT/マスカレード)してくれるため、きちんと通信が成立します。
5. 安全に運用するための対策
セキュリティの観点から強くおすすめする対策は、**Tailscale ACL(アクセス制御リスト)**の活用です。
「誰がどのデバイスにアクセスできるか」を厳格に制限しましょう。例えば、特定のユーザーだけがプリンター(192.168.1.50)の特定ポートにアクセスできるように制限をかけるのが正解です。
Tailscale ACLの記述例:
{
"acls": [
// alice@example.com だけが、自宅プリンターのHTTP/HTTPSにアクセスできる
{
"action": "accept",
"src": ["alice@example.com"],
"dst": ["192.168.1.50:80", "192.168.1.50:443"]
}
]
}
デフォルトの全許可設定 {"action": "accept", "src": ["*"], "dst": ["*:*"]} のまま運用するのは避け、ゼロトラストの考え方に基づき、必要な通信のみをピンポイントで許可しましょう。
まとめ
Subnet Routerを使えば、家の外からでもまるでリビングにいるかのようにネットワークを操れます。しかし、便利な道具には必ずリスクが伴います。
「繋がるからOK」で終わらせず、ACLなどを駆使して最小権限の原則(Principle of Least Privilege)で運用するのが、エンジニアとしての第一歩です。安全で快適なVPNライフを構築しましょう!
