OS X の Network Locations を使ってプロキシの設定を分ける

SOCKS プロキシ

社内サーバなどファイアウォールの内側にあるサーバに SSH するために SOCKS プロキシを経由する必要がある。

また ProxyChains のようなソフトウェアを使って SOCKS プロキシ下でも名前解決ができるようにしたい。(参考: (ProxyChainsの最新版でSOCKS5プロキシを使った名前解決が出来るようになってた - yanbe.diff - subtech])

下記のような proxy.pac を書くと名前解決ができるようになる。

function FindProxyForURL(url, host) {
  if (/private\.host$/.test(host)) {
    return "SOCKS5 127.0.0.1:9050";
  else {
    return "DIRECT";
  }
}

ところでいつでも SOCKS プロキシを使いたいわけではない。SOCKS プロキシを使いたいのはリモートで作業する (自宅勤務、障害対応) ときなので。

都度、プロキシの設定を手で変えるのは煩雑なので自動化しやすい方法を考えたい。

Network Locations

そこで OS X の Network Locations を使う。(Network) Location とはネットワークの設定をまとめたものである。

What is a "location?"

In the Network preference pane of System Preferences, a location is a set of network preferences.

Using network locations (Mac OS X v10.6 and later)

(ちなみに最初から "Automatic" (ロケールによっては「自動」) という Location が存在している。)

Location を新たに作るには “System Preferences.app” で “Network” を開いて GUI で操作する方法 (詳しくはApple のドキュメントに書いてある) と、networksetup コマンドを使う方法とがある。(こちらも man networksetup すると詳細が読める)

Location ごとにプロキシの設定を含めたネットワークに関する設定を分けることができる。

たとえば nomad という Location を自宅作業用につくる。この Location に対してプロキシの設定を行う。nomad という Location を選択しているあいだはこの設定が有効になり、別の Location に切り替えると設定も切り替わる。

DNS の設定なども Location ごとに分けられるので、たとえば Google Public DNS を使う場合と使わない場合で分ける、といった使い方が考えられる。

ほかにも networksetup コマンドは Network.prefpane で編集できる設定はだいたい編集できるようだった。