SoftEther VPN の導入

SoftEther(ソフトイーサ)は、オープンソースのVPNソフトウェアです。正式名称は “SoftEther VPN” で、「SoftEther」は「ソフトウェア イーサネット」を意味します。登 大遊 氏により開発されました。

外部リンク: https://ja.softether.org/ (SoftEther VPN プロジェクト)

この記事はAlmaLinux環境で検証していますが、ラズパイ環境でもARM 64bit版をダウンロードすれば同様の手順で構築可能です。

目次

主な特徴

  • マルチプロトコル対応: SoftEther は、L2TP/IPSec、OpenVPN、SSTP(Microsoft Secure Socket Tunneling Protocol)、及び独自の SSL-VPN (SoftEther VPN) プロトコルをサポートしています。
  • 高速性: 最適化されたデータ転送により、SoftEther VPN は非常に高速なスループットと低いレイテンシを実現しています。
  • クロスプラットフォーム: Windows、Linux、macOS、FreeBSD、および Solaris など、さまざまなプラットフォームで利用できます。
  • オープンソース: SoftEther VPN のソースコードは公開されており、誰でも自由に改変や再配布ができます。
  • 柔軟な設定: 企業ネットワークのリモートアクセスや、ブランチオフィス間のサイト間接続など、様々なニーズに応じてカスタマイズが可能です。
  • セキュリティ: 業界標準の暗号化技術を用いており、セキュアな通信が実現されています。

SoftEther VPNは、個人や企業によるプライベートネットワークの構築に適した選択肢です。高速性、柔軟性、安全性を兼ね備えており、さまざまな目的で利用可能です。

SoftEther VPN Server の導入

AlmaLinux 9.2 でSoftEtherを使用してVPNサーバーを構築する手順は以下の通りです。

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

まず、必要なパッケージをインストールします。EPEL リポジトリからインストールできるようにします。

sudo dnf groupinstall "Development Tools"

sudo dnf install -y epel-release
sudo dnf install -y wget gcc make which openssl-devel readline-devel zlib-devel

SoftEther VPN Serverのダウンロードとインストール

次に、SoftEther の公式 Web サイトから最新版のソフトウェアをダウンロードし、インストールします。
2023年7月5日時点で、(Ver 4.42, Build 9798, rtm)がリリースされています。

cd /usr/local/src

wget https://www.softether-download.com/files/softether/v4.42-9798-rtm-2023.06.30-tree/Linux/SoftEther_VPN_Server/64bit_-_Intel_x64_or_AMD64/softether-vpnserver-v4.42-9798-rtm-2023.06.30-linux-x64-64bit.tar.gz
tar zxvf softether-vpnserver-v4.42-9798-rtm-2023.06.30-linux-x64-64bit.tar.gz
cd vpnserver
make

ビルドが成功したら、インストールします。

cd /usr/local/src
sudo mv vpnserver /usr/local/

cd /usr/local/vpnserver/
sudo chown root:root *
sudo chmod 600 *
sudo chmod 700 vpnserver vpncmd
-rwxrwxrwx   1 root root     511  3月 14 11:10 .install.sh*
-rw-------   1 root root      82  3月 14 11:10 Authors.txt
-rw-------   1 root root    3577  3月 14 11:10 Makefile
-rw-------   1 root root   32256  3月 14 11:10 ReadMeFirst_Important_Notices_cn.txt
-rw-------   1 root root   37747  3月 14 11:10 ReadMeFirst_Important_Notices_en.txt
-rw-------   1 root root   52554  3月 14 11:10 ReadMeFirst_Important_Notices_ja.txt
-rw-------   1 root root    3587  3月 14 11:10 ReadMeFirst_License.txt
drw-------   2 root root    4096  6月 15 18:36 chain_certs/
drw-------   2 root root    4096  6月 15 18:36 code/
-rw-------   1 root root 2011365  3月 14 11:10 hamcore.se2
-rw-------   1 root root     867  6月 15 18:36 lang.config
drw-------   2 root root    4096  6月 15 18:36 lib/
-rwx------   1 root root 6684128  6月 15 18:36 vpncmd*
-rwx------   1 root root 6684200  6月 15 18:36 vpnserver*

システムデーモンの設定

