PINE64にArmbian(Linux)をインストールしてSoftetherVPN Server化

■Armbianとは

ArmbianはSBC向けのDebian/Ubuntuベースのディストリビューションです。DebianやUbuntuが公式に対応していないSBC向けのディスクイメージが配布されています。

イメージファイルは各SBC毎のページからダウンロードできます。
PINE A64用は以下のURLにあります。
https://www.armbian.com/pine64/

サーバ用にCLI版のArmbian_23.5.1_Pine64_jammy_current_6.1.30.img)
をダウンロード


■ArmbianのイメージファイルをSDカードに書き込み

  • Windows:Win32DiskImagerで書き込みを実施

  • Mac:下記コマンドで書き込みを実施

SDカードのパスを確認
$ diskutil list
(SDカードのパスが「/dev/disk4」だった場合。以下のコマンドで書き込み)
$ diskutil unmountDisk /dev/disk4
$ xzcat Armbian_22.02.2_Pine64_bullseye_current_5.15.26.img.xz | sudo dd of=/dev/rdisk4 bs=16m
(書き込みが完了すると、アンマウントするか尋ねられるためアンマウント)

■PINE A64の起動

PINE A64にmicroSDカードを差し込み、USBから電源を供給。
パーティションの拡大処理などが行われるためしばらく放置。
(HDMIを接続していると画面に表示される)

DHCPアドレスが取得されるため、arp -aなどでIPアドレスを確認
(画面にも表示されるため、それで確認することも可能)
別途作業用PCからSSH ログイン
 ※デフォルトユーザー:root、パスワード:1234
ログイン後、rootパスワード変更と一般ユーザー新規作成の指示に従い実施

■PINE A64の基本設定

ユーザーの切り替え
 $ su <user_name>

aptの更新
 $ sudo apt update
 $ sudo apt upgrade

cmakeのインストール #cmake v3.7以上必要

$ sudo apt-get install libssl-dev
$ sudo apt-get install libncurses5-dev
$ wget https://github.com/Kitware/CMake/releases/download/v3.16.0/cmake-3.16.0.tar.gz
$ tar xvf cmake-3.16.0.tar.gz
$ cd cmake-3.16.0/
$ ./configure
$ make
$ sudo make install
$ export PATH="/usr/local/bin:$PATH"
$ cmake

ネットワーク設定ツールのインストール

$ sudo apt install net-tools

■SoftetherVPN Serverのインストール

GitからソースコードをClone

$ sudo apt install git
$ git clone https://github.com/SoftEtherVPN/SoftEtherVPN.git
$ git submodule update --init --recursive

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

$ cd SoftEtherVPN
$ sudo apt install pkg-config
$ sudo apt install libncurses5-dev libreadline-dev libssl-dev zlib1g-dev
$ sudo apt install libsodium-dev

ソースビルド&インストール

$ ./configure
$ sudo make -C build
$ sudo make -C build install

■VPN Server の配置
ディレクトリやファイルの権限を変更
(vpnserver ディレクトリ内のファイルを、「root 権限」でなければ読み書きすることができないように、パーミッションを変更して保護)

$ cd build
$ sudo chmod 600 *
$ sudo chmod 700 vpncmd
$ sudo chmod 700 vpnserver

SoftEther VPNの起動スクリプトを作成し登録

$ sudo apt install vim
$ sudo vim /etc/init.d/vpnserver

下記の内容をスクリプトに書き込む

#!/bin/sh
### BEGIN INIT INFO
# Provides:                 vpnserver
# Required-Start:           $local_fs $network
# Required-Stop:            $local_fs $network
# Default-Start:            2 3 4 5
# Default-Stop:             0 1 6
# Short-Description:        SoftEther VPN RTM
# Description:              Start vpnserver daemon SoftEther VPN Server
### END INIT INFO

DAEMON=/usr/local/vpnserver/vpnserver
LOCK=/var/lock/vpnserver

# tun/tapモジュールのロード
sudo modprobe tun

. /lib/lsb/init-functions
test -x $DAEMON || exit 0

case "$1" in
start)
sleep 3
log_daemon_msg "Starting SoftEther VPN Server" "vpnserver"
$DAEMON start >/dev/null 2>&1
touch $LOCK
log_end_msg 0
sleep 3

