#はじめに
Raspberry Pi 2とSoftEther VPNを使ってVPNサーバーを構築しよう!
のRaspberry Pi 3(Ubuntu18.04版)です。
####まずはここまで
Raspberry Pi3にUbuntu18.04LTSをインストール
####複数ネットワークをブリッジさせるためのパッケージをインストール
$sudo apt-get install bridge-utils
####/etc/netplan/*.yamlを編集する
デフォルトは50-cloud-init.yamlというファイルですが、ファイル名が気に食わないのでnetwork.yamlに変更しています。50-cloud-init.yamlでも全然かまいません。
ここでは192.168.1.253の固定ipをブリッジ(br0)に振り、物理NIC:eth0はsoftEtherで割り当てるようにします。
[Netplanの使い方]を参考にブリッジインターフェイスの設定をします。
# This file is generated from information provided by
# the datasource. Changes to it will not persist across an instance.
# To disable cloud-init's network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}
network:
version: 2
#eth0はラズパイに接続されている物理NIC
ethernets:
eth0:
dhcp4: no
#br0が新しく追加したブリッジ、こっちに固定でIPを振る
bridges:
br0:
interfaces:
- eth0
addresses:
- 192.168.1.253/24
gateway4: 192.168.1.1
nameservers:
addresses:
- 192.168.1.1
dhcp4: no
###SoftEtherVPNのダウンロードとインストール
#####ダウンロード
こちらのSoftEtherダウンロードセンターで
コンポーネント「SoftEther VPN Server」
プラットフォーム「Linux」
CPU「ARM EABI (32bit)」
で出てきたダウンロードURLをwgetでダウンロードする。
(2018/08/21 現在)
$wget https://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
softether-vpnserver 100%[===================>] 5.40M 3.06MB/s in 1.8s
2018-08-21 09:46:12 (3.06 MB/s) - ‘softether-vpnserver-v4.27-9668-beta-2018.05.29-linux-arm_eabi-32bit.tar.gz’ saved [5664923/5664923]
####インストール(解凍してmake、パーミッション変更)
初期のままだとコンパイルに必要なものが色々が入っていないのでインストールする。
$sudo apt install gcc make make-guile libssl-dev
#####カーネルを調べる。
$uname -r
#####linux-hedersにシンボリックリンクを張る。
$sudo ln -s /usr/src/linux-headers-$(uname -r)/ /lib/modules/$(uname -r)/build
#####解凍
$tar -xzvf softether-vpnserver-v4.27-9668-beta-2018.05.29-linux-arm_eabi-32bit.tar.gz
#####make
$cd ~/vpnserver/
$make
(色々同意を求められるので1を選択しておけばOK)
#####解凍してできたvpnserverフォルダを/usr/local/に移動
$sudo mv vpnserver/ /usr/local/
#####パーミッションを変更
$cd /usr/local/vpnserver/
$sudo chmod 600 *
$sudo chmod 700 vpncmd
$sudo chmod 700 vpnserver
#####起動スクリプトを/etc/init.dに作成
"こちら"の「起動スクリプトを用意する」まんまです。
#!/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 1.0 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
#####スクリプトに実行権限を与えてinit.dに登録
$sudo chmod +x /etc/init.d/vpnserver
$sudo update-rc.d vpnserver defaults
$sudo reboot
#####リブート後ちゃんと起動しているか確認。
$sudo service vpnserver status
● vpnserver.service - LSB: SoftEther VPN RTM
Loaded: loaded (/etc/init.d/vpnserver; generated)
Active: active (running) since Tue 2018-08-21 10:43:16 JST; 1min 17s ago
Docs: man:systemd-sysv-generator(8)
Process: 1201 ExecStart=/etc/init.d/vpnserver start (code=exited, status=0/SUC
Tasks: 31 (limit: 2142)
CGroup: /system.slice/vpnserver.service
├─1307 /usr/local/vpnserver/vpnserver execsvc
└─1308 /usr/local/vpnserver/vpnserver execsvc
###tapデバイスの理解
実はここまででも動くのですが、vpn接続を確立し、LAN内のPCに接続できたりします。
ですが、vpn server自体で動いているサービス(apacheなど)やsshにさえ接続できません。
vpn serverの起動スクリプトにある
# tun/tapモジュールのロード
sudo modprobe tun
とか
# SoftEther VPNで追加した仮想tapデバイス名を調べる
tap=`/sbin/ifconfig -a| awk '$1 ~ /^tap/ {print $1}'`
/sbin/brctl addif br0 $tap
の部分がよくわかっていませんでした。
ここを参照して、やっとブリッジとtapデバイスの仕組みが理解できた(気がします)。
RaspberryPiでSoftetherで必須なtapデバイス
###SoftEther VPN Server Manager for Windowsで設定
softether VPNをwindowsから設定します。vpncmdでlinuxから設定することもできなくもないですが、訳がわからなくなるためLAN上のwindowsで設定したほうがいいです。
手順としては
1)仮想HUB(名称は適当に「VPN」などとする)を作成し、ログインユーザーの設定を行う。
2)ローカルブリッジ設定で新しいローカルブリッジの定義をする。
このとき、仮想HUBは1で定義した「VPN」を選択。
新しいtapデバイス名を例えば「vlan」と名付けると、「tap_vlan」という仮想NICが作成される。
※この部分は慎重に設定を行ってください。間違えると、ネットワークがループしたりします。僕の場合は無線LANのルータを殺してしまい、家中がインターネットに接続できなくなりました。
sudo brctl show br0
bridge name bridge id STP enabled interfaces
br0 8000.96ced9138987 no eth0
tap_vlan
とすると作成したブリッジとして定義したbr0が、eth0とtap_vlanとつながっていることがわかります。
この設定をすることによって、vpn serverにも接続できるようになります。
###参考
SoftEther VPN Server Manager for Windows
TUN/TAPドライバ
RaspberryPiでSoftetherで必須なtapデバイス