Raspberry Pi 3B+にSoftEther VPNサーバをインストール (2年ぶり2回目)

数年前にオフィスを引っ越し、サーバを動かし始めました。DBサーバやらGitLabサーバやらが動いているからオフィスの外からでもアクセスしたいと思って、手持ちのRaspberry Pi 3B+にSoftEther VPNサーバをインストールして運用しています。

数年運用していたんですが、いろいろ実験的にインストール・アンインストールを繰り返しているうちに接続性が若干不安定になってきたのでクリーンインストールしました。その時の記録です。

前提条件

こんな環境で設定してます。

LinuxなんでVPNは標準のパッケージでも設定できるんだけど、複数のソフトウェアを組み合わせて割と煩雑な設定をしないといけないので、Windows版GUIがあるSoftEtherはめんどくさがりには良いね。私の場合外部の関係者のアカウントも管理する必要があるので、GUIで操作できるのはかなり楽です。

設定の流れ

OSインストールやSSHセットアップなんかは他に譲るとして、VPNのセットアップは下記の流れになります。

  • 必要パッケージインストール
  • SoftEtherインストール
  • 仮想ブリッジ設定
  • WindowsへのGUIインストール
  • SoftEther設定
  • デーモン化
  • ルータのポート開放

セットアップ

必要パッケージのインストール

RaspberryPiの物理的なネットワークインターフェイス(eth0)とSoftEtherの仮想Hub(tap_vlan)とを接続する仮想ブリッジ(br0)に必要なパッケージ “bridge-utils” をインストールします。

sudo apt install bridge-utils

仮想ブリッジに接続出来るのはLANケーブルを刺すeth0の方で、Wifiのwlan0ではブリッジ接続出来ないようです。

SoftEtherインストール

SoftEtherのサイトからSoftEther VPN Serverをダウンロードします。
https://www.softether-download.com/en.aspx?product=softether

RaspberryPiのCPUはARMなので、ARM版最新RTMを使います。
ダウンロード時の絞り込みはこんな感じ

Select Software: SoftWther VPN (Freeware)
Select Component: SoftWther VPN Server
Select Platform: Linux
Select CPU: ARM EABI (32bit)

最新安定版を使いたかったので、Ver 4.29, Build 9680, rtmをダウンロード。

rtmはリリース版でbetaは最新版という位置づけのようです。最新機能が必要な場合以外はrtmが無難かなーと思います。

ダウンロードしたファイルはラズパイのホームディレクトリに一旦SCPで転送しておき、SSHでラズパイに入ります。ソフトウェアは /opt ディレクトリは以下にインストールしたいので、下記コマンドで展開しました。

$ sudo mv ./softether-vpnserver-v4.29-9680-rtm-2019.02.28-linux-arm_eabi-32bit.tar.gz /opt
$ cd /opt
$ sudo tar -zxf softether-vpnserver-v4.29-9680-rtm-2019.02.28-linux-arm_eabi-32bit.tar.gz
$ sudo mv vpnserver softether-vpnserver

続いてビルド。バイナリファイルを生成しますが、その際使用許諾が求められるので内容を確認して進めていきます。
ビルド完了するとvpncmdとvpnserverが生成されます。

$ cd /opt/softether-vpnserver
$ sudo make
# ここで使用許諾表示
$ sudo chown root:root -R .
$ sudo chmod 755 ./vpncmd ./vpnserver

設定ファイルのファイル名は vpn_server.config なので、再セットアップの場合はこのファイルをコピーしておくと設定を引き継げます。
DDNSは同じドメインを再取得できないので、このファイルがないとドメイン名が変わることになるので若干注意が必要です。

仮想ブリッジ設定

Raspberry Piの物理的なネットワークインターフェイスとSoftEtherの仮想Hubとを接続する仮想ブリッジを設定します。
仮想ブリッジのIPアドレスがSSHやVPN接続する際のIPアドレスになります。
今回は

  • eth0: IPアドレス割り当てなし
  • br0: 192.168.1.2

として設定しました。
/etc/network/interfaces を下記の様に編集。auto eth0以下を追記しています。

# interfaces(5) file used by ifup(8) and ifdown(8)

# Please note that this file is written to be used with dhcpcd
# For static IP, consult /etc/dhcpcd.conf and 'man dhcpcd.conf'

# Include files from /etc/network/interfaces.d:
source-directory /etc/network/interfaces.d

auto eth0
  iface eth0 inet manual

auto br0
  iface br0 inet manual
  bridge_ports eth0
  bridge_maxwait 10

続いて、下記をファイル終端に追記。(ちょっとデフォルト設定が長いので、追記部分のみ)
/etc/dhcpcd.conf

# ADD CONFIG
denyinterfaces eth0
interface br0
static ip_address=192.168.1.2/24
static routers=192.168.1.1
static domain_name_servers=192.168.1.1

設定したらここで一旦再起動。
設定ミスってるとネットワークにつながらなくなるので、念のためディスプレイとキーボードをつないでおくと安心。私はミスっててつながらなくなりました…
再起動後は192.168.1.2で接続出来るようになります。

WindowsへのGUIインストール

Windows10へのGUIのインストールは下記からプログラムをダウンロードしておこないます。
https://www.softether-download.com/en.aspx?product=softether
下記の絞り込み条件でダウンロードリストが表示されます。

ただ、今回リプレースで新規インストールしていないので説明は割愛…
たしか、最新RTMをインストールした、はず…

SoftEther設定

GUIのSoftEther VPN Server Managerから今回作成したVPNサーバに接続します。VPNサーバが起動していないと接続出来ないので、SSHでログインしてひとまずvpnserverを起動します。

$ cd /opt/softether-vpnserver
$ sudo ./vpnserver start

SoftEther VPN Server Managerで接続詞、仮想HUBを新規作成します。設定はこんな感じにしています。(といっても仮想HUB名とパスワードを設定しただけ)

続いてローカルブリッジを設定。
仮想HUBは上で作成したVPNを選択、新しいtapデバイス名をvlanにしました。

ローカルブリッジを追加して、設定は完了です。
後は自由ですが、私はAndroidやLinux端末からも接続したかったので、IPSec/L2TPも有効にしました。

デーモン化

自動起動設定をおこないます。まずは先ほど起動したvpnserverを終了。

$ cd /opt/softether-vpnserver
$ sudo ./vpnserver stop

下記ファイルを新規作成します。
/etc/systemd/system/vpnserver.service
内容はこんな感じ。

[Unit]
Description=SoftEther VPN Server
After=network.target network-online.target

[Service]
ExecStart=/opt/softether-vpnserver/vpnserver start
ExecStop=/opt/softether-vpnserver/vpnserver stop
WorkingDirectory=/opt/softether-vpnserver/
ExecStartPost=/bin/sleep 10 ; brctl addif br0 tap_vlan
Type=forking
RestartSec=3s

[Install]
WantedBy=multi-user.target

ファイルの権限調整と、デーモンの有効化をおこないます。

$ cd /etc/systemd/system/
$ sudo chown root:root ./vpnserver.service
$ sudo chmod 755 ./vpnserver.service
$ sudo systemctl daemon-reload
$ sudo systemctl enable vpnserver.service
$ sudo systemctl start vpnserver.service

ルータのポート開放

IPSec/L2TPを有効にしているので、ルータにポートマッピングの設定をおこないました。うちはエアステーションを使っているのでこんな感じ。

WANのUDPポート 500と4500をそれぞれ192.168.1.2の500と4500にマッピング。
これでSoftEtherのVPNクライアントからと各OS標準のVPN接続機能から接続出来るようになっているはずです。


Raspberry Pi OS で環境を最新化しました。