SSHとproxyの組み合わせでイントラネットの統合
SSH Reverse Tunnel †
ChromeやFirefoxでブックマークを同期できるようになると、VPS上のブラウザから会社のイントラネットなどにアクセス出来ないのが残念になってきた。 VPSのデスクトップのブラウザからシームレスに会社と家の非公開サーバーにアクセスするための方法を検討する。
通常 ssh -D1080 remote として接続したら、ブラウザのプロキシ設定で localhost に対して SOCKS5 でアクセスすれば、remote 側のサーバーのページを開くことができる。
インターネットに設置してあるVPS上のブラウザから家や会社へsshで接続することは、セキュリティ上難しいことが多い。逆に家や会社からインターネット上のサーバーへsshで接続することは容易である。
そこで先の SOCKS5 による接続で、家や会社から接続しした ssh のトンネルを使って、逆方向にプロキシを利用できれば問題は解決する。
それにはまず、家のOpenBlockSやPogoplug等の 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 のみの制限を付けるようにする。
対応ブラウザ †
- Google Chromeでは、システム設定の自動プロキシスクリプトでそのままアクセスが可能だが、ftp:といった別のプロトコルを SOCKS5 でアクセスするようなことはできないようだ。
- Firefoxでは about:config で network.proxy.socks_remote_dns を true にする必要があるのと、「システムのプロキシ設定を利用する」という選択ではだめで、自動プロキシ設定スクリプト URL を設定する必要がある。
- Epiphany ブラウザは自動プロキシに対応していないのかアクセス出来ない。 『Bug #449360 in epiphany-browser (Ubuntu): “automatic proxy configuration doesn't work”』によるとそういうものなのかもしれない。
- lynxやwget等は自動プロキシに対応できない。
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