SoftEther VPNを使いRaspberry PiをVPNサーバにする

More than 1 year has passed since last update.


準備

SoftEtherVPNさんの力を借りて「(DHCPからアドレスが振ってくれば)ケーブルを繋げるだけで動くVPN拠点」を作ろうと思います

DHCPがある場所にザクッとEthernetを繋いで電源を入れれば、あとはSoftEtherVPNがNAT トラバーサルやらVPN over HTTPSやらVPN AzureでVPNが繋がるようにしてくれる、という感じにしたいです


セットアップ


購入

Raspberry Piは全く初めてなので買うところからです

ケースが欲しかったので本体はこれにしました

Raspberry Pi 3 Model B ボード&ケースセット

長期間安定動作してほしいので電源は公式のを買いました

2.5A出る電源ってあんまりないんですね

Raspberry Pi 3 Model B 専用電源 ACアダプタ

microSDHCは家にあった適用な32GB Class10を使います


OS

VPNとして使うため、X不要のLite版を選びます

ぼくがインストールしたのはRaspbian Jessie Lite 2017-04-10版です

Download Raspbian


インストール

DD for Windowsを使います

Bash on Windowsはハードウェアを触れないのでmicroSDHCへのDDができません

DDWin.exe管理者として実行で起動し2017-04-10-raspbian-jessie-lite.imgを書き込みます

管理者権限でないとディスク書き込みができません

image

書き込み自体は5分程度で終わりました


SSHの有効化

2017/04/15現在のRaspbianはデフォルトではSSHがオフになっているため、

そのままではヘッドレス環境でのセットアップができません

しかし、ディスクを直接書き換えることでSSHを有効にする手段が提供されているので利用します

SSH (Secure Shell) - Raspberry Pi Documentation



  1. ENABLE SSH ON A HEADLESS RASPBERRY PI

For headless setup, SSH can be enabled by placing a file named ssh, without any extension, onto the boot partition of the SD card. When the Pi boots, it looks for the ssh file. If it is found, SSH is enabled, and the file is deleted. The content of the file does not matter: it could contain text, or nothing at all.


bootパーティションにsshという名前のファイルを作ればいいみたいです

拡張子のないただのsshファイルであることに注意して下さい

3cae33ae-6976-67f2-b526-4d1e570e85a8.png


起動

できたmicroSDHCカードをRaspberry Piに挿入してEthernetケーブルを接続し、電源を接続します

dhcpとsshdが自動起動しているはずなのでDHCPサーバがあればIPが振ってきてSSHできるはずです

ただし、ディスプレイが無いのでRaspberry PiのIPをどうにかして調べないといけません

ぼくはルータ管理画面のDHCPの払い出し状況からIPを調べました

デフォルトのユーザ名はpi、パスワードはraspberryだそうです

$ ssh pi@192.168.0.12

The authenticity of host '192.168.0.12 (192.168.0.12)' can't be established.
ECDSA key fingerprint is XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX.Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '
192.168.0.12' (ECDSA) to the list of known hosts.
pi@192.168.0.12'
s password:

The programs included with the Debian GNU/Linux system are free software;the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.

SSH is enabled and the default password for the 'pi' user has not been changed.
This is a security risk - please login as the 'pi' user and type 'passwd' to set a new password.

pi@raspberrypi:~ $

無事つながりました


初期設定

UbutuやDebianと同じ部分はメモ程度にしておきます


使用VRAM削減

$ sudo raspi-config

-> Advanced Option->Memory Split

最小値は16MBらしく、16MB以下にしても反映されないみたいです

Memory split with less video memory ?


swapの無効化

swapでmicroSDHCを使うと寿命が縮まりそうなのでswapを無効にします

今回はVPNだけに使うのでメモリには余裕があると思います

自分の使い方と相談で

Raspberry Pi -RASPBIAN- のswapを無効化

完全に使わないなら削除してもいい

$ sudo apt-get remove dphys-swapfile


パッケージの削除

