はじめてのラズパイ③~SoftEtherVPN接続・切断~


ラズパイでSoftEtherVPNを構築しました。
はじめて行うので間違っている点ありましたらご指摘ください:tea:

# 前回
↓文字化けちゃってますね...

https://qiita.com/sgash708/items/d849541c77a7873ef519


# TODO
* VPN接続
* VPN切断

# 前提
|    | 技術  |
| ---- | ---- |
|  OS  |  Ubuntu Server 20.10  |
|  サーバ  |  raspberry pi 4B(RAM 4GB)(arm64)  |
|  クライアント  |  macOS Big Sur 11.2.2  |

Catalinaでも動作確認が取れました。
初期設定を終えた状態で作成してください。

https://qiita.com/sgash708/items/9e2764cba5d85179721d

# 手順
iPhoneでテザリングして進めています。
お手持ちのスマホなどで検証してみてください。

## 1. VPN接続

```zsh
% brew install --cask tuntap
% cd /usr/local/vpnclient
% sudo ./vpnclient start
% sudo ./vpncmd
### 略 ###
1. Management of VPN Server or VPN Bridge 
2. Management of VPN Client
3. Use of VPN Tools (certificate creation and Network Traffic Speed Test Tool)

Select 1, 2 or 3: 2

接続先の VPN Client が動作しているコンピュータの IP アドレスまたはホスト名を指定してください。
何も入力せずに Enter を押すと、localhost (このコンピュータ) に接続します。
接続先のホスト名または IP アドレス: localhost

VPN Client "localhost" に接続しました。

VPN Client>AccountConnect AC_SAMPLE
AccountConnect コマンド - 接続設定を使用して VPN Server へ接続を開始
コマンドは正常に終了しました。
VPN Client>AccountStatusGet AC_SAMPLE
AccountStatusGet コマンド - 接続設定の現在の状態の取得
接続設定の名前: AC_SAMPLE

項目                          |値
------------------------------+------------------------------------------------------------------------
接続設定名                      |AC_SAMPLE
セッション接続状態               |接続完了 (セッション確立済み)
VLAN ID                       |－
サーバー名                      |sample-dns.softether.net
ポート番号                      |TCP ポート 443
サーバー製品名                   |SoftEther VPN Server (32 bit)
### 略 ###
```

ここまででVPN接続が完了しました。
以降は、

* tap0にIP割当
* ルーティング追加
* 既存デフォルトゲートウェイ削除
* 新規デフォルトゲートウェイ追加

を行います。

```zsh
% sudo ipconfig set tap0 DHCP
# 数秒待つこと
% ifconfig tap0
tap0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
	ether 　xx:xx:xx:xx:xx:xx 
	inet 192.168.3.10 netmask 0xffffff00 broadcast 192.168.3.255
	media: autoselect
	status: active
	open (pid 33333)
```

```zsh
% netstat -nr | grep -E 'default(.)*en0' | awk '{print $2}'
192.168.3.1
# GlobalIP
% route -n get sample-dns.softether.net | grep 'route to:' | awk '{print $3}'
60.xxx.xxx.xxx
% sudo /sbin/route add -net 192.168.3.1 60.xxx.xxx.xxx 255.255.255.255
add net 60.xxx.xxx.xxx: gateway 172.20.10.xxx
% sudo route -n delete default
delete net default
% sudo route add default 192.168.3.1
add net default: gateway 192.168.3.1
```

```zsh
% netstat -nr
Routing tables

Internet:
Destination        Gateway            Flags        Netif Expire
default            192.168.3.1        UGSc          tap0       
default            192.168.3.1        UGScI         tap0       
60.xxx.xxx.xxx/32  172.99.xx.xx        UGSc           en0
# ↓ローカルPCのIP
192.168.3.10/32    link#18            UCS           tap0      !
```

上記が完了すると、ラズパイ本体にSSH等して作業可能になります。
IPが変わったのでVPN接続できていることが確認できますね:tea:

## 2. VPN切断
接続と逆の手順で切断を行います。

