SoftEtherでのVPN接続をコマンドから行う - macOS X

# これは何？
macOSからSoftEtherを使ったVPN接続をコマンドから行ったときの手順のメモとスクリプト。

# 前提条件
- macOS X Mojave以降
- システム内でSUDOの権限が付与されていること
- SoftEtherからSoftEther VPN ClientのmacOS版をダウンロードしインストールされ、コマンドが動作すること[（ダウンロードはここから）](https://www.softether-download.com/en.aspx?product=softether) ← 「SoftEther VPN Client」「Mac OS X」「（持ってるmacのタイプを選択）」

# 手順
## SoftEtherVPN Clientの設定
[ここ](https://qiita.com/ask/items/9ff1529d228ec093aa07#softether-vpn-client%E3%81%AE%E8%A8%AD%E5%AE%9A)がとても詳しいのでこちらを参照。

## 起動と停止
シェルスクリプトを実行してVPN接続、切断を行う。なおRouteの追加は手動で行うことを想定している。

コマンド実行にはsudoを実行する権限が必須。

```console:コマンド
# 接続
$ ./activatesoftether.sh on

# 切断
$ ./activatesoftether.sh off
```

スクリプトは以下。事前に実行権限の付与が必須。

```console:コマンド
$ chmod u+x activatesoftether.sh
```

```shell:activatesoftether.sh
#!/bin/bash

set -e
PLATFORM=mac # mac / linux
VPNPATH=[PATH to vpnclient command]/vpnclient_${PLATFORM}
VPNCLIENT=${VPNPATH}/vpnclient
VPNCMD=${VPNPATH}/vpncmd
GATEWAY=[VPN接続後のGateway：一旦接続して調査が必要]
ROUTETO=[VPN接続後、VPNを経由してアクセスするCIDER(例：ROUTETO=192.168.0/24)]
ROUTETOIP=[VPN接続後、VPNを経由してアクセスを行う開始IP(例：ROUTETOIP=192.168.0.0)]
ROUTETOCIDER=[VPN接続後、VPNを経由してアクセスするCIDER(例：ROUTETOCIDER=255.255.255.0)]


ACCOUNTNAME="[ACCOUNT NAME]"

function addDeleteRoute () {
    if [ `netstat -nr |  grep ${GATEWAY%.*} | grep ${ROUTETO} | wc -l` -gt 0 ] ; then
        sudo /sbin/route delete -net ${ROUTETOIP} ${GATEWAY} ${ROUTETOCIDER}
    fi
    case $1 in
        add)
            sudo /sbin/route add -net ${ROUTETOIP} ${GATEWAY} ${ROUTETOCIDER}
            printf "\n"
            echo " ---- >>>> ROUTE ADDED <<<< ----"
            printf "\n"
            ;;
        delete)
            printf "\n"
            echo "  ---- >>>> ROUTE DELETED <<<< ----"
            printf "\n"e
            ;;
    esac
}

case $1 in
    on)
        # Delete Route First
        addDeleteRoute "delete"
        # start vpn client
        echo " -- Connect VPN and Start VPN Client --"
        printf "\n"
        printf "password: "
        read -s pwd
        echo "${pwd}" | sudo -S ${VPNCLIENT} start
        echo "  ---- >>>>  Connected <<<< ----"
        # exec vpncmd
        ${VPNCMD} << EOF
2
localhost
AccountConnect $ACCOUNTNAME
EOF
        # get ip address by dhcp
        echo "${pwd}" | sudo -S ipconfig set tap0 dhcp # for mac
        until [ `netstat -nr |  grep ${GATEWAY%.*} | grep UG | wc -l` -eq 1 ] ;
        do
            printf "."
            sleep 3
        done
        printf "\n\n"
        addDeleteRoute "add"
        echo "  ---- >>>> Connected <<<< ----"
        printf "\n"
        echo "-- [to check and to add route] -----------"
        echo "$ netstat -nr |  grep ${GATEWAY%.*} | grep UG"
        echo "$ sudo /sbin/route add -net ${ROUTETOIP} ${GATEWAY} ${ROUTETOCIDER}"
        echo "-----------------------------"
        ;;
    off)
        # exec vpncmd
        ${VPNCMD} << EOF
2
localhost
AccountDisconnect $ACCOUNTNAME
EOF
        # stop vpn client
        echo "-- Disconnect VPN and Stop VPN Client --"
        printf "\n"
        printf "password: "
        read -s pwd
        echo "${pwd}" | sudo -S ${VPNCLIENT} stop
        addDeleteRoute 'delete'
        echo "  ---- >>>> Disconnected <<<< ----"
        printf "\n"
        echo "-- [to check and to delete route] -----------"
        echo "$ netstat -nr |  grep ${GATEWAY%.*} | grep UG"
        echo "$ sudo /sbin/route delete -net ${ROUTETOIP} ${GATEWAY} ${ROUTETOCIDER}"
        echo "-----------------------------"
        ;;
    *)
        echo "[ERROR] Specify on/off"
        echo "   $ ${0} [on/off]"
esac
```




# Reference
- [MacでSoftEther VPN Clientを使う - Qiita](https://qiita.com/ask/items/9ff1529d228ec093aa07)
- [MACでSoft Ether クライアントVPN|faster than the speed of light](http://faster-than-the-sol.blogspot.com/2017/11/macsoft-ether-vpn.html)
- [ゲートウェイを設定しても外に出られない - 電脳世界のケーキ屋さん](http://amaneku.hatenadiary.com/entry/2017/10/08/143946)