macのVPN接続にSoftEther VPNプロトコルを利用する

公開日時
更新日時

GCP無料枠を使ってSoftEther VPN Serverを立ち上げる」の記事にてVPNサーバを構築し、macに標準で備わっているL2TP/IPsec VPNクライアントを使ってVPN接続ができるようにした。

たいていの場合はこの接続で問題ないが、ネットワークによってはファイアウォールでアクセスがブロックされてしまうことがある。

そこで、SoftEther Clientを使ってHTTPSプロトコルでVPN接続ができるようにしてファイアウォールを通過できるようにする。

SoftEther VPN は VPN トンネルを確立するために HTTPS プロトコルを使用します。HTTPS (HTTP over SSL) プロトコルは TCP/IP ポート番号 443 を宛先として使用します。このポートは Well-known ポートであり、ほぼすべてのファイアウォール、プロキシサーバーおよび NAT は宛先ポートが HTTPS プロトコルによって構成されているパケットを通過させることができます。

SoftEther VPN Clientのインストールと初期設定

下記記事の手順に沿って、手動でAccountConnectができるように設定。

SoftEther VPNプロトコルでの接続用シェルスクリプト

AccountConnect後に毎回手動でルーティングの設定をするのが大変だったのでシェルスクリプトを作って、コマンド一発で起動と停止ができるようにした。

macOS Mojaveにて確認。

  • 下記スクリプトを[[vpn.sh]]として保存
#!/bin/sh -e
VPNPATH=/usr/local/vpnclient
VPNCLIENT=${VPNPATH}/vpnclient
VPNCMD=${VPNPATH}/vpncmd
SERVER="{VPN Server IP}"
NEW_DEFROUTE="{VPN上のネットワークのGW}"
VPNNAME="{AccountCreateで作成した接続先}"
VPNUP=`ps -ef | grep vpnclient | grep -v grep | wc -l`

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

      sudo -S ipconfig set tap0 dhcp
      sleep 1
      CURRENT_DEFROUTE=`netstat -nr | grep -E 'default(.)*en0' | awk '{print $2}' | sed -e 's/\.[0-9]*$/.1/'`
      sudo /sbin/route add -net ${SERVER} ${CURRENT_DEFROUTE} 255.255.255.255
      sudo route -n delete default
      sleep 3
      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}
EOF
    
      sudo -S ${VPNCLIENT} stop
      sleep 1
      NEW_DEFROUTE=`ifconfig en0 |grep -E 'inet(.)+netmask' | awk '{print $2}' | sed -e 's/\.[0-9]*$/.1/'`
      sudo /sbin/route -n delete -net ${SERVER} ${NEW_DEFROUTE} 255.255.255.255
      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

default gatewayがx.x.x.1になっている前提のスクリプトなので、gatewayアドレスが異なる場合はうまく動かない。

この辺もうまくやりたいけど良い方法が分からなかったのでとりあえず現状のものを残しておく。

  • 実行権限付与
chmod +x ./vpn.sh
  • 起動
./vpn.sh start

起動後、IP確認ツールでVPNサーバのIPからの接続になっていることを確認

  • 停止
./vpn.sh stop
  • 再起動
./vpn.sh restart

参考


Related #mac

ErgoDox EZのキースイッチ入れ替え再び

入れ替えたキーをメモしておかないと忘れてしまう

Bartenderをアップグレードしなかった

メニューバーの表示項目を整理した

macOS Montereyでメニューバーの表示内容を変更する

Apple純正アプリであれば表示/非表示の切り替えができる

Time Machine用に使っていたHDDを解除

ディスクユーティリティでフォーマット