Raspberry Pi3(Ubuntu18.04LTS)でSoftEther VPN

#はじめに
[Raspberry Pi 2とSoftEther VPNを使ってVPNサーバーを構築しよう！](https://qiita.com/neronplex/items/84162ec1de520bb75a11)
のRaspberry Pi 3(Ubuntu18.04版)です。

####まずはここまで
[Raspberry Pi3にUbuntu18.04LTSをインストール](https://qiita.com/devzooiiooz/items/b5c1b0a4f03514447260)

####複数ネットワークをブリッジさせるためのパッケージをインストール
```sh:
$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の使い方](https://www.komee.org/entry/2018/06/12/181400)]を参考にブリッジインターフェイスの設定をします。

```sh:/etc/netplan/network.yaml
# 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ダウンロードセンター](http://www.softether-download.com/ja.aspx?product=softether)で
コンポーネント「SoftEther VPN Server」
プラットフォーム「Linux」
CPU「ARM EABI (32bit)」
で出てきたダウンロードURLをwgetでダウンロードする。
(2018/08/21 現在)

```sh:
$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、パーミッション変更）
初期のままだとコンパイルに必要なものが色々が入っていないのでインストールする。

```sh:
$sudo apt install gcc make make-guile libssl-dev
```
#####カーネルを調べる。

```sh:
$uname -r
```
#####linux-hedersにシンボリックリンクを張る。
```sh:
$sudo ln -s /usr/src/linux-headers-$(uname -r)/ /lib/modules/$(uname -r)/build
```
#####解凍

```sh:
$tar -xzvf softether-vpnserver-v4.27-9668-beta-2018.05.29-linux-arm_eabi-32bit.tar.gz
```
#####make

```sh:~/
$cd ~/vpnserver/
$make
(色々同意を求められるので1を選択しておけばOK)
```
#####解凍してできたvpnserverフォルダを/usr/local/に移動

```sh:~/
$sudo mv vpnserver/ /usr/local/
```

#####パーミッションを変更

```sh:
$cd /usr/local/vpnserver/
$sudo chmod 600 *
$sudo chmod 700 vpncmd
$sudo chmod 700 vpnserver
```

#####起動スクリプトを/etc/init.dに作成
"[こちら](https://qiita.com/neronplex/items/84162ec1de520bb75a11)"の「起動スクリプトを用意する」まんまです。

```sh:/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 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に登録

```sh:
$sudo chmod +x /etc/init.d/vpnserver
$sudo update-rc.d vpnserver defaults
$sudo reboot
```
#####リブート後ちゃんと起動しているか確認。

```sh:
$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デバイス](https://blog.treedown.net/entry/2016/09/10/010000)

###SoftEther VPN Server Manager for Windowsで設定
softether VPNをwindowsから設定します。vpncmdでlinuxから設定することもできなくもないですが、訳がわからなくなるためLAN上のwindowsで設定したほうがいいです。

手順としては
1）仮想HUB（名称は適当に「VPN」などとする）を作成し、ログインユーザーの設定を行う。
２）ローカルブリッジ設定で新しいローカルブリッジの定義をする。
  このとき、仮想HUBは１で定義した「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
```
とすると作成したブリッジとして定義したｂｒ０が、eth0とtap_vlanとつながっていることがわかります。

この設定をすることによって、vpn serverにも接続できるようになります。

###参考
[SoftEther VPN Server Manager for Windows](https://qiita.com/naoyoshinori/items/aab1b3cc0a31dfc3557b)
[TUN/TAPドライバ](http://kaizawa2.hatenablog.jp/entry/2012/07/16/231038)
[RaspberryPiでSoftetherで必須なtapデバイス](https://blog.treedown.net/entry/2016/09/10/010000)