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