今回は、外出先から家のPCにアクセスするために Raspberry Pi を VPN(Virtual Private Network) サーバーにしてみたいと思います。
SotfEther VPN というOSSのVPNソフトがありますので、それを今回は使用してみる事にします。

以下の要件を満たす事が可能な環境を構築する事を目指します。

・PCの電源が落ちていれば外出先から電源投入できる(Wake On LAN)。
・外出先からPCにスマホのリモートデスクトップアプリでアクセスできる。
・外出先から前回作ったwebブラウザで Raspberry Pi を操作できる。
・セキュリティとかあんまり詳しくないので、そのあたりは良きに計らってくれる。

◆VPN(SoftEther) サーバーソフトのインストール
https://ja.softether.org/4-docs/1-manual/7/7.3 を参考にインストールしました。

http://www.softether-download.com/ja.aspx から SoftEther VPN Server の ARM EABI 版をダンロードし、展開します。
(現時点の最新は v4.15-9546-beta-2015.04.05 でした)
$ wget http://jp.softether-download.com/files/softether/v4.15-9546-beta-2015.04.05-tree/Linux/SoftEther_VPN_Server/32bit_-_ARM_EABI/softether-vpnserver-v4.15-9546-beta-2015.04.05-linux-arm_eabi-32bit.tar.gz

$ tar xvzf softether-vpnserver-v4.15-9546-beta-2015.04.05-linux-arm_eabi-32bit.tar.gz
$ cd vpnserver/
$ make

後は、何回か「1」を押してもらえればいいです。。


公式のマニュアルでは vpnserver は /usr/local/vpnserver に移動させていますが、自分は /home/pi/local/vpnserver に移動しておきます。(個人的な趣味です。)

公式マニュアルに従って、root のみ実行可能なように権限変更を行なっておきます。
$ mv vpnserver /home/pi/local/vpnserver

$ cd /home/pi/local/vpnserver/
$ chmod 600 *
$ chmod 700 vpncmd vpnserver

$ cd ../
$ sudo chown -R root:root vpnserver/
vpncmd の check コマンドで動作チェックできます。
$ cd /home/pi/local/vpnserver/
$ sudo ./vpncmd

◆VPN のスタートアップスクリプトを登録

公式のスタートアップスクリプトやその他諸々を参考に書きました。

/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
# Description:    SoftEther VPN Server
### END INIT INFO

DAEMON=/home/pi/local/vpnserver/vpnserver
LOCK=/var/lock/vpnserver

vpn_start() {
    ${DAEMON} start
}

vpn_stop() {
    ${DAEMON} stop
}

test -x ${DAEMON} || exit 0

case "$1" in
start)
    vpn_start
    touch ${LOCK}
    ;;
stop)
    vpn_stop
    rm ${LOCK}
    ;;
restart)
    vpn_stop
    sleep 3
    vpn_start
    ;;
*)
    echo "Usage: $0 {start|stop|restart}"
    exit 1
esac

exit 0

上記を実行権限を与えて、 /etc/init.d/ 直下に移動し、ブート時に自動起動するように登録します。
$ curl -O http://sstea.blog.jp/raspi/script/vpnserver
$ chmod 755 vpnserver

$ sudo mv vpnserver /etc/init.d/
$ sudo chkconfig --add vpnserver

VPNサービスを開始します。再起動でもいいです。ブート時に自動起動するので。
$ sudo /etc/init.d/vpnserver start

◆VPNの設定
VPNの設定は Windows 側から行なえるので楽でした。

http://www.softether-download.com/ja.aspx から「SoftEther VPN Server Manager for Windows」をダンロードし、windows マシンにインストールし、管理ツールを実行します。

(A-1) 「新しい接続設定」ボタンを押下
(A-2) 「新しい接続設定の作成」ウィンドウが出るので、[接続設定名], [ホスト名] をそれぞれ入力し、[OK]
(A-3) 「接続」ボタンを押下
ss_softether01
ss_softether02
(B-1) メインのウィンドウ(「VPN サーバー管理マネージャ」)が出るので、「仮想 HUB の作成」ボタンを押下
(B-2) 「仮想 HUB の新規作成」ウィンドウが出るので、[仮想 HUB 名] を入力し、[OK]
ss_softether03
ss_softether04

(C-1) メインウィンドウに戻り、「仮想 HUB の管理」ボタンを押下
(C-2) 適宜「ログ保存設定」を設定(変更しなくても可)
(C-3) 「仮想 HUB の管理」ウィンドウが出るので、「ユーザーの管理」ボタンを押下
ss_softether05

(D-1) 「ユーザーの管理」ウィンドウが出るので、「新規作成」ボタンを押下
(D-2) [ユーザーの新規作成]ウィンドウが出るので、[ユーザー名], [パスワード] を入力し、[OK]
ss_softether06
ss_softether07

(E-1) メインウィンドウに戻り、「IPsec / L2TP 設定」ボタンを押下
(E-2) 「IPsec / L2TP / EtherIP / L2TPv3 設定」ウィンドウが出るので、[L2TP サーバー機能を有効にする(L2TP over IPsec)] をチェック
(E-3) [IPsec 共通設定]->[IPsec 事前共有鍵] を入力し、[OK]
ss_softether08

(F-1) メインウィンドウに戻り、「ローカルブリッジ設定」ボタンを押下
(F-2) 「ローカルブリッジ設定」ウィンドウが出るので、[新しいローカルブリッジの定義]->[仮想 HUB] を選択
(F-3) [作成する種類] で「物理的な既存の LAN カードとのブリッジ接続」を選択
(F-4) 「ローカルブリッジを追加」ボタンを押下
ss_softether09

(G-1) メインウィンドウに戻り、「ダイナミック DNS 設定」ボタンを押下
(G-2) 「ダイナミック DNS 設定」ウィンドウが出るので、[設定の変更]->[ダイナミック DNS ホスト名の変更] を入力
(G-3) 「上記の DNS ホスト名に変更する」ボタンを押下
ss_softether10

◆ルーターの設定
外出先から Raspberry Pi にアクセスするためには、ルーターのポートを開放しておく必要があります。
L2TP/IPSec を使用する場合、500(UDP) と4500(UDP) の2つのポートを開放する必要があります。

ルータによって「ポートフォワーディング」とか「ポートマッピング」とかで設定できるはずです。
ちなみに、うちにあるルーター(CG-WLR300NM)の場合は、[詳細設定] ->[バーチャル・サーバ(ポート開放)] で設定しました。

だいたいのルーターは設定後、ルーターを再起動させれば反映されると思います。

◆VPN接続テスト
スマホ側からVPN接続できるか確認してみます。
下記は Xperia Z3 の場合の設定例です。

(1) [設定]->[Wi-Fi] を OFF (同一LAN 内の場合)

(2) [設定]->[その他の設定]->[VPN] に移動

(3) [VPNプロフィールの追加]
     「名前」を適宜入力
     「タイプ」に [L2TP/IPSec PSK] を設定
     「サーバーアドレス」に (G-2) で入力したホスト名を入力
     「IPSec事前共有鍵」に (E-3) で入力した事前共有鍵を入力
ss_xperia_vpn01

(4) 追加したVPNプロフィールに接続
      「ユーザー名」、「パスワード」に (D-2) で入力したユーザー名、パスワードを入力し、接続


VPN接続が正常に行なえたなら、リモートデスクトップ、WOLもアプリ入れればローカルIPアドレスで可能と思います。
※ただし現段階では、VPN 経由での前回作ったwebブラウザ経由での Raspberry Pi 操作ができません。

ちょっと長くなってきたので、今回はここまでです。
次回、上記課題の解決を試みます。