開発サーバなどで、SSHに使う22番ポートは解放しているけど、HTTPに使う80番ポートは外部に解放していないという状況があります。
そういう状況でSSHを踏み台にして、ブラウザで閲覧したいなと思っていたのですが、最近それができる方法が分かりました。
HTTPでは接続できない。
HTTPに使う80番ポートを解放していない場合、普通に接続しようとしても接続できません。
$ curl -i http://dev.katty.in/ curl: (7) couldn't connect to host
curlで試していますが、ブラウザで開こうとしても、もちろん接続はできません。
SSH経由でコマンド実行はできる。
sshコマンドのパラメータの最後にパラメータを添えると、それを接続先のホストで実行してくれます。
そういうわけで、サーバへSSHで接続できる場合、SSHを踏み台にしてHTTPリクエストを送信することはできます。
$ ssh dev.katty.in 'curl -i http://localhost/' HTTP/1.1 200 OK Set-Cookie: SESSID=4F9C3F20C8CB9EFCF624A402523852EF; Path=/; Secure; HttpOnly Content-Type: text/html;charset=UTF-8 Content-Language: en-US Transfer-Encoding: chunked Date: Fri, 14 Mar 2014 12:56:43 GMT Server: Apache # ...(略)...
ただこれをJavaScriptやCSSのような静的なリソースまで含めてブラウザに表示するのは面倒なので、これで動作確認をするのは大変です。
ローカルのポートを、リモートのポートに転送する
調べていたら、sshコマンドに-Lというオプションがありました。
与えられたローカル (クライアント) ホスト上のポートが、与えられたリモートホスト上のポートに転送されるよう指定します(ローカル→リモートのポート転送)。これはローカル側でポート に listen (接続受け付け) 用のソケットを割り当てることによりおこなわれます。(SSH (1))
日本語が不自由な感じですが、実際に試してみます。
$ ssh -L 8000:localhost:80 dev.katty.in Last login: Fri Mar 14 22:08:18 2014 from xx.xx.xx.xx [katty0324@dev.katty.in ~]$
普通のSSHのように、リモートのシェルが立ち上がります。
この状態でブラウザを起動して、ローカルホストの8000番ポートへ接続してみます。
http://localhost:8000/
見事に表示ができました!
(この画像は、実際には公開しているWEBサイトですが、アクセスログにはWEBサーバの内側からのアクセスが記録されています。)
オプションの書き方
ちょっとぱっと見では理解できないオプションの書き方ですが、コロン区切りの手前の8000が「ローカルのポート」、真ん中のlocalhostが「リモートホストから接続する先のホスト」、後ろが「リモートから接続するポート」です。
$ ssh -L 8000:localhost:80 dev.katty.in
これで「自分のマシンの8000ポートへ繋ぐこと」が、「dev.katty.inから見たlocalhostの80ポートへ繋ぐことと同じ」になります。
$ ssh -L 8000:google.com:80 dev.katty.in
こう書けば、「dev.katty.inから見たgoogle.comの80ポートへ繋ぐことと同じ」になります。
.ssh/configの書き方
良く使う場合、このオプションを.ssh/configに残しておきたくなります。
書く時は、LocalForwardというパラメータに設定します。
Host katty-dev-port-forward HostName dev.katty.in User katty0324 Port 22 IdentityFile ~/.ssh/id_rsa GatewayPorts no LocalForward 8000 localhost:80
使う時は、設定した名前で一発です。
$ ssh katty-dev-port-forward
調べてみると、意外と色々なオプションがあるものですね。
そうこうしているとsshの設定がカオス
こうやってsshの設定を追加していると、どんどん複雑になっていきますよね。
というわけで、sshxというツールを作りました。
設定ファイル分割や、コマンド補完が使える拡張sshコマンドを公開しました。
今回はsshに知らなかったオプションがあったという話ですが、もしかして複数設定ファイルの利用も隠れオプションとかがあったりするんでしょうか。