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

  • 68
    Like
  • 0
    Comment
More than 1 year has passed since last update.

かっこいいから、ただそれだけ

ちょっと前にRaspberry Pi2が発売されました。エンジニアとして仕事をし出してからはLinuxにも触れるようになり、設定の過程で詰まることは無いだろうと思い1つ買ってみたのですが、余ったHDDで簡易的なNASを作れちゃったりと便利ですよね。消費電力も少ないので常時稼働させてもお財布に優しいですし。

そして、今回は単にかっこいいからという理由だけで、ラズパイでVPNサーバーを構築して、外から接続して遊べるようにしてみました。

ではやってみよう!

まずは、VPNサーバー用にラズパイのネットワーク構成を変更します。次に、SoftEther VPNのビルドを行い、起動スクリプトを用意します。最後に、管理ツールを使ってVPNサーバーのセットアップを行います。

ネットワーク構成を変更する

まず大まかにどのような構成にするのかを確認していきます。SoftEtherではSoftEtherの中で作成する仮想ハブと、デバイスに認識されているNICをブリッジするのですが、直接LANとつながっているNICとブリッジを設定してしまうと、Linuxの仕様でNICに設定しているIPアドレスに接続することができず1、ラズパイの上で展開しているSambaなどに接続することができなくなってしまいます。

そこで、物理NICの他にVPN用の仮想NIC(tapデバイス)を設定し、その2カ所をブリッジでつないで双方に行き来できるようにします。この状態で仮想NICとVPNサーバーをブリッジしてやると、問題なくSambaなどにも接続することができるようになります。

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

まずは、複数のNICをブリッジするために必要なパッケージをインストールします。

Terminal
sudo apt-get install bridge-utils

/etc/network/interfacesを編集する

次に、/etc/network/interfacesを編集してネットワークの構成を変えていきます。

/etc/network/interfaces
# loopback
auto lo
iface lo inet loopback

# Ethernet port
auto eth0
iface eth0 inet manual

# Bridge interface
auto br0
iface br0 inet dhcp
bridge_ports eth0

#その他
allow-hotplug wlan0
iface wlan0 inet manual
wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp

eth0とbr0をデフォルトの状態から変更していきます。eth0がラズパイに接続されている物理NICを指し、br0が新しく追加しているブリッジを指しています。

まず、eth0は初期状態でdhcpによって自動的にIPアドレスが振られるようになっていますが、橋渡しを行うブリッジにIPアドレスを振るようにするためiface eth0 inet manualに変更します。

次に、br0にIPアドレスを振るため、iface br0 inet dhcpに設定します。そして、bridge_ports eth0でeth0とブリッジを張るように設定します。当方の環境ではルーターのDHCPサーバーにて、IPアドレスを固定割り当てするようにしているため、今回はDHCPに設定していますが、環境に応じて任意のIPアドレスを使うよう手動設定することもできます。

なお、この段階では仮想NICをブリッジするように設定はしていませんが、tapデバイスはSoftEtherの起動する段階で毎回作成される都合上、起動スクリプトがブリッジをするように設定するので、ここでの設定は必要ありません。

SoftEtherのインストール

次に、SoftEtherをインストールしていきます。SoftEtherのダウンロードページから最新のパッケージURLを確認して、wgetでダウンロードします。CPUは"ARM EABI (32bit)"を選択しましょう。解凍してできたフォルダvpnserver/usr/local/に移動しmakeを実行します。ビルドの過程で自動的に環境チェックもやってくれます。最後にパーミッションを変更すれば完了です。

Terminal
cd /usr/local/vpnserver
chmod 600 *
chmod 700 vpncmd
chmod 700 vpnserver

起動スクリプトを用意する

次に、/etc/init.d/vpnserverへ起動スクリプトを用意します。起動スクリプトはこちらを参考にさせていただきました。

/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}'`
/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

ここで重要なのが、スクリプトの中でSoftEtherが起動する処理の前にsudo modprobe tunを追記することです。仮想NICであるtapデバイスを作成するためには特定のカーネルモジュールがロードされている必要があるのですが、どうやら初期状態のラズパイではこれが起動時にロードされないようになっています2。そのため、こちらでモジュールをロードするように設定してやらないと、tapデバイスの追加に失敗します。

lsmodを実行してみて一覧にtunというモジュールがない場合、sudo modprobe tunを起動スクリプトに組み込んで、SoftEtherの起動時にモジュールがロードされるようにするか、/etc/modulesを編集してtunを追加することで、OSの起動時にモジュールを自動でロードするようになります。

起動スクリプトの編集が終わったら、スクリプトに実行権限を与えて登録します。その後にラズパイを再起動しましょう。

Terminal
sudo chmod +x /etc/init.d/vpnserver
sudo update-rc.d vpnserver defaults
sudo reboot

サーバーのセットアップを行う

最後にVPNサーバーのセットアップを行います。vpncmdを使ってセットアップしてもいいのですが、めんどくさそうなのでWindows向けに公開されているサーバーの管理マネージャを使いましょう。Macの人でもEasyWineを使えばexeファイルを実行できます。設定手順はすでに詳しく書かれている記事があるため、そちらを参考にして設定しましょう。

ポートフォワードを設定する

あとは、ルーターからラズパイに対してポートフォワードを設定すれば、外部から接続することができるようになります。ラズパイに対してルーターから固定IPアドレスを振り出すように設定してから、そのIPアドレスに対してUDPの500番と4500番ポートをフォワードするように設定します。

これで、DDNSの設定画面で割り当てられたサブドメインを使って、外部からVPNサーバーにアクセスすることができるようになります。クライアントで接続情報を設定する際、通信プロトコルはL2TPを指定しましょう。

脚注