SoftEther VPN Serverをシステムデーモンとして登録し、自動起動するように設定します。

以下のコマンドで systemd ユニットファイルを作成します。

sudo vi /etc/systemd/system/softether-vpnserver.service

次の内容をファイルに入力し、保存してください。

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

[Service]
Type=forking
ExecStart=/usr/local/vpnserver/vpnserver start
ExecStop=/usr/local/vpnserver/vpnserver stop
KillMode=process
Restart=on-failure

[Install]
WantedBy=multi-user.target

システムデーモンを有効にし、VPNサーバーを起動します。

sudo systemctl daemon-reload

sudo systemctl enable softether-vpnserver.service
sudo systemctl start softether-vpnserver.service

firewalldの設定

MacのVPN Clientから接続するには、IPsecを許可する必要があります。

sudo firewall-cmd --add-port=5555/tcp --permanent
sudo firewall-cmd --add-port=8888/tcp --permanent
sudo firewall-cmd --add-port=992/tcp --permanent
sudo firewall-cmd --add-port=443/tcp --permanent

sudo firewall-cmd --add-port=500/udp --permanent
sudo firewall-cmd --add-port=4500/udp --permanent
sudo firewall-cmd --add-protocol=ah --permanent
sudo firewall-cmd --add-protocol=esp --permanent

sudo firewall-cmd --reload

 VPNサーバーの設定

vpncmd を使って VPN サーバーを設定します。まず、サーバーパスワードを設定します。

sudo /usr/local/vpnserver/vpncmd

次のコマンドを入力して必要な設定を行います。

ServerPasswordSet YOUR_SERVER_PASSWORD_HERE
HubCreate VPN                     // VPN という名前の HUB を作成する
Hub VPN                           // 作成した HUB の設定に移る
UserCreate USERNAME               // ユーザーを作成する
UserPasswordSet USERNAME          // ユーザーパスワードを設定する
SecureNatEnable                   // Secure NAT 機能を有効にする
Layer3Create VPN_LAYER3SW         // L3 スイッチを作成する
Layer3VLANCreate 1                // VLAN を作成する
Layer3IfAdd 1 IFNAME LOCAL_IP     // インターフェースを追加する
Layer3SwAddIf VPN_LAYER3SW IFNAME // インターフェースをスイッチに接続する

vpncmd の各コマンド

HubCreate VPN

HubCreate コマンドは、SoftEther VPN Server Manager または vpn_cmd ツールで使用されるコマンドです。これにより、新しい仮想ハブを作成できます。

以下は HubCreate コマンドの基本的な構文です。

HubCreate <接続先 VPN サーバーアドレス> /SERVER:<サーバー名> /HUB:<仮想ハブ名> /PASSWORD:<パスワード>

各パラメーターの説明

  • <接続先 VPN サーバーアドレス> : VPN サーバーへの接続先情報 (例: localhost:5555)
  • <サーバー名> : サーバー証明書に設定するサーバー名
  • <仮想ハブ名> : 作成する仮想ハブの名前
  • <パスワード> : VPN サーバー管理者向けのパスワード

例えば、VPN サーバーがローカルホストで実行されており、管理者パスワードが “admin_password”、そして “MyNewHub” という名前の新しい仮想ハブを作成したい場合、次のコマンドを実行します。

HubCreate localhost:5555 /SERVER:MyVPNServer /HUB:MyNewHub /PASSWORD:admin_password

このコマンドを実行することで、VPN サーバー上に新しい仮想ハブ “MyNewHub” が作成されます。その後、この仮想ハブを設定してユーザーやグループ、さらには VPN クライアントから接続するための証明書やキーなどを管理できます。

Hub VPN

Hub コマンドは SoftEther VPN Server Manager または vpn_cmd ツールで使用されるコマンドです。これにより、VPN サーバー上の仮想ハブを管理できます。Hub コマンドにはさまざまなサブコマンドがあり、それぞれが特定の操作を実行します。

以下はいくつかの主要な Hub のサブコマンドです。

HubCreate

このサブコマンドは新しい仮想ハブを作成します。

HubCreate <接続先 VPN サーバーアドレス> /SERVER:<サーバー名> /HUB:<仮想ハブ名> /PASSWORD:<パスワード>
HubDelete