# SoftEther VPNで追加した仮想tapデバイス名を調べる
#tap=`/sbin/ifconfig -a| awk '$1 ~ /^tap/ {print $1}'`
tap_dev=`/sbin/ip tuntap | awk -F: '{print $1}'`
#/sbin/brctl addif br0 $tap
if [ -n "$tap_dev" ]; then
    /sbin/brctl addif br0 $tap_dev
fi
;;

stop)
log_daemon_msg "Stopping SoftEther VPN Server" "vpnserver"
$DAEMON stop >/dev/null 2>&1
rm $LOCK
log_end_msg 0
sleep 2
;;

restart)
$DAEMON stop
sleep 2

$DAEMON start
sleep 5
# SoftEther VPNで追加した仮想tapデバイス名を調べる
tap=`/sbin/ifconfig -a| awk '$1 ~ /^tap/ {print $1}'`
/sbin/brctl addif br0 $tap
;;

status)
    if [ -e $LOCK ]
    then
        echo "vpnserver is running."
    else
        echo "vpnserver is not running."
    fi
;;
*)

echo "Usage:$0 {start|stop|restart|status}"
exit 1
esac
exit 0

/etc/init.d/vpnserver スタートアップスクリプトを作成した後、
このスクリプトのパーミッションを変更して、root 権限を持たないユーザーによって書き換えられないようにします。

$ sudo chmod 755 /etc/init.d/vpnserver

「chkconfig」コマンドを使用して、上記のスタートアップスクリプトが Linux カーネル起動時に、自動的にバックグラウンド起動するようにする

#古いけど備忘録として残す⇒ $ /sbin/chkconfig --add vpnserver

$ sudo systemctl enable vpnserver

VPN Server サービスを開始
※開始後はWindowsのSoftetherVPN管理アプリからセットアップするとラク

$ sudo /etc/init.d/vpnserver start

※そのほかのサービス操作コマンド
 停止する場合: $ sudo /etc/init.d/vpnserver stop
 再起動する場合:$ sudo /etc/init.d/vpnserver restart

■ローカルブリッジの設定

※Linuxサーバーの場合:本設定を行わないとVPNクライアントからVPNサーバーのサービス(Webサーバー、ファイルサーバー等)にアクセスできない。
※VPNサーバーがVPN接続サービスのみ提供する用途であれば実施不要

参考:Linux におけるローカルブリッジの注意事項 
https://www.softether.jp/1-product/11-vpn/31-overview/11

物理インタフェース名確認
$ nmcli device
DEVICE  TYPE      STATE      CONNECTION
eth0    ethernet  connected  Wired connection 1
lo      loopback  unmanaged  --        
ブリッジインタフェースbr0作成
$ nmcli c add type bridge ifname br0
Connection 'bridge-br0' (6af7792e-e648-4550-89e5-3fc8491ef59a) successfully added. 
ブリッジインタフェースbr0のSTPを無効
$ nmcli con modify bridge-br0 bridge.stp no
$ nmcli device
DEVICE  TYPE      STATE                                  CONNECTION
eth0    ethernet  connected                              Wired connection 1
br0     bridge    connecting (getting IP configuration)  bridge-br0
lo      loopback  unmanaged                              --        
ブリッジインタフェースbr0ネットワーク設定
※IPアドレスが192.168.1.100、Gatewayが192.168.1.1 の場合は下記のように指示
$ nmcli con modify bridge-br0 ipv4.method manual ipv4.addresses 192.168.1.100/24 ipv4.gateway 192.168.1.1 ipv4.dns "8.8.8.8 8.8.4.4"
物理インタフェースeth0をブリッジインタフェースbr0に接続
$ nmcli con add type bridge-slave ifname eth0 master bridge-br0
$ nmcli c del eth0 ← 物理インタフェースeth0削除 ※失敗しても成立してたから良し?
$ reboot ← システム再起動
$ brctl show ← ブリッジ接続状態照会
bridge name     bridge id               STP enabled     interfaces                  br0             8000.3abd0efca26c       no              eth0
※eth0とブリッジインタフェースbr0がブリッジ接続されていることが確認できる
IPアドレス照会
$ ip addr show
※物理インタフェースeth0にはIPアドレスは設定されていない
※ブリッジインタフェースbr0にIPアドレスが設定されている

