[Mac OSX] VPNが頻繁に切断されてしまう時の対処方法

OpenVPN-Logo-200x200

社内へのアクセスにVPNを利用している人は多いと思います。
Mac OSXは標準でPPTPやL2TPなどのプロトコルに対応しています。
しかしながら、設定内容は合っているのに接続直後に切断されてしまったり安定しないケースがしばしばあります。
そんな時の対処方法をまとめました。
以下の方法についてそれぞれ説明します。

  1. MTU値を調整する
  2. PPTPマルチパススルー機能のついたルータを買う
  3. 自動再接続スクリプトを書く

MTU値を調整する

個人的にはこの方法が最も有効です。
MTU(Maximum Transmission Unit)とは、一度にネットワークへ送信できる最大のパケットサイズの事です。
大きいほど一度に沢山のデータを送信できますが、エラー率も上がり再送信コストが大きいというトレードオフがある設定値です。
これを調整する事で、切断の頻度を改善できます。

現在のMTU値を確認

まずは、現在のMTU値を確認しましょう。
「ターミナル.app (Terminal.app)」を開いて以下のコマンドを入力してください。

$ sudo ifconfig
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
    ether xx:xx:xx:xx:xx:xx
    inet6 xxxx::xxxx:xxx:xxxx:xxx8%en0 prefixlen 64 scopeid 0x4
    inet 10.200.2.130 netmask 0xffff0000 broadcast 10.200.255.255
    nd6 options=1<PERFORMNUD>
    media: autoselect
    status: active
ppp0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1500
    inet 10.100.0.5 --> 10.255.254.0 netmask 0xffff0000

en0 はイーサネットのネットワークです。つまりLANですね。 ppp0 はPPTPのVPNです。
そして、en0のMTUは 1500 で、 ppp0のMTUは1500 である事が確認できます。
問題はこのppp01500という値です。

MTU値を変更

/etc/ppp/ip-up というパスのファイルを作成して、以下の内容を記述します。

#!/bin/sh

/sbin/ifconfig ppp0 mtu 1300

また、ファイルのパーミッションを755 に変更してください。

$ sudo chmod 755 /etc/ppp/ip-up

ip-upというファイルは、VPNに接続するたびに実行されるスクリプトです。
これで、接続時にMTU値が1300に調整されるようになりました。
試しに再接続してみてください。
この値をいろいろ変えてみて、安定する値を探ってください。

僕の場合はMac OSX Yosemiteで、 500 で安定しています。

PPTPマルチパススルー機能のついたルータを買う

複数人がVPNに接続する、または複数台が同時にVPNに接続する環境の人に有効です。

ルータは、VPNのパケットをアドレス変換(NAT)しないで通す機能があり、これをPPTPパススルーと言います。
家庭用のルータなどでは、この機能は1台までしか使えず、同時に複数の接続があると正しく対処できません。
そのため、同時接続して通信すると混線が発生して頻繁な切断を引き起こします。
この問題は、PPTPマルチパススルーに対応したルータを使う事で解決します。

自動再接続スクリプトを書く

上記2つのアプローチでも尚安定しない場合は、自動で再接続するApple Scriptを書くのが有効です。
簡単ですので、試してみてください。Yosemiteでも動作確認済みです。

ネットワーク名を確認する

VPN-network-preferences

この画面では、VPN接続名は「VPN (PPTP)」である事がわかります。
これを覚えておきます。

AppleScriptを書く

以下のようなアイコンの「アプリケーション」→「ユーティリティ」→「スクリプトエディタ」を開きます。

Script Editor

新規作成して、以下のスクリプトを貼り付けてください。

on idle
  tell application "System Events"
    tell current location of network preferences
      set myConnection to the service "VPN (PPTP)"
        if myConnection is not null then
          if current configuration of myConnection is not connected then
            connect myConnection
          end if
        end if
      end tell
    return 120
  end tell
end idle

「VPN (PPTP)」のところを、あなたのVPN接続名に置き換えてください。
以下のような画面になります。

VPN-Script Editor

できたら、以下のような設定で保存します。

Script Editor Export

スクリプトを起動する

保存したスクリプトを、VPNが切断された状態で起動してみてください。
自動でVPNが接続されましたか?やりましたね!
ためしに手動で切断してみてください。しばらくすると、再接続を試みるはずです。
接続状態をチェックする間隔は2分間ですが、変更できます。
スクリプト中のreturn 120という箇所を、任意の秒数に変更してください。

参考

MacPortsがディスクを圧迫している時のクリーンアップ方法

HomeBrewが主流になりつつある中、乗り換えるのも面倒でしぶとくMacPortsを使い続けているnoradaikoです!
MacBook Airのディスク容量が少なくなっているという警告が出たので、何かと思ったらMacPortsが3GB以上も食っていました。
絶対無駄なファイルが蓄積されているだろうという事で調べてみたら、クリーンアップ方法を見つけたのでメモ。

#!bash
$ sudo port clean --all all

これで中途ファイルなどが削除されます。
俺の場合、これで2GBほどの容量が空きました!
ついでにinactiveなパッケージも削除しましょう。

#!bash
$ sudo port -p uninstall inactive

こっちは500MBほど空きました!
こういうのはこまめにやっておくと良いですね。