このサブコマンドは指定された仮想ハブを削除します。

HubDelete <接続先 VPN サーバーアドレス> /HUB:<仮想ハブ名> /PASSWORD:<パスワード>
HubList

このサブコマンドはVPN サーバー上のすべての仮想ハブの一覧を表示します。

HubList <接続先 VPN サーバーアドレス> /PASSWORD:<パスワード>
UserCreate

このサブコマンドは仮想ハブに新しいユーザーを作成します。

UserCreate <接続先 VPN サーバーアドレス> /HUB:<仮想ハブ名> /USER:<ユーザー名> /REALNAME:<実名> /GROUP:<グループ名> /NOTE:<備考> /PASSWORD:<パスワード>
UserDelete

このサブコマンドは指定されたユーザーを削除します。

UserDelete <接続先 VPN サーバーアドレス> /HUB:<仮想ハブ名> /USER:<ユーザー名>
UserList

このサブコマンドは仮想ハブ内のすべてのユーザーの一覧を表示します。

UserList <接続先 VPN サーバーアドレス> /HUB:<仮想ハブ名>

これらのコマンドを使用することで、SoftEther VPN サーバー上で仮想ハブやユーザーを管理することができます。必要に応じて他のサブコマンドも利用できます。詳細な情報と使い方については、SoftEther VPN コマンドラインリファレンスを参照してください。

UserCreate USERNAME

UserCreate コマンドは、SoftEther VPN Server で新しいユーザーを作成するために使用されます。このコマンドを使用して、特定の仮想ハブにユーザーを追加できます。

UserCreate の基本構文は次のようになります。

UserCreate <接続先 VPN サーバーアドレス> /HUB:<仮想ハブ名> /USER:<ユーザー名> /REALNAME:<実名> /GROUP:<グループ名> /NOTE:<備考> /PASSWORD:<パスワード>
  • <接続先 VPN サーバーアドレス> – VPN サーバーへの接続情報。例:localhost:5555
  • /HUB:<仮想ハブ名> – ユーザーを追加する仮想ハブの名前。
  • /USER:<ユーザー名> – 新しく作成されるユーザーのユーザー名。
  • /REALNAME:<実名>(オプション) – 新しいユーザーの実名。オプションであり省略可能です。
  • /GROUP:<グループ名>(オプション) – 新しいユーザーが所属するグループ名。オプションであり省略可能です。
  • /NOTE:<備考>(オプション) – 新しいユーザーに関する備考。オプションであり省略可能です。
  • /PASSWORD:<パスワード> – 新しいユーザーのパスワード。

例えば、MyHub という仮想ハブに testuser というユーザー名で新しいユーザーを作成する場合、次のようなコマンドを使用します。

UserCreate localhost:5555 /HUB:MyHub /USER:testuser /REALNAME:"Test User" /GROUP:Users /NOTE:"Example user" /PASSWORD:example_password

このコマンドは、localhost:5555 で実行されている SoftEther VPN サーバー上で、MyHub という仮想ハブに新しいユーザー testuser を作成します。ユーザーの実名は Test User、グループは Users、備考は Example user、そしてパスワードは example_password に設定されます。

UserPasswordSet USERNAME

UserPasswordSet コマンドは、SoftEther VPN Server で既存ユーザーのパスワードを変更するために使用されます。このコマンドを使用して、特定の仮想ハブ内のユーザーのパスワードを設定または更新できます。

UserPasswordSet の基本構文は次のようになります。

UserPasswordSet <接続先 VPN サーバーアドレス> /HUB:<仮想ハブ名> /USER:<ユーザー名> /PASSWORD:<新しいパスワード>
  • <接続先 VPN サーバーアドレス> – VPN サーバーへの接続情報。例:localhost:5555
  • /HUB:<仮想ハブ名> – パスワードを変更するユーザーが存在する仮想ハブの名前。
  • /USER:<ユーザー名> – パスワードを変更するユーザーのユーザー名。
  • /PASSWORD:<新しいパスワード> – 新しいパスワード。

例えば、MyHub という仮想ハブ内の testuser というユーザー名のユーザーのパスワードを変更する場合、次のようなコマンドを使用します。

UserPasswordSet localhost:5555 /HUB:MyHub /USER:testuser /PASSWORD:new_password

