🍓

Raspberry Pi で Tailscale VPN を動かすまでの覚書

2024/06/09に公開

背景

自宅のネットワークに外部からアクセスしたくなったので VPN サーバーを立てることにしました。と言ってもしっかりしたものが欲しいわけではなく「出張中に自宅に置いてある PC に RDP で簡単な作業をしたい」というくらいのカジュアルな用途なので、そこそこ安価に済ませたいです。

ということで、Tailscale というイマドキな VPN サービスと Raspberry Pi で作ってみました。今回は俺的チートシートとしてのメモを残します。

https://tailscale.com/

Raspberry Pi のセットアップ手順

1. SD カードに OS イメージを焼く

Raspberry Pi Imager で SD カードに OS イメージを焼きましょう。このとき Wi-Fi や SSH を事前に有効にしておくと非常に楽です。
https://www.raspberrypi.com/software/

焼きあがった SD カードを Raspberry Pi に刺して電源を入れましょう。

2. Tailscale をセットアップ

Tailscale のアカウントは事前に作っておきましょう。Raspberry Pi に直接 HDMI ケーブルでモニタに繋いで Terminal 操作をするか、SSH で接続するなどして下記のコマンドを打ち込みます。

# インストール
curl -fsSL https://tailscale.com/install.sh | sh

# IP の転送を許可
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

# 起動
sudo tailscale up

もし Subnet routers や Exit nodes を有効にしたい場合は tailscale up の際にオプションを追加します。Subnet として公開したい IP Address 帯は適宜読み替えてください。

sudo tailscale up --advertise-routes=192.168.1.0/24 --advertise-exit-node

Tailscale はサービスとして登録されるので、再起動後も自動的に起動してきます。

3. Wi-Fi の省電力モード管理を切る

以下のコマンドを入力することで Power Management の設定を OFF にすることができます。

# 実行
iwconfig wlan0 power off

# 確認
iwconfig

ただ上記のコマンドを入力するだけでは再起動後に再度 Power Management が ON になってしまいます。なので、OS 起動時にも自動的に無効化するために /etc/rc.local に先のコマンドを書き込みます。末尾にある exit 0 の前あたりに入れておけば良いでしょう。

/etc/rc.local
iwconfig wlan0 power off    < この行を追加
exit 0

4. セキュリティ設定

セキュリティを向上させるため、下記の設定変更をしておくと良さそうです。最初に SD カードにイメージを焼く際に Raspberry Pi Imager で pi ユーザー以外のユーザーを設定したり、公開鍵での SSH を有効化しておくと尚良いでしょう。

SSH

イマドキの SSH は Ed25519 (楕円暗号) を使っておくのが無難な印象。このあたりは時代に合わせて強度レベルの高いものを選択しましょう。

/etc/ssh/sshd_config
# root ユーザでのログインを禁止
PermitRootLogin no

# パスワード認証を無効化
PasswordAuthentication no

# 公開鍵認証を有効化
PubkeyAuthentication yes

# 空パスワードを無効化
PermitEmptyPasswords no

Boot

「Console」かつ「パスワード必須」で起動するようにしておきます。Console を選択するのは、どうせモニタに繋いだ運用などしないからです。

# Raspberry Pi の構成画面を開く
sudo raspi-config
  1. [1 : System Options] を選択
  2. [S5 : Boot / Auto Login] を選択
  3. [B1 : Conosle] を選択

5. SD カードの寿命を延ばす

Raspberry Pi を 24/365 で動かし続けると SD カードの寿命が先に来るようです。SD カードの読み書き回数の上限に到達して壊れるとのこと。いろんなサイトで紹介されていますが、特にやっておきたい設定を残しておきます。

Swap を無効化

メモリ容量が足りないときにファイルにメモリの内容を退避させるのが Swap ですが、そこそこ大きなメモリの Raspberry Pi を持っている場合は Swap なんて不要な可能性が高いです。ということで無効化してしまいましょう。