このあたりを参考に要らなそうなパッケージを削除しました

今回はVPNだけに使うのでガリガリ消します

GithubGist/minimal-raspbian2.sh

【Rasbian】CUI運用しているので色々して軽量化する

ただしSoftEtherVPNをmakeするのでgccとかは削除してはダメです

面倒なら要らないものをぜーんぶ削除した後に

$ sudo apt-get install build-essential

で開発環境を入れるのもありだと思います


初期設定後

最終的にこんな感じになりました

$ free -h

total used free shared buffers cached
Mem: 973M 68M 904M 6.4M 5.7M 33M
-/+ buffers/cache: 29M 944M
Swap: 0B 0B 0B

$ df -h

Filesystem Size Used Avail Use% Mounted on
/dev/root 29G 659M 28G 3% /
devtmpfs 483M 0 483M 0% /dev
tmpfs 487M 0 487M 0% /dev/shm
tmpfs 487M 6.5M 481M 2% /run
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/mmcblk0p1 41M 21M 21M 51% /boot


SoftEtherVPN


ネットワーク設定

DHCPがある前提で設定をします

まずはブリッジに必要なbridge-utilsをインストールします

$ sudo apt-get install bridge-utils

Raspberry Pi 2とSoftEther VPNを使ってVPNサーバーを構築しよう!

DHCPでIPが振られるNICをeth0からbr0に変更し、eth0とbr0をブリッジします

tapデバイスはSoftEther起動時にSoftEther自身が毎回作るため、ここで設定せずスクリプトにするそうです



  • hwaddress ether XX:XX:XX:XX:XX:XXについて

MACアドレスを固定せずにブリッジを作ると再起動時にMACアドレスが変わるため

DHCPから降ってくるアドレスが変わってしまうことが結構あります

arpテーブルがうまくいかないこともあるので固定してしまったほうが良いようです


/etc/network/interfaces

# 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 lo
iface lo inet loopback

iface eth0 inet manual

allow-hotplug wlan0
iface wlan0 inet manual
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
allow-hotplug wlan1
iface wlan1 inet manual
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

auto br0
iface br0 inet dhcp
hwaddress ether XX:XX:XX:XX:XX:XX
bridge_ports eth0


再起動後ifconfigでbr0ができているか確認します

$ ifconfig |grep Ethernet

br0 Link encap:Ethernet HWaddr XX:XX:XX:XX:XX:XX
eth0 Link encap:Ethernet HWaddr XX:XX:XX:XX:XX:XX
wlan0 Link encap:Ethernet HWaddr XX:XX:XX:XX:XX:XX


ダウンロード

以下からSoftEther VPN Serverをダウンロードします

SoftEther ダウンロード センター

ソフトウェア:SoftEtherVPN(Freeware)

コンポーネント:SoftEther VPN Server

プラットフォーム:Linux

CPU:ARM EABI(32bit)

sshクライアント側でURLをコピーしてwgetすると簡単だと思います

展開したらどこかに置きます

今回は/usr/local/bin/に置きました

$ wget http://jp.softether-download.com/files/softether/v4.22-9634-beta-2016.11.27-tree/Linux/SoftEther_VPN_Server/32bit_-_ARM_EABI/softether-vpnserver-v4.22-9634-beta-2016.11.27-linux-arm_eabi-32bit.tar.gz

$ tar -zxvf softether-vpnserver-v4.22-9634-beta-2016.11.27-linux-arm_eabi-32bit.tar.gz
$ sudo mv vpnserver/ /usr/local/bin/


make

$ sudo cd /usr/local/bin/vpnserver/

$ sudo make

makeにコケたらsudo apt-get install build-essentialすれば必要物が入ると思います

binutilsgccがあれば大丈夫です

$ sudo chmod 600 *

$ sudo chmod 700 vpncmd
$ sudo chmod 700 vpnserver


起動スクリプト

これを参考にしました というかパス以外同じです