このコマンドは、localhost:5555 で実行されている SoftEther VPN サーバー上で、MyHub という仮想ハブ内の testuser というユーザー名のユーザーのパスワードを new_password に変更します。

SecureNatEnable

SecureNatEnable コマンドは、SoftEther VPN Server でセキュア NAT 機能を有効にするために使用されます。セキュア NAT 機能は、仮想ハブに接続された VPN クライアントが相互に通信できるように、仮想的なルーティング/NAT機能を提供します。これにより、VPN クライアントの設定や追加のルーティング機器が不要になります。

SecureNatEnable の基本構文は次のようになります。

SecureNatEnable <接続先 VPN サーバーアドレス> /HUB:<仮想ハブ名>
  • <接続先 VPN サーバーアドレス> – VPN サーバーへの接続情報。例:localhost:5555
  • /HUB:<仮想ハブ名> – セキュア NAT を有効にする仮想ハブの名前。

例えば、MyHub という仮想ハブでセキュア NAT 機能を有効にする場合、次のようなコマンドを使用します。

SecureNatEnable localhost:5555 /HUB:MyHub

Layer3Create VPN_LAYER3SW

Layer3Create コマンドは、SoftEther VPN Server でレイヤー3スイッチを作成するために使用されます。レイヤー3スイッチ機能は、異なる仮想ハブ間での通信やルーティングを可能にします。

Layer3Create の基本構文は次のようになります。

Layer3Create <接続先 VPN サーバーアドレス> /SW:<L3スイッチ名>
  • <接続先 VPN サーバーアドレス> – VPN サーバーへの接続情報。例:localhost:5555
  • /SW:<L3スイッチ名> – 新しく作成されるレイヤー3スイッチの名前。

例えば、VPN_LAYER3SW という名前のレイヤー3スイッチを作成する場合、次のようなコマンドを使用します。

Layer3Create localhost:5555 /SW:VPN_LAYER3SW

レイヤー3スイッチを作成した後は、Layer3IfAdd コマンドを使用してインターフェイスを追加し、仮想ハブとの連携を行います。その後、Layer3IfAdd コマンドを使ってインターフェイスに対してIPアドレスやサブネットマスクを設定することで、レイヤー3スイッチの設定を完了します。

Layer3VLANCreate

SoftEther VPNでは、Layer3Createコマンドを使用してレイヤー3スイッチを作成し、異なる仮想ハブ間での通信やルーティングを可能にします。しかし、SoftEther VPNにはLayer3VLANCreateというコマンドは存在しません。

代わりに、以下の手順を実行することで異なるVLAN間でのレイヤ3ルーティングができます。

Layer3Create コマンドを使用してレイヤー3スイッチ (例えば L3SW1) を作成します。

Layer3Create localhost:5555 /SW:L3SW1

Layer3IfAddコマンドを使って、それぞれのVLAN用のインターフェイスをレイヤ3スイッチに追加します。以下の例では、VirtualHub1およびVirtualHub2の仮想ハブを示します。

Layer3IfAdd localhost:5555 /SW:L3SW1 /HUB:VirtualHub1
Layer3IfAdd localhost:5555 /SW:L3SW1 /HUB:VirtualHub2

Layer3IfSetコマンドを使用して、各インターフェイスにIPアドレスとサブネットマスクを設定します。

Layer3IfSet localhost:5555 /SW:L3SW1 /HUB:VirtualHub1 /IP:10.0.0.1 /MASK:255.255.255.0
Layer3IfSet localhost:5555 /SW:L3SW1 /HUB:VirtualHub2 /IP:10.0.1.1 /MASK:255.255.255.0

これで、VirtualHub1およびVirtualHub2を接続した異なるVLAN間でのレイヤ3ルーティングが可能になります。

Layer3IfAdd 1 IFNAME LOCAL_IP

SoftEther VPNのLayer3IfAdd コマンドは、レイヤ3スイッチに仮想ハブを接続するために使用されます。このコマンドはレイヤ3スイッチと仮想ハブ間でのルーティングを可能にし、異なる仮想ハブ間で通信ができるようにします。

Layer3IfAdd コマンドの基本的な構文は次のようになります。

