SSHとproxyの組み合わせでイントラネットの統合


SSH Reverse Tunnel

ChromeやFirefoxでブックマークを同期できるようになると、VPS上のブラウザから会社のイントラネットなどにアクセス出来ないのが残念になってきた。 VPSのデスクトップのブラウザからシームレスに会社と家の非公開サーバーにアクセスするための方法を検討する。

通常 ssh -D1080 remote として接続したら、ブラウザのプロキシ設定で localhost に対して SOCKS5 でアクセスすれば、remote 側のサーバーのページを開くことができる。

インターネットに設置してあるVPS上のブラウザから家や会社へsshで接続することは、セキュリティ上難しいことが多い。逆に家や会社からインターネット上のサーバーへsshで接続することは容易である。

そこで先の SOCKS5 による接続で、家や会社から接続しした ssh のトンネルを使って、逆方向にプロキシを利用できれば問題は解決する。

それにはまず、家のOpenBlockSPogoplug等の ssh をインストールした Linux機などを SOCKS サーバーにしてから VPS と -R オプションを付けて接続する。

ssh -N -f -D1080 localhost
ssh -R1080:localhost:1080 sakura-vps

会社も同様に、こんどはポート番号を変えて接続する。cygwin上にOpenSSHをインストールした Windows機でも構わないが、VPSからブラウザで社内へアクセスする際は、ずっと動かし続けている必要があるので、そのようなことが可能なPCを選ぶ。

ssh -N -f -D1081 localhost
ssh -R1081:localhost:1081 sakura-vps

PuTTYやTeraTermでもできそうだが、自分のネットワークに対してSOCKS5 サーバーを立てる方法が分からない。

あとは、ドメインを見て家なら1080番、会社なら1081番ポートへ SOCKS5 でプロキシを切り替えればよい。 VPS側に自動切換えのスクリプトを /var/www/proxy/proxy.pac として配置する。 家のイントラネットは home.local、会社のイントラネットは office.local というアドレスでアクセスできるとすれば、下記のようなスクリプトになる。

function FindProxyForURL(url, host)
{
 if (isPlainHostName(host)) {
   return "DIRECT";
 } else if (shExpMatch(host, "*.home.local")) {
   return "SOCKS5 127.0.0.1:1080";
 } else if (shExpMatch(host, "*.office.local")) {
   return "SOCKS5 127.0.0.1:1081";
 }
 return "DIRECT";
}

「システム:設定:ネットワークのプロキシ」で、「自動的にプロキシの設定を行う:自動設定する URL: http://localhost/proxy/proxy.pac」と設定。 プロキシ設定に会社で使っているローカルなホスト名が含まれているなど、公開してはまずい場合、/var/www/proxy/.htaccess 等で localhost のみの制限を付けるようにする。

対応ブラウザ

SOCKS Server起動と停止の半自動化

SOCKSサーバーになる家や会社のLinux機では、下記のようなシェルスクリプトを使って起動(接続)しておくと、切断時にはSOCKSサーバーも自動で停止することができる。

#!/bin/bash

shopt -s huponexit
ssh -N -n -D1081 localhost &
pid=$!
ssh -R1081:localhost:1081 sakura-vps
kill $pid

ssh が終了時に固まって(ハングして)しまう』にあるように、 shopt -s huponexit と書いておかないと、ログアウトした際にハングアップしてしまう。


免責事項

ここに記載されている内容を実際に運用した場合のトラブルに関しては一切責任を負えませんのでご了承ください。
Copyright 2000-2011 Koichi Otsuka


トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2012-11-12 (月) 12:49:52 (4176d)