# まずメモリの状態を確認
free -h

# Swap を無効化
sudo swapoff --all

この状態で Swap ファイルは消えましたが、Raspberry Pi を再起動すると復活してしまいます。ということで自動起動するサービスも無効化していきます。

# サービス停止 + 無効化
sudo systemctl stop dphys-swapfile
sudo systemctl disable dphys-swapfile

# (ないと思うけど) もしサービスを再開したい場合
sudo systemctl enable dphys-swapfile
sudo systemctl start dphys-swapfile

RAM Disk を利用する

SD カードに書き込みをしているものの一部を RAM Disk に移すことで SD カードの負担を軽減します。特に一時領域に対して適用するのが良いらしい。

# 現状の設定を把握
df -h
/etc/fstab
# これを追記
tmpfs           /tmp            tmpfs   defaults,size=32m,noatime,mode=1777  0       0
tmpfs           /var/tmp        tmpfs   defaults,size=16m,noatime,mode=1777  0       0
# 既存のフォルダを削除
sudo rm -rf /tmp
sudo rm -rf /var/tmp

# 再起動
sudo reboot

Appendix

以降はおまけです。作業をスムーズに行うための便利コマンドだとか、VPN サーバーとしての性能測定結果などを載せます。

VPN サーバーとしての性能

明確に Raspberry Pi を経由した通信にするために Tailscale Exit nodes を利用した状態でザックリ計測してみました。どのモデルも Wi-Fi ベースで稼働させています。

モデル 下り速度 [Mbps] 温度 [℃] 備考
Raspberry Pi Zero 2 W 3.5 53.1
Raspberry Pi 4 Model B 40.7 60.3 ヒートシンクのみ
Raspberry Pi 5 67.9 49.3 アクティブクーラー使用

Raspberry Pi 4 以上のスペックがあると RDP としては特段のストレスなく使える範囲でした。それどころか YouTube すらストレスなく閲覧できます。Zero 2 W は流石に鈍足ですが、RDP を低速モードで動作させれば妥協できるラインでした。

RDP を有効化

セットアップのためにもう一台モニタを用意したりするのは面倒なので RDP 接続できると楽です。Windows 標準のリモートデスクトップ接続を使うときは以下を実行しましょう。

sudo apt install xrdp

ちなみに RDP 中に Chromium などを立ち上げると表示が乱れて使い物にならないことがあります。そういったときには以下を行ってください。

  1. /etc/X11/xrdp/xorg.conf を開く
  2. Section "Device" の中にある Option "DRMDevice" の値を "" に変更
  3. デバイス再起動 (sudo shutdown -h now)
/etc/X11/xrdp/xorg.conf
Section "Device"
    Identifier "Video Card (xrdpdev)"
    Driver "xrdpdev"
    # Option "DRMDevice" "/dev/dri/renderD128"    < ここをコメント
    Option "DRMDevice" ""    < こう書き換える
    Option "DRI3" "1"
EndSection

Bluetooth 機器の接続

愛用している MX Master 2 を有線接続してみたけれど、微塵も反応がなかったので Bluetooth 接続で解決しました。以下を覚えておけば Bluetooth マウスでも安心です。

# Bluetooth 関連の操作モードに入る
bluetoothctl

# 周辺機器をスキャン
scan on

# MAC アドレスを指定して接続
pair <MAC Address>

温度計測

各々の作業の実行中にどのくらい発熱するのかを知っておくと Raspberry Pi を運用する上で安心かと思います。ずっと計測しながら作業していましたが、Raspberry Pi 5 のアクティブクーラーは 50 ℃を下回ると完全に停止するようです。言うて 50 ℃を超えて稼働しているときでも「無音」と言って差し支えないほど静穏ですが。

# 現在の温度を計測
vcgencmd measure_temp

# 2 秒ごとに計測
watch -n 2 vcgencmd measure_temp

Discussion