実現したいこと(要件)
- 実家と自宅間の異なるサブネットを接続し、相互ルーティングする
- IPSecなどすべてを自前設定するとセキュリティリスクや不安定性などの問題を生じる可能性が高いのでできる限りコマンドを叩くくらいの労力で作る(面倒くさいことはやりたくない)
余談:なぜそんなことをするのか
Cisco IP Phoneを大量入手したので実家と自宅の直通内線を構築したかった
拠点間VPNって面倒くさくて金がかかるイメージがあるので金のかからない簡単な構築法の知識がほしかった
設計
- ネットワークアドレスは既存のまま変更しない
- 既に利用しているTailscaleのExit Node用のミニPC(Ubuntu24.04)をGWとして利用する(以下MiniPC-GWと表記)
- 最上位ルーターのルーティングテーブルに相手先NWアドレスとNexthopとしてMiniPC-GWのIPアドレスを指定
トポロジーを書き起こすと以下の通り
※PBXは省略しています
例えば、Phone1からPhone2に発信する場合には、Phone1からPBXに問い合わせPhone2のIPアドレスを把握した後、一旦デフォルトGW(ここではRT1)にパケットを送信。このとき宛先IPアドレスはPhone2になっている。
RT1はルーティングテーブルに従い、MiniPC-GW1へ当該パケットを送信。
MiniPC-GW1はTailscaleによって自動で作成されるルーティングテーブルに従い、MiniPC-GW2へ送信
MiniPC-GW2は同様にPhone2へ送信するという流れ。
Config投入(ルータ)
使用する機器によって設定方法は千差万別なので、一例を紹介。
GUIタイプなら
「IPv4静的ルーティング」的な設定があるので、そこのエントリに
192.168.0.0/24側RT
宛先:100.64.0.0/10、10.10.0.0./16の2つの宛先、Nexthop:MiniPC-GW1のIPアドレス
10.10.0.0./16側RT
宛先:100.64.0.0/10、192.168.0.0/24の2つの宛先、Nexthop:MiniPC-GW2のIPアドレス
とする。
これで、拠点間VPNの構築が完了
IP Phoneに限らず、PCからのPingを始め、ありとあらゆるパケットを送受信できるようになる。
特定のパケット・宛先を拒否したければ、ACLなどを使ってください。
引っかかったこと
1. Tailscaleのadvertise subnet routeの設定を入れ忘れた
MiniPC-GWのTailscale起動コマンドを
$ sudo tailscale up --accept-routes --advertise-routes=10.10.0.0/16 --snat-subnet-routes=false
として起動した後、TailscaleのコンソールでSubnet routesを有効化(許可)する必要がある。
既にExitNode・Subnet Routesを利用していたものの、諸事情で別アドレスに変更し、再有効化を失念。疎通できなかった。30分くらいWireSharkとにらめっこしていた。アホ。
※詳しくは参考文献を参照。
ちなみに、このコマンドに、
--advertise-exit-node
を追加すると、当該MiniPCをTailscaleのExit Nodeとして使うことができる。
要はフリーWi-Fiの盗聴防止用VPNや、大学のフィルタリング回避用VPN、LAN側ファイルサーバアクセス用VPN・・・として使える。
また、
--snat-subnet-routes=false
をtrueにすると、NATが有効になり、発信側のIPアドレスがMiniPCのものにすり替わる。
ありとあらゆるシステムが疎通不可能になるので、falseでいいと思う。
2.ルーティングテーブルに100.64.0.0/10を入れ忘れた
この謎のアドレス。実は、Tailscaleで使用されるサブネット。(規格的には通信キャリアで使用されているらしい)
Tailscaleでトンネリングされたパケットはこのネットワークの宛先へ飛んで行くのでこのサブネットをルーティングしてあげないと疎通できない。
参考文献・便利リンク