退役させたSSL-VPN環境をやっぱりRaspberry Pi 3を使って復活させる

機器の老朽化に伴って退役させたSSL-VPN環境をやっぱり復活させることにした

どうして?

  • とある場所(ホテル)で提供されているインターネット環境でVPN接続が遮断されていた
  • 大規模な震災を目の当たりにすると災害対応等でアクセスラインはやっぱり複数持っておくべき
  • YAMAHA製VPNクライアントではインターネットに出られなくなった(YMS-VPN7→YMS-VPN8)

どうやって実現しよう?

  • ここのところRaspberry Piを触っていない
  • SoftEtherなら
    • SSL-VPNに対応している(これ必須)
    • オープンソース版がある
    • MS-SSTP(Microsoft Secure Socket Tunneling Protocol)にも対応しているようだ(今後の布石として)
  • イニシャルコストもランニングコストも抑えておきたい

おっ やりたいこと全部できるじゃんということで
Raspberry Pi 3 + SoftEther VPN オープンソース版
で構築することにした

設定メモ

Raspberry Pi 3をRaspbianで動かす

GUIは必要ないのでRASPBIAN STRETCH LITEでいい

OSイメージをダウンロードする

RASPBIAN STRETCH LITE(Minimal image based on Debian Stretch Version:April 2018)

ダウンロードしたOSイメージをmicroSDに書き込む

$ diskutil list
/dev/disk4 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *15.6 GB    disk4
   1:             Windows_FAT_32 boot                    43.8 MB    disk4s1
   2:                      Linux                         15.5 GB    disk4s2

$ sudo diskutil unmountDisk /dev/disk4
Password:
Unmount of all volumes on disk4 was successful

$ sudo dd bs=1m if=~/Downloads/2018-04-18-raspbian-stretch-lite.img of=/dev/rdisk4
1776+0 records in
1776+0 records out
1862270976 bytes transferred in 163.940909 secs (11359404 bytes/sec)

SSH接続も有効化しておく

$ diskutil list
/dev/disk4 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *15.6 GB    disk4
   1:             Windows_FAT_32 boot                    43.8 MB    disk4s1
   2:                      Linux                         1.8 GB     disk4s2

$ touch /Volumes/boot/ssh

$ sudo diskutil unmountDisk /dev/disk4
Unmount of all volumes on disk4 was successful

起動したRaspberry Pi 3に接続する

$ ssh [email protected]

初期パスワード:raspberry

Raspbianの設定をしていく

[必須]パスワードの変更

初期状態のままだとraspberryになっているので必ずパスワードを変更する

$ passwd
Changing password for pi.
(current) UNIX password:
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully

[必須]SSH公開鍵認証にする

端末側の共有鍵を送る

$ scp .ssh/id_rsa.pub [email protected]:

SSH証明書ログインを有効にする

$ mkdir ~/.ssh

$ chmod 700 ~/.ssh

$ mv ~/id_rsa.pub ~/.ssh/authorized_keys

$ chmod 600 ~/.ssh/authorized_keys

$ sudo nano /etc/ssh/sshd_config
RSAAuthentication yes
PubkeyAuthentication yes
PermitRootLogin no
AuthorizedKeysFile     %h/.ssh/authorized_keys

$ sudo service ssh restart

※必ず別セッションの接続で接続を確認しておく

とりあえず最新にアップデート

$ sudo apt update

$ sudo apt -y upgrade

$ sudo apt dist-upgrade

$ sudo rpi-update

$ sudo apt -y autoremove

swapを使わない

microSDで起動させているので

$ sudo systemctl disable dphys-swapfile
$ sudo dphys-swapfile swapoff
$ sudo apt -y remove dphys-swapfile

無線LANを無効にする

$ sudo iwconfig wlan0 txpower off

GPUメモリ割り当て変更

$ sudo raspi-config nonint do_memory_split 16

TimeZoneの設定

$ sudo timedatectl set-timezone Asia/Tokyo
$ sudo dpkg-reconfigure -f noninteractive tzdata 

ブリッジを使えるようにする

$ sudo apt -y install bridge-utils

$ sudo nano /etc/network/interfaces
# Bridge
auto br0
iface br0 inet static
    address 192.168.0.254
    netmask 255.255.255.0
    network 192.168.0.0
    broadcast 192.168.0.255
    gateway 192.168.0.1
    dns-nameservers 8.8.8.8 1.1.1.1
    bridge_ports eth0

テンポラリ領域のRAMディスク化

$ sudo nano /etc/fstab
tmpfs           /tmp            tmpfs   defaults,size=32m,noatime,mode=1777  0       0
tmpfs           /var/tmp        tmpfs   defaults,size=16m,noatime,mode=1777  0       0

$ sudo rm -fr /tmp

$ sudo rm -fr /var/tmp

$ sudo reboot

Host名を変更する

$ sudo raspi-config nonint do_hostname softether

SoftEther VPNをインストールする

公式サイト:SoftEtherダウンロードセンター

画面:SoftEtherダウンロードセンター
$ mkdir softether

$ cd softether/

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

$ tar -zxvf softether-vpnserver-v4.27-9668-beta-2018.05.29-linux-arm_eabi-32bit.tar.gz

$ sudo mv vpnserver /usr/local/

$ cd /usr/local/vpnserver

$ sudo make

$ sudo chmod 600 *

$ sudo chmod 700 vpncmd

$ sudo chmod 700 vpnserver

$ sudo nano /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

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

$ sudo update-rc.d vpnserver defaults

$ sudo reboot

SoftEther VPNの設定をする

SoftEther VPN Server Managerをダウンロードして設定する

公式サイト:SoftEtherダウンロードセンター
画面:SoftEtherダウンロードセンター

SoftEtherコンフィグレーションファイルでしか行えない設定

  • SoftEther VPN Server Managerを起動してVPN Serverに接続する
  • 「サーバー情報の参照および設定」の[Config編集]ボタンをクリックする
  • [ファイルに保存]ボタンをクリックするとコンフィグレーションファイルが書き出される
  • エディタで書き出したコンフィグレーションファイルを編集する
  • [ファイルからインポートして書き込み]ボタンをクリックして書き換えたコンフィグレーションファイルを読み込む
ダイナミックDNS機能を無効にする
declare root
{
    declare DDnsClient
    {
        bool Disabled true
    }
}
IPアドレス存在確認ポーリングパケットを停止する

ルータのログなどに「送信元が “172.31.0.0/16” の不正な ARP 要求パケットを受け取った」的な警告メッセージを表示させたくない

declare root
{
    declare VirtualHUB
    {
        declare VPN
        {
            declare Option
            {
                bool NoArpPolling true
            }
        }
    }
}