2015年9月13日日曜日

Mac OS XでVPNをログインなしで自動接続する方法

VPNで固定IPを手に入れたのは良いが、再起動したり切断されたりした場合、最接続してくれなくて困った。 ググったらそれっぽいのはあるのだが、ユーザーがログインしないと実行されないとか、Apple Scriptを利用するというものばかりだった。というかどこかのサイトが発祥で、それをコピペに近い状態でブログに転載しているのが多かったので新しい発見ができたサイトがあまりなかった。

とりあえず自分がしたいことは:
・ 起動時にLANに接続していたら、VPNへ自動で接続、ログインする必要無し。
・ 切断されたら最接続する。
・ apple scriptはよくわからないから使わない。
ということである。

自分で作ってしまうのが手っ取り早そうなので、作ってみた。下記のコードをvpn-connect.shというスクリプトを/etc/に作成。コードは下記の通り


#!/bin/bash
vpn="INTERLINK" #vpn名を入力。自分の環境に合わせる
localip="192.168.24.3" #ローカルIPアドレスを入力。固定IPにすると良い。自分の環境に合わせる

#modified from /etc/rc.common
CheckForNetwork()
{
    local test

    if [ -z "${NETWORKUP:=}" ]; then

#ここは$localipをgrepにて抽出し、1行以上あった場合NETWORKUPを-YES-に設定する。
#ここのgrep $localip 部分をを変更することでいろんな条件に変更できる。

        test=$(/sbin/ifconfig -a inet 2>/dev/null | grep $localip | wc -l)
        if [ "${test}" -gt 0 ]; then
            NETWORKUP="-YES-"
        else
            NETWORKUP="-NO-"
        fi
    fi
}

CheckForVPN()
{
    local test

    if [ -z "${VPNUP:=}" ]; then
#vpnに接続しているかを確認する
        test=$(/usr/sbin/scutil --nc status "$vpn" | sed -n 1p)
        if [ "${test}" = "Connected" ]; then
            VPNUP="-YES-"
        else
            VPNUP="-NO-"
        fi
    fi
}

# http://superuser.com/questions/358513/start-configured-vpn-from-command-line-osx
# を参考にする

#ここではVPNに接続したことを確認する。(20秒ほど)

isnt_connected() {
   /usr/sbin/scutil --nc status "$vpn" | sed -n 1p | grep -qv Connected
}

poll_until_connected() {
 let loops=0 || true
 let max_loops=200
 while isnt_connected "$vpn"; do
  sleep 0.1
  let loops=$loops+1
  [ $loops -gt $max_loops ] && break
 done
 [ $loops -le $max_loops ]
}

#ここから実行される
#ネットワークが起動しているかを確認する
CheckForNetwork
if [ "${NETWORKUP}" = "-YES-" ]; then
#ネットワークが起動していたら、VPNが接続しているかを確認
 CheckForVPN
 if [ "${VPNUP}" = "-NO-" ]; then
  #vpnが接続していなかったら、つなげる
  dt=$(/bin/date)
  echo "$dt: CONNECTING TO $vpn" 
  /usr/sbin/scutil --nc start $vpn
  if poll_until_connected "$vpn"; then
   echo "Connected to $vpn!"
   exit 0
  else
   echo "NOT CONNECTED"
   exit 1
  fi
 fi
fi 

これは一度実行するだけのコマンドであり、監視するわけではない。 次はlaunchdで上記スクリプトを実行し、1分単位で再実行する。 ログは/tmp/vpn-connect.outに書き出される。必要であればパスを変更してほしい。 下記コードを/System/Library/LaunchDaemons/jp.blogspot.r3wt3d.vpn-connect.plist という名前のファイルで(まあ名前はなんでも良い)保存する。
(2015/9/17 見直して全面的に書き直し)以前のものだとログがすごいことになるので、書き直した。
ただ実行毎にコンソールログに


2015/09/17 21:46:52.580 com.apple.xpc.launchd[1]: (jp.blogspot.r3wt3d.vpn-connect) Service only ran for 0 seconds. Pushing respawn out by 60 seconds.

と表示されまくるのが気に食わないが、10秒に一度表示されるよりは良いだろう・・・


<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">

 
        Label
        jp.blogspot.r3wt3d.vpn-connect
        Program
        /etc/vpn-connect.sh
        KeepAlive
        <true/>
        RunAtLoad
        <true/>
        ThrottleInterval
        60
        StandardOutPath
        /var/log/vpn-connect.out
 

下記コマンドを実行する(その後再起動する必要はない)か、再起動をすれば良い。

launchctl load /System/Library/LaunchDaemons/jp.blogspot.r3wt3d.vpn-connect.plist
参考: launchd.info

0 件のコメント:

コメントを投稿