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

#contents

#navi(Sakura/VPS)

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

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

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

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

それにはまず、家の[[OpenBlockS]]や[[Pogoplug>Pogoplug/SSH Reverse Tunnel]]等の 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 のみの制限を付けるようにする。

***対応ブラウザ [#ke8fcc19]
-Google Chromeでは、システム設定の自動プロキシスクリプトでそのままアクセスが可能。
-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”:https://bugs.launchpad.net/ubuntu/+source/epiphany-browser/+bug/449360]]』によるとそういうものなのかもしれない。
-lynxやwget等は自動プロキシに対応できない。

***SOCKS Server起動と停止の半自動化 [#y415ced8]
SOCKSサーバーになる家や会社のLinux機では、下記のようなシェルスクリプトを使って起動(接続)しておくと、切断時にはSOCKSサーバーも自動で停止することができる。
 #!/bin/bash
 
 shopt -s huponexit
 ssh -N -n -D1081 localhost &
 pid=$!
 ssh -R1081:localhost:1081 sakura-vps
 kill $pid

『[[ssh が終了時に固まって(ハングして)しまう:http://www.openssh.org/ja/faq.html#3.10]]』にあるように、
shopt -s huponexit と書いておかないと、ログアウトした際にハングアップしてしまう。

----
#include(免責事項)

トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS