2011年12月24日土曜日

SSHとSOCKSでVPNしてみる。

恥ずかしながら-Dオプションを知りませんでした・・・。今まで知らなくて損したなぁと、、、そんな気分です。

SSHでトンネルを貼れるというのは、一般的に良く知られていることだと思います。ローカルホストの特定のポートへのリクエストを、リモートホストの特定のポートへのリクエストに変換するというのが最も一般的な利用方法だと思います。

この方法は手軽ですが、あえて問題点をあげるとすればVPNで接続するリソースの数だけトンネルの定義を記述しなければいけないということだと思います。そんなことを考えながらsshのman pagesを見ていたら気になる記述を見つけました。

SSHでSOCKS proxy

-Dオプションがこれを可能にします。例えば、SSHの接続先が、your.company.comだったとします。

$ ssh -D 8080 your.company.com

これだけです。その後、システム環境設定>ネットワーク>詳細>プロキシと選択して、SOCKSプロキシをONにして、

SOCKSプロキシサーバ localhost : 8080

と指定するだけです。

NewImage

こんな感じですね。実際には8080を使うことができないこともあるので、8081とか18018とか任意の数字を使うのが良いと思います。この状態でSOCKSプロキシに対応したアプリ(もちろん、Safariも含みます)でアクセスをすると、全てのトラフィックがsshで接続したサーバにフォワードされるようになります。社内リソースへのアクセスも非常に簡単になります。社外リソースへのアクセスも全てsshで接続したサーバを経由することになります。ですので、接続元のIPアドレスで挙動を変えるサービス・・・たとえばnetflixとかgoogle musicのような・・・に対する試験をすることもできるようになります。サーバ側のsshdが、SOCKS proxyとして機能してくれるのだそうです。素晴らしい機能の実装に感謝!Safariであれば、resolver(nameserver)の名前解決もSOCKS経由で行なってくれますので、難しいことを考える必要がまったくありません。社内リソースに*.localを使っている場合は例外リストの変更を忘れないようにしてくださいね。

Firefoxの場合、単純にSOCKSプロキシを有効化しただけでは名前解決をSOCKS経由で行なってくれません。about:configでnetwork.proxy.socks_remote_dnsをtrueに設定することで、有効化することができます。

ところで、sshを使うような人達には、いちいちGUIでの設定をするのが嫌だという人もいると思います。かくいう僕もそんな一人です。可能な限り指はホームポジションから外したくありません。macでは、そんな人のためのコマンドも用意してくれています。コマンドラインから全て設定することもできるのですが、少なくとも僕の場合、そこまでのオペレーションは必要ない状況です。ほとんどの方も単純にSOCKS proxyの利用をON/OFFするだけで良いのではないでしょうか。

そのためのコマンドです。

$ networksetup -setsocksfirewallproxystate <networkservice> on
$ networksetup -setsocksfirewallproxystate <networkservice> off

見たままのコマンドです。<networkservice>の箇所には、sshサーバまで接続するために使っているネットワークサービスが入ります。無線LANであればWi-Fi、有線であればEthernetになります。実際のネットワークサービスの一覧は、以下のコマンドで確認することができます。

$ networksetup -listallnetworkservices

僕は単純にWi-Fi, Ethernetの両方について指定をしています。

$ networksetup -setsocksfirewallproxystate Wi-Fi on
$ networksetup -setsocksfirewallproxystate Ethernet on

Script化してみる

というわけで。
SSHでのログインと、proxyの設定をONにするスクリプトを書いておけば、簡単にVPN接続ができるようになります。

ところで-Dの指定は、.ssh/configに書きこんでおくことができます。その場合は、DynamicForwardという項目を使います。8080を使うのであれば、以下のように記述することになります。この辺りは好みの問題ですが、僕はssh周りの設定を.ssh/configに集めているので、この設定をホスト毎の設定として記述しています。

DynamicForwarding 8080

その上で、ログインのスクリプトを以下のように作ってあります。

#!/bin/sh
networksetup -setsocksfirewallproxystate Wi-Fi on
networksetup -setsocksfirewallproxystate Ethernet on
ssh your.company.com
networksetup -setsocksfirewallproxystate Wi-Fi off
networksetup -setsocksfirewallproxystate Ethernet off

このやり方はプロキシ選択画面の「SOCKS プロキシ」チェックボックスを単純にON/OFFしているだけです。ですので、このコマンドを実行する前に、一度手動でSOCKSプロキシの設定をしておかなければいけません。・・・でも、動作確認のために一度はGUIで設定しますよね?

 

Have fun

0 件のコメント:

コメントを投稿