ircのサーバに踏み台を超えてポートフォワード

外部からアクセスできない場所にあるircサーバにlimechatでアクセスしたかったため、トンネルを掘って繋いだ。その副作用でいろいろ調べたのでわかったことや手順をメモ。

最終的には以下の設定を.ssh/configに書くことで解決

Host hostA                           
     HostName hostA.example.jp        
 
Host hostB                       
     HostName hostB.example.jp        
     ProxyCommand ssh hostA -W %h:%p 
 
Host irc                             
     HostName irc.example.jp        
     ProxyCommand ssh hostB -W %h:%p    
     LocalForward 6667 localhost:6667

この設定をした状態で

$ ssh irc

とすればircサーバへ接続されて6667がircサーバの6667へ転送される。
↑の設定でやっていることとしては
ssh ircコマンド実行
 →ProxyCommandが実行される=ssh hostB -W %h:%p
  (%hはホスト名、%pはポート番号、-Wで転送の設定)
 →ProxyCommandが実行される=ssh hostA -W %h:%p 
 →結果的にircサーバへログイン
 →同時にLocalForwardの設定がなされる
  (ここのlocalhostirc.example.jpを表す)
という感じだと思われる。

ssh ircを行った際にポートがbindできないとなったためそれを使用するプロセスを調査
これは結果的には↑の設定をいろいろ試していたときに途中の踏み台とするサーバへのポート転送をしてしまってそれが残っていたのが原因だったが、プロセスを探す勉強になったのでメモ

$ lsof -i:6667 #ポート6667を使っているプロセスのPIDなどを表示
$ ps aux | grep <PID> #実行中のプロセスからPIDを含むものを表示


これでトンネルの設定はOKなのでlimechatを起動してアクセスしてみるがつながらず・・
なぜならlimechatの設定を変更していないから
当たり前の話だがローカルマシンの6667がircサーバの6667に転送されるようにしたので、limechatがアクセスする先の設定を変更する必要があった。しばらく気づかず。。。

limechatのServerタブのプロパティから接続先をlocalhostの6667として無事繋がる


ちなみにssh irc実行時は以下のようにオプションを付けると無駄にログインしない

$ ssh -Nf irc

疑問が一つ。これで繋がるということはProxyCommand自体は一つ一つリモートサーバ上で実行されてるわけじゃないということ?

参考ページ
http://www.slideshare.net/tohakushi/ssh-13118950
http://d.hatena.ne.jp/kaze-kaoru/20130204/1359979359
助かりましたー