ssh経由のSOCKSプロキシを通じてMac上のGoogle Chromeでブラウジング

自分用メモ。

SOCKSとは

汎用UNIX socketプロキシみたいなヤツ。WikipediaのSOCKS記事を参照。つか今までぜんぜん存在知らなかった。ヤバい。

OpenSSHのクライアントは、SOCKSによるダイナミックポートフォワーディングをサポートしている。あたかもssh先のサーバからsocket通信しているかのようにできる。

特定のIPアドレスからしか閲覧できないWebサイトをWebブラウザから閲覧したい場合がある。squidみたいなHTTP proxyを立てたり、VPNのソフトウェアを入れなくても、sshを通じたSOCKSプロキシだけで、そういったWebサイトを閲覧することができる。

OpenSSHでの接続方法

-DでSOCKSプロキシとしてListenするポート番号指定。1080が慣習のようですがなんでもよい。-fでbackground実行、-Nでremote commandを実行しない、つまりシェルを開かない。SOCKSプロキシとして使うときには両者をつけるとよいだろう。

ssh -f -N -D 1080 user@example.com

.ssh/configに書いてもよい。

Host fumidai.example.com
  User user
  Protocol 2
  ForwardAgent yes
  DynamicForward 1080

Macでの設定

ネットワーク環境設定で、SOCKS Proxyを使って通信が出来るようになる。注意するのは、Bypass proxy settings for these Hosts & Domainsという例外設定に、ssh先のサーバを入れておくことと、Exclude simple hostnamesのチェックをつけておくこと。前者はないとうまく動かないし、後者はlocalhostなどへの通信まで奪われてしまう。

Macのネットワーク環境設定におけるSOCKS Proxyの設定

これで、Macのネットワーク環境設定を使うようなアプリケーションであれば、全てSOCKS proxyを通じた通信ができる。例えば、Google ChromeでのブラウジングなどはSOCKS proxy経由となる。

ただし、コマンドラインアプリケーション、例えばsshなどは、このSOCKS Proxyを使って通信しない。

ありとあらゆる通信をSOCKS proxy経由にする場合は、Proxifierなどを導入する必要がある。

sshだけであれば、ssh -Wを使うとよい。netcatを使う方法もあるが、割愛。target.example.comがアクセスしたい先のホスト名。ポート番号などが違う場合には、ProxyCommandに適切なオプションを追加すること。

Host target.example.com
  User user
  Protocol 2
  ForwardAgent yes
  ProxyCommand ssh -W %h:%p fumidai.example.com

Mac上でのGoogle ChromeでのSOCKSプロキシ利用方法

上記で述べたとおり、Macのネットワーク設定でSOCKSプロキシは設定できる。しかし、深遠なる理由によってそれがかなわない場合もある。

例えば、Macの非標準のVPNソフトウェアを使っていて、そのVPNソフトウェア経由でないと踏み台サーバにsshできない、といった場合だ。

いくつかのアプリケーションは、自前でSOCKS経由でのアクセスに対応している。Google Chromeもそうだ。DNSによる名前解決もSOCKS経由でやってくれる。

shell経由で、以下のように起動できる。

/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --proxy-server="socks5://127.0.0.1:1080" &

以下のようなaliasを書いておくとよいだろう。ついでにopenを使ってみた。

alias chrome="open /Applications/Google\ Chrome.app/ --args --proxy-server=\"socks5://127.0.0.1:1080\""

SOCKSサーバがDNSによる名前解決を必要とする場合、–host-resolver-rules=“MAP * 0.0.0.0 , EXCLUDE hostname” のようにして、SOCKSサーバの名前解決だけはSOCKS経由でやらないような配慮が必要となる。今回は127.0.0.1の直IPだし、localhostに変えてもhostsで名前解決できるのでいらない。