Think threshold

中の人のIYHにいたる顛末と購入レビュー。ときどき自宅システム構築備忘録。

Android12以降のリモートVPNを簡単になんとかする。(tailscaleを使ってみた)

 

Androidのバージョン12(S)以降でL2TP/IPSecVPNが作成できなくなりました。

Androidとしての標準サポートはIKEv2のみになるようで、これまでL2TP/IPSecを使っていたmakoroさんとしては移行が必要な状況に。

Android11以前からアップデートしたPixel3XLであれば従来のプロファイルが利用できるのは利用できるのですが、今回はより簡単にフルメッシュVPNも張ることのできるサービスであるTailscaleを使ってみました。

 

 

●Android12でIKEv2のみの対応になる

Android12からVPNの新規作成項目にPPTPL2TP/IPSecの選択肢がなくなり、IKEv2のみとなったようです。

ja.softether.org

最初はバグなのかもと思いましたが、Android13でも変更されていないところを見るとバグではなく仕様のようですね。

 

これまでRTX830のL2TP/IPSecを使ってきた身としては、割と面倒くさい。

(本題とは関係ないですが、RTX1200シリーズも安くなったなぁ・・・)

 

●RTXでIKEv2やってもいいのですが、CLIでめんどくさいのと面白くないので・・・

www.rtpro.yamaha.co.jp

RTXシリーズはSOHOに入れることが多いこともあり、このあたりのドキュメントやコマンドリファレンスがとても充実している(ログインが不要な状態で閲覧できる)のがとてもお気に入りです。こんなことをやりたい、がすぐ調べられる。

エンタープライズになるとだいたい海外製の機器を使うことになるわけですが、基本アカウントが必要だったり保守契約がないと閲覧できなかったりするところに核心が書いてあることが多いので、このあたりはホームユースで使うならRTXはとてもありがたいですね。おかげで3世代続けてRTXです。(RT57i→RTX1000→RTX830)

自宅に10GbpsのWANを引くことになったら、おそらく10Gbps対応のRTXを買うと思います。それくらいお気に入り。

 

RTX830は2023年頭に出たファームウェアでIKEv2に対応しているのですが、設定がCLIのみになるのと、このままRTXでやっても面白くないなぁ・・・という謎に天邪鬼なところが出てしまったのと、会社のGeekな同僚に教えてもらったがTailscaleというサービスがとてもナイスだということでこちらを試しに使ってみることに。

 

internet.watch.impress.co.jp

 

かなり簡単にE2E/リモートアクセスのVPNが構築できるサービスのようで、こちらを使ってみることにします。

 

tailscale.com

アカウントはよく使われるIdPをサポートしているので、登録自体も楽です。

私はGoogleアカウントを使って登録。

 

Linux VMを立てて自宅側のtailscaleノードをインストールしていく

今回はE2EのVPNではなく、宅内リソースにスマホからアクセスしたいので

出先はスマホ、自宅側はLinuxVMを立てて自宅側をExit Nodeなるものに設定していきます。

 

・Exit Nodeとは何ぞや?

tailscale.com

上記のもある通り、Exit nodeをtailscale上に設定することにより、自身のアカウントに接続するtailscaleデバイストラフィックをすべてExit Node経由で通信させることが可能です。

我が家の環境は宅内DNS/Domainがある環境なので、すべてのトラフィックがExit Nodeを通す方が都合が良いため、こちらのノードを作成します。

 

 

VMでExit Nodeを立てる

宅内で動作しているESXi上にUbuntuを立ち上げ、そこにTailscaleをインストールしていきます。

tailscale.com

手順は上記の通りに行います。

 

makoro@tailscale-ubuntu:~$sudo apt-get install tailscale
Reading package lists... 0%Reading package lists... 100%Reading package lists... Done
Building dependency tree... 0%Building dependency tree... 0%Building dependency tree... 50%Building dependency tree... 50%Building dependency tree... Done
Reading state information... 0% Reading state information... 0%Reading state information... Done
The following packages were automatically installed and are no longer required:
  libflashrom1 libftdi1-2
Use 'sudo apt autoremove' to remove them.
The following additional packages will be installed:
  tailscale-archive-keyring
The following NEW packages will be installed:
  tailscale tailscale-archive-keyring
0 upgraded, 2 newly installed, 0 to remove and 2 not upgraded.
Need to get 23.4 MB of archives.
After this operation, 43.4 MB of additional disk space will be used.
Do you want to continue? [Y/n] y
0% [Working]0% [Waiting for headers]                        
Get:1 https://pkgs.tailscale.com/stable/ubuntu focal/main amd64 tailscale amd64 1.40.0 [23.4 MB]
Get:2 https://pkgs.tailscale.com/stable/ubuntu focal/main all tailscale-archive-keyring all 1.35.181 [3,082 B]
 
(中略)
 
No services need to be restarted.
 
No containers need to be restarted.
 
No user sessions are running outdated binaries.
 
No VM guests are running outdated hypervisor (qemu) binaries on this host.
makoro@tailscale-ubuntu:~$ sudo tailscale up
 
To authenticate, visit:
 
 
Success.

 

