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プロキシとして使うときには-f -Nともにつけるとよいだろう。
ssh -f -N -D 1080 user@fumidai.example.com
.ssh/configにも各種設定を書ける。
Host fumidai.example.com User user Protocol 2 ForwardAgent yes DynamicForward 1080
Windowsでの設定
FreeCap で通信できるらしい。
Macでの設定
ネットワーク環境設定で設定すれば、SOCKSを使って通信が出来るようになる。
注意するのは、Bypass proxy settings for these Hosts & Domainsという例外設定に、ssh先のサーバを入れておくことと、Exclude simple hostnamesのチェックをつけておくこと。前者はないとうまく動かないし、後者はlocalhostなどへの通信まで奪われてしまう。
これで、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で名前解決できるのでいらない。
Google Chromeで特定のドメインのみSOCKS経由にする
Google Chrome拡張であるProxy SwitchyOmegaを入れると、特定のドメインだけをSOCKS経由でアクセスできるようになる。
profileというものを複数作ることができて、profileごとにproxyのルールを切り替えることができる。
WebブラウジングでSOCKSを使う人にとっては便利な拡張。
curlをsocks proxy経由にする
hostnameの名前解決はsocks proxy経由にしない場合
curl --proxy socks5://localhost:1080 http://example.com/
hostnameの名前解決もsocks proxy経由にする場合
curl --proxy socks5h://localhost:1080 http://example.com/
Linux, macOSなどで任意のプロセスをsocks proxy経由にする
tsocks を使い、socket経由のAPIを横流しすることができる。
ただ、Macの場合は保護機能が働いてしまう。
Macのリカバリーモードで
csrutil disable
csrutil enable --without debug
とするとよい。