Raspberry Pi 2とSoftEther VPNを使ってVPNサーバーを構築しよう! - 起動スクリプトを用意する

sudo modprobe tunがミソみたいです


/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/bin/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}'`
/sbin/brctl addif br0 $tap
;;

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


スクリプトができたら実行権限を与え自動起動登録し

再起動します

$ sudo chmod +x /etc/init.d/vpnserver

$ sudo insserv vpnserver
$ sudo reboot

ちゃんと起動できているか確認します

$ ps aux| grep vpn

root 764 0.0 0.0 5580 612 ? S<s 15:34 0:00 /usr/local/bin/vpnserver/vpnserver execsvc
root 765 3.2 1.3 29328 13400 ? S<l 15:34 0:01 /usr/local/bin/vpnserver/vpnserver execsvc

大丈夫そうです


設定

ここからはSoftEther VPN Server Manager for Windowsを使用して設定を行います

IPアドレスを入力して管理したいVPN Serverを登録します

初回接続なので管理者パスワードの設定を行います

image

☑リモートアクセスVPNサーバー

image

SoftEther VPN Clientが使えない/使わない場合や

iPhoneやAndroidから接続したい場合はL2TP/IPSecを有効にします

image

今回はケーブルをつなぐだけで接続できちゃう、という拠点を作るためにVPN Azureも有効にします

ただしVPN AzureはSoftEther VPN Clientからでないと繋がりません

image

次にローカルブリッジ設定を行います

これをしないと

クライアントからVPN Sererへの接続、VPN ServerのあるLANへの接続ができません

tapデバイスを作ってブリッジを行う必要があります

image

ここで再起動します

再起動後、brctlでブリッジが正しく動作しているか確認します


  • interfasesで作成したbr0がある

  • Ethernetのeth0がある

  • SoftEtherVPNのローカルブリッジで作成したtapがある(tap_NAMEという名前で作成される)

ならば問題ないはずです

$ brctl show br0

bridge name bridge id STP enabled interfaces
br0 XXXX.XXXXXXXXXXXX no eth0
tap_vlan


セットアップ後のリソース

ここまででメモリ使用量が100MB以下、ディスク使用量が800MB強にできました

build-essentialを消してしまえばもう少し削減できそうです

今後は接続速度やCPU使用率を計測したいところですが回線が無いので今はできません

$ free -h

total used free shared buffers cached
Mem: 973M 94M 878M 6.5M 6.9M 42M
-/+ buffers/cache: 45M 927M
Swap: 0B 0B 0B

$ df -h

Filesystem Size Used Avail Use% Mounted on
/dev/root 29G 814M 27G 3% /
devtmpfs 483M 0 483M 0% /dev
tmpfs 487M 0 487M 0% /dev/shm
tmpfs 487M 6.5M 481M 2% /run
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/mmcblk0p1 41M 21M 21M 51% /boot


ログ保存無効

microSDHCカードへの書き込みを抑えるためにログを保存しないようにします

image


速度測定

サーバ
クライアント

回線
光 1Gbps
光 1Gbps

OS
Raspbian Jessie Lite 2017-04-10
Windows 10 Pro 1607

VPN
SoftEther VPN Server (Ver 4.22, Build 9634, beta)
SoftEther VPN Client (Ver 4.22, Build 9634, beta)

方法
iperf version 2.0.5
iperf version 2.0.5(Windows Subsystem for Linux)

$ iperf -c 192.168.X.X

------------------------------------------------------------
Client connecting to 192.168.X.X, TCP port 5001
TCP window size: 512 KByte (default)
------------------------------------------------------------
[ 3] local 192.168.X.X port 62071 connected with 192.168.X.XX port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-10.0 sec 64.1 MBytes 53.6 Mbits/sec

50Mbps超えとなかなか高速です

測定中はCPU使用率が90~100%でした

やはりボトルネックはCPUのようです

測定中のCPU使用率はvpnserverが9割、iperfが1割程度でした

そのため実使用の最高速度は1割程度の向上があるかもしれません