下記のような応答が出てくる(一部マスク)

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
 inet 127.0.0.1/8 scope host lo
   valid_lft forever preferred_lft forever
 inet6 ::1/128 scope host
 valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master br0 state UP group default qlen 1000
  link/ether **:**:**:**:**:** brd ff:ff:ff:ff:ff:ff
3: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
  link/ether **:**:**:**:**:** brd ff:ff:ff:ff:ff:ff
 inet 192.168.1.100/24 brd 192.168.1.255 scope global noprefixroute br0
 valid_lft forever preferred_lft forever
inet6 ****:****:****:****:****:****:****:****/64 scope global temporary dynamic
 valid_lft 278sec preferred_lft 278sec
inet6 ****:****:****:****:****:****:****:****/64 scope global dynamic mngtmpaddr noprefixroute
 valid_lft 278sec preferred_lft 278sec
 inet6 ****::****:****:****:***/64 scope link noprefixroute
 valid_lft forever preferred_lft forever

■補足:vpncmd ⇒ check コマンドによるチェック

$ cd /usr/local/vpnserver
$ sudo ./vpncmd
vpncmd コマンド - SoftEther VPN Developer Edition コマンドライン管理ユーティリティ
SoftEther VPN コマンドライン管理ユーティリティ (vpncmd コマンド)
Developer Edition
Version 5.02 Build 5180 (Japanese)
Compiled 2023/08/11 18:38:54 by root at pine64
Copyright (c) all contributors on SoftEther VPN project in GitHub.
Copyright (c) Daiyuu Nobori, SoftEther Project at University of Tsukuba, and SoftEther Corporation.
All rights reserved.

vpncmd プログラムを使って以下のことができます。

1. VPN Server または VPN Bridge の管理
2. VPN Client の管理
3. VPN Tools コマンドの使用 (証明書作成や通信速度測定)

1 - 3 を選択: 3

VPN Tools を起動しました。HELP と入力すると、使用できるコマンド一覧が表示できます。

Copyright (c) all contributors on SoftEther VPN project in GitHub.
Copyright (c) Daiyuu Nobori, SoftEther Project at University of Tsukuba, and SoftEther Corporation.
All Rights Reserved.

この動作環境チェックツールを実行したシステムがテストに合格した場合は、SoftEther VPN ソフトウェアが動作する可能性が高いです。チェックにはしばらく時間がかかる場合があります 。そのままお待ちください...

'カーネル系' のチェック中...
              [合格] ○
'メモリ操作系' のチェック中...
              [合格] ○
'ANSI / Unicode 文字列処理系' のチェック中...
              [合格] ○
'ファイルシステム' のチェック中...
              [合格] ○
'スレッド処理システム' のチェック中...
              [合格] ○
'ネットワークシステム' のチェック中...
              [合格] ○

すべてのチェックに合格しました。このシステム上で SoftEther VPN Server / Bridge が正しく動作する可能性が高いと思われます。

コマンドは正常に終了しました。

VPN Tools>exit

■補足:vpncmd ⇒ Hublist コマンドにより

Virtual HUBとのローカルブリッジ接続に使用できる物理NICを確認

$ cd /usr/local/vpnserver
$ sudo ./vpncmd

1. VPN Server または VPN Bridge の管理
2. VPN Client の管理
3. VPN Tools コマンドの使用 (証明書作成や通信速度測定)

1 - 3 を選択: 1

サーバーに仮想 HUB 管理モードで接続する場合は、仮想 HUB 名を入力してください。
サーバー管理モードで接続する場合は、何も入力せずに Enter を押してください。
接続先の仮想 HUB 名を入力: VPN
VPN Server "localhost" (ポート 443) に接続しました。

VPN Server 内の仮想 HUB 'VPN' に対する管理権限があります。

VPN Server/VPN>Hublist
HubList コマンド - 仮想 HUB の一覧の取得
項目            |値
----------------+-------------------
仮想 HUB 名     |VPN
状態            |オンライン
種類            |スタンドアロン
ユーザー        |1
グループ        |0
セッション      |1
MAC テーブル    |14
IP テーブル     |20
ログイン回数    |0
最終ログイン日時|2023-08-12 12:13:11
最終通信日時    |2023-08-30 13:02:10
転送バイト数    |2,857,535,139
転送パケット数  |20,780,104
コマンドは正常に終了しました。

参考情報


この記事が気に入ったらサポートをしてみませんか?