Layer3IfAdd <management_server> /SW:<layer3_switch_name> /HUB:<virtual_hub_name>
  • <management_server>: SoftEther VPNサーバーの管理アクセスポイントです(例:localhost:5555)。
  • <layer3_switch_name>: 既存のレイヤ3スイッチの名前です。
  • <virtual_hub_name>: レイヤ3スイッチに接続したい仮想ハブの名前です。

ただし、Layer3IfAdd コマンドに IFNAME や LOCAL_IP のオプションはありません。代わりに、Layer3IfSet コマンドを使用して、作成されたインターフェイスにIPアドレスとサブネットマスクを設定できます。

例えば、以下のコマンドを使用してVirtualHub1 をレイヤ3スイッチL3SW1 に接続し、IPアドレスとサブネットマスクを設定します。

Layer3IfAdd localhost:5555 /SW:L3SW1 /HUB:VirtualHub1
Layer3IfSet localhost:5555 /SW:L3SW1 /HUB:VirtualHub1 /IP:192.168.1.1 /MASK:255.255.255.0

上記の例では、新しく作成された仮想インターフェイスに192.168.1.1 のIPアドレスと255.255.255.0 のサブネットマスクが設定されます。

Layer3SwAddIf VPN_LAYER3SW IFNAME

Layer3SwAddIf コマンドを使用して、Layer3 スイッチにインターフェース(IFNAME)を追加することができます。

SoftEther VPN の Layer3SwAddIf コマンドの使い方は次のとおりです。

vpncmd [サーバー接続情報] /CMD Layer3SwAddIf VPN_LAYER3SW IFNAME
  • サーバー接続情報: SoftEther VPN サーバーへの接続情報で、[localhost] や [IPアドレス] などが指定できます。
  • VPN_LAYER3SW: 追加したい Layer3 スイッチ名を指定します。
  • IFNAME: 新しいインターフェースの名前を指定します。

例えば、以下のコマンドは、ローカルホスト上の SoftEther VPN サーバーに接続し、My_switch という名前の Layer 3 スイッチに New_interface という名前のインターフェースを追加します。

vpncmd localhost /CMD Layer3SwAddIf My_switch New_interface

これで、AlmaLinux 9.2 上に SoftEther VPN サーバーが構築されました。クライアントから接続して動作を確認してください。

SoftEther VPN Client の導入

AlmaLinux 9.2でSoftEther VPN Clientをインストールする手順は以下の通りです。
ラズパイ等のDebian12でもインストール方法や、インストール先が異なりますが同様の設定で動作します。

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

必要なパッケージをインストールします。dnf(AlmaLinuxではデフォルトのパッケージマネージャー)を使用して、開発ツールと依存関係をインストールします。

sudo dnf groupinstall "Development Tools"

sudo dnf install -y wget gcc make which openssl-devel readline-devel zlib-devel

SoftEther VPN Client のソースコードをダウンロード

SoftEther VPN Clientソースコードをダウンロードします。

cd /usr/local/src

wget https://www.softether-download.com/files/softether/v4.41-9787-rtm-2023.03.14-tree/Linux/SoftEther_VPN_Client/64bit_-_Intel_x64_or_AMD64/softether-vpnclient-v4.41-9787-rtm-2023.03.14-linux-x64-64bit.tar.gz
tar zxvf softether-vpnclient-v4.41-9787-rtm-2023.03.14-linux-x64-64bit.tar.gz
cd vpnclient/

ソースコードのビルドが成功したらインストールします。

cd /usr/local/src/vpnclient/

make

cd /usr/local/src/
sudo mv vpnclient /usr/local

cd /usr/local/vpnclient/
sudo chown root:root *
sudo chmod 600 *
sudo chmod 700 vpnclient vpncmd

システムデモーンの設定

SoftEther VPN Clientをシステムデーモンとして登録し、自動起動するように設定します。

以下のコマンドで systemd ユニットファイルを作成します。

sudo vi /etc/systemd/system/softether-vpnclient.service

次の内容をファイルに入力し、保存してください。

[Unit]
Description=SoftEther VPN Client Service
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/vpnclient/vpnclient start
ExecStop=/usr/local/vpnclient/vpnclient stop
KillMode=process
Restart=on-failure

