Raspberry PiにSoftEther VPN サーバをインストールし、Raspberry Piとは別のLinuxマシンのSoftEther VPN サーバとカスケード接続します。クライアントからLinuxマシンを経由してRaspberry Piに接続します。陸にある自宅から、雲(クラウド)にあるVPNサーバを経由して海に浮かぶエデン(Raspberry Piが搭載された船)に接続するという、陸海空にまたがる壮大なスケールですね。もはや、私アダムは人類の祖先なのか統合幕僚長なのかわからなくなってきました。いいえただのおっさんです
ルーティングの入れ替えで苦労している記事をちらほら見かけましたので、dhcpcdでのスタティックルートの管理方法について最後に少しだけ書いておきます。
ダイナミックDNS機能を使っても良いのですが、Raspberry Pi自身でグローバルIPを持つ訳では無いのと、Raspberry Piの負荷軽減の為に外部との通信は4G-WiFiルータを使用するので、VPNサーバとして外からの接続を受けさせるにはポートフォワーディングとかの設定をしないといけません。そこまでするのはちょっと面倒くさい&セキュリティ的にも弱々だなぁと思って、別のVPNサーバとカスケードしちゃいました。
今回の構成図はこんな感じです。今更ですが、作っているのは海側です。

お金が貯まったら4GをStarLinkに置き換えたいなぁ。そしたら世界中どこでもいけちゃう。
いつだか海中データセンターをFacebookが作ったとかなんとか聞きましたが、海上データセンターもDIYの時代が目の前ですね。原発が冷やせるレベルで水冷し放題です。
ダウンロード
まずはSoftEtherのサイトからクライアントをダウンロード用のURLを取得します。

次に、Raspberry Pi上でダウンロードします。
$ wget https://jp.softether-download.com/files/softether/v4.41-9787-rtm-2023.03.14-tree/Linux/SoftEther_VPN_Server/64bit_-_ARM_64bit/softether-vpnserver-v4.41-9787-rtm-2023.03.14-linux-arm64-64bit.tar.gz
展開します
$ tar zxvf softether-vpnserver-v4.41-9787-rtm-2023.03.14-linux-arm64-64bit.tar.gz
makeします
$ cd vpnserver
$ make
出来上がったバイナリをFHSに従って配置します。
$ sudo mv vpnserver/ /usr/local
$ cd /usr/local/vpnserver/
自動起動用のスクリプトを作成します。
$ sudo vi /etc/systemd/system/vpnserver.service
[Unit]
Description=SoftEther VPN Server
After=network.target network-online.target
[Service]
User=root
ExecStart=/usr/local/vpnserver/vpnserver start
ExecStop=/usr/local/vpnserver/vpnserver stop
Type=forking
RestartSec=3s
WorkingDirectory=/usr/local/vpnserver/
[Install]
WantedBy=multi-user.target
Raspberry Piの扱いに慣れている方からすると薄々気づくと思うのですが、私アダムは古い人間(私からすれば全ての人類は子孫ですからね)なので、nanoとかハイカラなものは使わずに使えずにviなんです。
スクリプトの動作確認をしておきましょう。
$ sudo systemctl start vpnserver.service
今回はVPNクライアントではなくVPNサーバを入れたので、tapデバイスを作成してブリッジします。
SoftEther VPNサーバー管理マネージャからブリッジの設定をします。『ローカルブリッジ』をクリックします。

仮想HUB名を適宜選択してtapデバイスを作成します。名前はご自由に。『ローカルブリッジを追加』をクリックします。

次にtap0に固定IPを割り当てます。アドレスは適宜読み替えてください。192.168.30.1はVPNサーバの『SecureNAT 仮想ホストのインターフェース』に設定しているIPです。
$ sudo vi /etc/dhcpcd.conf
# Add for SoftEther
interface tap_tap0
static ip_address=192.168.30.201/24
static routers=192.168.30.1
static domain_name_servers=192.168.30.1
起動時にルーティングテーブルを入れ替えるように設定します。
ファイル名は自由では有るものの、名前順に実行される&最後に処理したいので99にします。
$ sudo vi /lib/dhcpcd/dhcpcd-hooks/99-vpnserver
ip route add VPNサーバのIP/32 via ローカルの元々のGWのIP
これで無事にVPNサーバを経由してVPNクライアントからRaspberry Piに接続ができます。
で、ここまでやって思ったのが「ダイナミックDNSとSSHポートフォワーディングで良かったんじゃね?」ってことです。色んな意味でお疲れ様でした。