「sudo tailscale up」コマンド実行後に表示されるURLに手元PCのブラウザでアクセスし、認証が完了するとSuccessが表示されます。

 

Success表示を確認後、tailscaleの管理コーンソール上でデバイスが登録できていることを確認します。

 

 

 

登録が完了したら、Exit Nodeとして使用するためIP Forwardingを有効化します

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

設定後、念のため再起動しておきました。

 

その後、Exit nodeでTailscaleネットワーク側にアドバタイズする宅内ネットワークのサブネットを設定します。

makoro@tailscale-ubuntu:/etc$ sudo tailscale up --advertise-routes=192.168.10.0/24 --advertise-exit-node

 

以下を参考に設定。

tailscale.com

tailscale.com

 

設定後、管理コンソール上からログインクレデンシャルの更新無効化(永続ログイン)の設定とExit Nodeを有効化します。

「Disable Key expirely」をクリックすることでログインクレデンシャルの更新が不要になります。自宅のtailscaleノードは常時稼働しておきたいので、設定しておきます。

(有効化に戻したい場合は「Enable key expirely」をクリックすると再度有効化出来ます)

 

続いてtailscale nodeの設定メニューから「Edit Route Settings」を選択し、

アドバタイズするサブネットとExit Nodeを有効化して完了です。

 

DNS関連の設定

我が家は自宅に宅内ドメインが構築されているため、自宅用のDNSゾーン転送を行わなければいけません。

自宅を経由して外部にアクセスしたいだけなら特に不要な設定ですが、宅内リソースにアクセスしたいのであれば必須の設定です。

 

Tailscaleの管理コンソールから「DNS」メニューを開き、

 

Nameserversセクションの「Add nameservers」から「Custom」を選択します。

 

その後表示されるカスタムDNSサーバの追加ウインドウで「Restrict to domain(Split DNS)」オプションを有効化し、ドメイン名および宅内DNSサーバを設定します。

 

 

スマホやPCからテストしてみる

スマホからテスト

play.google.com

Tailscale

Tailscale

  • Tailscale Inc.
  • ユーティリティ
  • 無料

apps.apple.com

AndroidにもiOSアプリがあるので、そちらを利用します。

画像はAndroid版ですが、おそらく手順は同じようなものだと思います。

 

左上にあるスライドスイッチからTalscale接続を有効化し、メニューにある「Use Exit node」をクリックします。

 

「Allow LAN Access」にチェックを入れ、先程Exit Nodeに設定したtailscaleノードを選択します。

 

設定後にスマホから宅内NWに対してアクセスして宅内リソースにアクセスできることを確認します。

宅内ドメインが正常に名前解決できることも併せて確認。

(ドメイン解決画面のほうはWiFi接続となっていますが、これはモバイルルータ経由で接続しているためです)

 

・PCからテスト

設定方法はスマホと一緒です。

 

こちらもスマホテザリング経由で自宅のドメインが解決できることを確認。

 

なおWindowsのTailscaleクライアントは起動時に自動で起動するようになっているので、必要時以外は起動しないようにスタートアップを無効にする運用が良いかと思います。

 

●使ってみた感想

非常に簡単にE2EのVPNを張ることが出来るので良いですね。

スマホ側もアプリ経由でVPNをさくっと起動できるので、後述のシェア機能を使えば、知人に一時的に自宅へアクセスさせる、みたいなことをとても簡単に行う行うことができます。

自宅用のexit nodeのVMもリソースはかなり小さいので、VMでもいいですしRaspberry PiなんかのSBCでもよさそうです。自宅の仮想基盤のリソースが苦しくなったら余ってるNanoPi Neoとかにさせてみようかしら。

 

注意点としては、まれにAndroidテザリングと自宅NWが重複してしまう場合があり、その場合はテザリング配下では正常に通信できません。

テザリング元のAndroidは再起動するとサブネットが変わるような挙動だったので、テザリング経由でNWの重複が発生した場合はテザリング元を再起動すると良いかも。

 

●おまけ:tailscaleの機能拡張でExit Nodeを他のtailscaleユーザと共有できるようになりました

tailscale.com

 

Tailscaleにはアカウント共有機能があり、共有したい相手にinviteコードを送ることが可能です。

 

「invite Users」からリンクを生成することができるので、VPN接続を共有したいtailscaleユーザに共有リンクを通知すればOKです。

 

リンクをクリックした参加側ユーザは「Join tailnet」をクリックすることで参加できます。

 

ユーザが参加するとUsersページに参加相手が表示されます。

 

 

 

参加したユーザに対してノードを共有したい場合、Machinesページにあるtailnetノードから共有したいノードのメニューにある「Share」→「Generate & Copy invite link」からノードを共有するためのURLが発行できます。

 

発行したノード共有用URLに共有相手がアクセスすることで上記のような画面が表示されます。

ここで「Accept invite」をクリックすると自身の管理コンソールに共有されたノードが表示されます。(「Shared in」と表示されたノードがそれです)

 

 

実際の見え方はこんな感じ。

 

 

今回はexit nodeを共有したので、あとの使い方は自分で使うのと一緒です。

一時的に宅内のファイルサーバなんかを使わせたい場合なんかは重宝しそうですね。