[Install]
WantedBy=multi-user.target

上記の内容では、SoftEther VPN Clientがインストールされているディレクトリ(/usr/local/vpnclient)からvpnclientプログラムを起動・停止するように指定しています。

 サービスの起動と有効化

システムデーモンを有効にし、VPNクライアントを起動します。

sudo systemctl daemon-reload

sudo systemctl enable softether-vpnclient.service
sudo systemctl start softether-vpnclient.service

サービスを手動で停止するには、次のコマンドを実行してください。

sudo systemctl stop softether-vpnclient.service

AlmaLinuxでSoftEther VPN Clientのsystemdユニットファイルを作成し、自動起動できるように設定しました。

VPNClientの設定

LinuxなどのCLI環境では、vpncmdを使用して設定を行います。
SoftEtherのvpncmdは、コマンドラインからVPNクライアント、サーバー、およびブリッジ管理操作を実行するためのツールです。ここでは、主にvpnclientを対象に説明します。

vpncmd の基本的な使い方

ソフトウェアを起動すると、次の3つのモードから選択できます。

sudo ./vpncmd

1. Management of VPN Server or VPN Bridge 
2. Management of VPN Client 
3. Use of VPN Tools (Check TCP/IP Routing Table, Check IP Address Duplication etc)

VPNクライアントの管理を行う場合には 2. Management of VPN Client を選択します。

または、コマンドプロンプトかターミナルで以下のように入力します。

sudo ./vpncmd localhost /CLIENT

これで、SoftEther VPN Clientに関連するコマンドが利用可能になります。

一部の主要なコマンド

以下に一部の主要なコマンドを示します。

  • NicCreate: 仮想NICを作成します。このコマンドに続けて、作成するNICの名前を指定します。
  • AccountCreate: 新しい接続設定(アカウント)を作成します。このコマンドに必要なパラメータは、アカウント名、サーバ名、ポート番号、仮想HUB名、ユーザ名です。
  • AccountPasswordSet : 新しい接続設定(アカウント)にパスワードを設定します。
  • AccountConnect: 作成済みのアカウントに接続します。このコマンドには、接続するアカウント名をパラメータとして指定します。
  • AccountDisconnect: 既存の接続を切断します。このコマンドは、切断するアカウント名をパラメータとして必要とします。

設定例

# VPN Client モードで vpncmd を起動
sudo ./vpncmd localhost /CLIENT

# 新規に仮想 NIC を作成
NicCreate vpn1

# 新規に接続設定(アカウント)を作成 (パラメータを省略した場合は対話式に入力できます)
AccountCreate ConoHaVPNServer /SERVER:example.com:5555 /HUB:DevelopHub /USERNAME:conagi /NIC:vpn1

# 新しい接続設定(アカウント)にパスワードを設定します。
AccountPasswordSet ConoHaVPNServer /PASSWORD:hoGehoGe /TYPE:standard

# 接続設定(アカウント)へ接続
AccountConnect ConoHaVPNServer

#アカウントの接続状況を確認
AccountList

quit

SecureNAT & DHCPの利用

VPNサーバー側のグローバルアドレスを利用してインターネット接続を行う場合、client(Linux側)にDHCPを有効にする必要があります。Windows版は、特に何もしなくてもVPN ClientがDHCPクライアントとルーティング情報の調整をしてくれます。
以下は、AlmaLinuxやラズパイなどのLinux環境でVPN Clientで SecureNAT & DHCPを利用する例です。

接続スクリプト

ここでは、接続にWiFi(wlan0)を使用しています。
基本的なロジックはスクリプトを見ていただければ分かるかと思いますが、ルーティング情報の変更について簡単に説明させていただきます。

wlan0でインターネットに接続している時のデフォルトルートのmetric値は 600になっています。
VPNのゲートウェイからインターネットにアクセスするにはデフォルトゲートウェイをVPN側に変更する必要があります。しかし、元々あったwlan0のデフォルトゲートウェイが消えると、VPNサーバーへの到達性もなくなりVPNが切断されてしまうためスタテックルートを追加する必要があります。
ルーティング情報の変更は、VPNの接続が完了してから行わないと通信ができなくなります。
接続完了の確認は vpncmdで行う方法もありますが、VPN接続時のゲートウェイに pingが飛ぶかを確認したほうが確実かと思います。