```zsh
% pwd
/usr/local/vpnclient
% sudo ./vpncmd
### 略 ###
1. Management of VPN Server or VPN Bridge 
2. Management of VPN Client
3. Use of VPN Tools (certificate creation and Network Traffic Speed Test Tool)

Select 1, 2 or 3: 2

接続先の VPN Client が動作しているコンピュータの IP アドレスまたはホスト名を指定してください。
何も入力せずに Enter を押すと、localhost (このコンピュータ) に接続します。
接続先のホスト名または IP アドレス: localhost

VPN Client "localhost" に接続しました。

VPN Client>AccountDisConnect AC_SAMPLE
AccountDisconnect コマンド - 接続中の接続設定の切断
コマンドは正常に終了しました。
```

以降は、

* vpnclient停止
* 新規デフォルトゲートウェイ削除
* 既存(旧)デフォルトゲートウェイ追加

```zsh
% pwd
/usr/local/vpnclient
% sudo ./vpnclient stop
Stopping the SoftEther VPN Client service ...
SoftEther VPN Client service has been stopped.
```

```zsh
# GlobalIP
% route -n get sample-dns.softether.net | grep 'route to:' | awk '{print $3}'
60.xxx.xxx.xxx
% netstat -nr | grep -E "60.xxx.xxx.xxx(.)*en0" | awk '{print $2}'
172.20.10.xxx
% sudo /sbin/route -n delete -net 60.xxx.xxx.xxx 172.20.10.xxx 255.255.255.255
delete net 60.xxx.xxx.xxx: gateway 172.20.10.xxx
% sudo route add default 
add net default: gateway 172.20.10.xxx
```

## おまけ
<code>sleep</code>は適宜長めにとるのもありですね！

https://github.com/sgash708/softetherVPN_con_discon

```shell:vpn_set.sh
#!/bin/sh -e

VPNPATH=/usr/local/vpnclient
VPNCLIENT=${VPNPATH}/vpnclient
VPNCMD=${VPNPATH}/vpncmd
SERVER="`route -n get sample-dns.softether.net | grep 'route to:' | awk '{print $3}'`"
NEW_DEFROUTE="192.168.3.1"
NET_MASK="255.255.255.255"
VPNNAME="AC_SAMPLE"
VPNUP=`ps -ef | grep vpnclient | grep -v grep | wc -l`

case "$1" in
  start)
    if [ $VPNUP = 0 ]; then
      sudo -S ${VPNCLIENT} start
      sudo ${VPNCMD} << EOF
2
localhost
AccountConnect ${VPNNAME}
AccountStatusGet ${VPNNAME}
EOF

      # DHCPによるIPアドレスの取得
      sudo ipconfig set tap0 DHCP
      sleep 3
      CURRENT_DEFROUTE=`netstat -nr | grep -E 'default(.)*en0' | awk '{print $2}'`
      # 静的ルーティング追加
      sudo /sbin/route add -net $SERVER $CURRENT_DEFROUTE $NET_MASK
      # 既存デフォルトゲートウェイ削除
      sudo route -n delete default
      sleep 10
      sudo route add default $NEW_DEFROUTE
    else
      echo "VPN Client has already started."
      exit 1
    fi
    ;;
  stop)
    if [ $VPNUP = 0 ]; then
      echo "VPN client has already stoped."
      exit 1
    else
      ${VPNCMD} << EOF
2
localhost
AccountDisconnect ${VPNNAME}
AccountStatusGet ${VPNNAME}
EOF
    
      sudo -S ${VPNCLIENT} stop
      sleep 1
      NEW_DEFROUTE=`netstat -nr | grep -E "${SERVER}(.)*en0" | awk '{print $2}'`
      sudo /sbin/route -n delete -net $SERVER $NEW_DEFROUTE $NET_MASK
      sleep 1
      sudo route add default $NEW_DEFROUTE
    fi
    ;;
  restart)
    $0 stop
    sleep 3
    $0 start
    ;;
  *)
    echo "Usage: vpn.sh {start|stop|restart}"
    exit 1
    ;;
esac

```

## 感想
<code>tap0</code>に動的IPが振られない状態(APIPA)になり数週間悩みました。
だれかの助けになって最速で構築できることを願います！！！
今後もラズパイシリーズとして続けて行けていきます:smile:
（k8sとかやってみたい...）

## 参考文献

https://qiita.com/ask/items/9ff1529d228ec093aa07