リモートの閉じられた環境のサーバにアクセスする。

web applicationなどを作成しているとき、公開前の段階であるにもかかわらずwebブラウザなどでアクセスして
実際の動作をチェックしたいということがある。こんな時にトンネルを掘って作業する。

ちょっと調べたりして時間がかかったりしてしまったのでメモ。

だいたいひつような作業

大体必要な作業は以下のとおり

  1. sshでlogin(鍵の設定)
  2. アクセスできるか確認コマンドライン
  3. ブラウザの設定

sshでlogin

sshでloginしよう。同じ鍵を持ち回る時ssh-agentを使っても良い。
また、以下のような設定ファイルをかきトンネルを掘っても良い。

対象とするネットワーク

[local] --> [humidai] ---> [target.app]

humidaiは外部へ公開されていて、local(自分)からsshでアクセスすることは可能。
ここで、sshでトンネルを掘って直接target.appにつなげられるようにしてみる。*1

HOST target.app.net
     user podhmo
     HostName ap2
     ProxyCommand ssh podhmo@humidai.net -W %h:%p 
     IdentityFile ~/.ssh/id_rsa_your_key

HOST humidai.net
     User podhmo
     IdentityFile ~/.ssh/id_rsa_your_key

ProxyCommandは、sshでログインしようとした際に間で実行されるコマンド。%h,%pにはホスト名とポート番号が入る。

Dynamic forwarding

sshにはdynamic forwardingの機能がある。これを使うと簡単にsocksサーバとして動作するようになる。
これを使って、上図のtarget.appのような外部から閉じた環境へブラウザでアクセスするといったことができるようになる。

アクセスできるか確認コマンドライン

実際にログインできるかどうかただsshでアクセスしてみる。

ssh podhmo@target.app.net

これでログインできなかったら設定を見直す。(-v)とかつけて実行してみるとエラーの原因が分かるかもしれない。

sshでログインができるようになったら、前述したsocksサーバを立てる。

ssh -D 1080 -N podhmo@target.app.net

Dに渡したポート番号(省略すると1080)でsocksサーバが立ち上がる。(Nつけて良いと思う。-fはおこのみで)

これが実際に動いているかどうか確かめたい。GUIベースのブラウザは確認が面倒なのでコマンドラインで調べる。curlを使う。

## ちなみにこのオプションの指定方法は古い。あとsocks4ではなく、socks5かもしれない。
curl --socks4 localhost:1080 localhost:8000
curl --socks4a localhost:1080 localhost:8000 

200っぽいメッセージが返ってくるか調べてみる。
socks4aはホスト名の解決がリモート先のホストで行われるし。aなしのsock4はホスト名の解決がアクセス元(local)のホストで行われる
(というわけで、上のsocks4の例はあまり意味がない。)

curlが動いたことを確認したらブラウザで確認する

ブラウザでの確認作業

firefoxchromeでproxy設定(socks)を選び、socks関係の選択を追加する。
firefoxは、

  • network.proxy.socks_remote_dns
  • network.proxy.socks_version

などを確認してみる。remote_dnsがtrueならば、curlのsocks4aと同様の動きをするはず*2

*1:昔はnetcat(nc)とか使ってました

*2:手元の環境では動かなかった。