#!/bin/bash
# vpnclient起動スクリプト ※要root権限

VPN_SERVER="XXX.XXX.XXX.XXX"
VPN_GW="192.168.30.1"
LOCAL_GW="172.16.114.1"

VPN_ACCOUNT="vpn1"
VPN_IF="vpn_vpn1"

# WiFi環境時などは、wlan0がUP状態になるまで待つ
echo ">>>Wait until wlan0 becomes up status..."
SECONDS=0
while ! ip link show wlan0 | grep -q "state UP"; do
    # If 30 seconds have passed, break the loop.
    if [ $SECONDS -ge 30 ]; then
        echo "Timeout. wlan0 failed to become UP within 30 seconds."
        exit 1
    fi
    sleep 1
done

# softether VPN Clientデーモンを起動
## systemdで自動起動にしたため、ここでは操作しない
#echo ">>>Start vpnclient daemon..."
#/opt/vpnclient/vpnclient start

# 予め作成済みアカウントでVPNに接続を開始する
echo ">>>Start vpn connect..."
/opt/vpnclient/vpncmd /CLIENT localhost /CMD AccountConnect $VPN_ACCOUNT

ip route add $VPN_SERVER via $LOCAL_GW

# vpn gwがpingが成功するまで待機します
SECONDS=0 # timer reset
while true; do
    # dhcpでIPを取得する
    dhclient $VPN_IF

    # -c 1 は 1回だけpingを送るオプションです
    ping -c 1 $VPN_GW > /dev/null 2>&1

    # $?は直前のコマンドの終了ステータスを返します。0は成功を示します。
    if [ $? -eq 0 ]; then
        # デフォルトルートを変更する
        echo ">>>Change Default GW..."
        ip route del default
        ip route add default via $VPN_GW dev $VPN_IF
        break
    elif [ $SECONDS -gt 30 ]; then
        echo "Timeout: gateway did not become reachable within 30 seconds."
        exit 1
    else
        echo "Waiting for gateway to become reachable..."
        sleep 1
    fi
done

ラズパイ Debian12環境で検証したものですので、AlmaLinux環境ではインターフェース名やコマンドのパスが異なる場合があります。
IoT機器等のリモート保守用にVPN接続させるだけであれば、デフォルトゲートウェイの変更は不要です。
VPNサーバーのグローバルIPアドレスでNATさせたい場合は、デフォルトゲートウェイの変更を行います。

切断スクリプト

#!/bin/bash
# vpnclient停止スクリプト ※要root権限

VPN_SERVER="XXX.XXX.XXX.XXX"
VPN_GW="192.168.30.1"
LOCAL_GW="172.16.114.1"

VPN_ACCOUNT="vpn1"
VPN_IF="vpn_vpn1"

# VPNを切断する
echo ">>>Stop vpn connect..."
/opt/vpnclient/vpncmd /CLIENT localhost /CMD AccountDisconnect $VPN_ACCOUNT

# softether VPN Clientデーモンを停止
#echo ">>>Stop vpnclient daemon..."
#/opt/vpnclient/vpnclient stop

# デフォルトルートを戻す
echo ">>>Resore Default GW..."
ip route del $VPN_SERVER
ip route del default
ip route add default via $LOCAL_GW dev wlan0

IPアドレスは固定で設定していますが、動的な環境の場合は、インターフェース情報からIPアドレスを取得するなどの修正を行ってください。

VPN自動接続設定 (スクリプトをOS起動時に自動で実行)

先ほど作成したVPN接続用のスクリプトを自動実行するように設定します。
systemd のサービスファイルを作成します。ここでは /etc/systemd/system/vpn.service というファイル名で進めます。

sudo vi /etc/systemd/system/vpn.service
[Unit]
Description=VPN Client
After=multi-user.target

[Service]
Type=oneshot
ExecStart=/usr/local/bin/vpn_start.sh
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

この設定では、multi-user.target(システムの重要なサービスやデーモンの多くが起動した後)になった時点でスクリプトが実行されます。

作成したサービスを有効化します。

sudo systemctl enable vpn.service
sudo reboot

リブートをすれば、自動でVPN接続がされた状態で起動します。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次