サルでも分かる多段ssh

 仕事をしていると、お客さんの環境にログインするため、

  • 踏み台マシンを経由する必要がある
  • 踏み台マシンへのログインすら、特定範囲のIPアドレスからしか受け付けてくれない

 といった厳しい条件を満たさなければならない場合があり、多段にsshをしなければいけないことがある。しかし、単純な多段sshには、

  • 毎回順繰りに多段ログインするのは結構めんどくさい
  • scpでいちいち中継サーバーにコピーしていく必要があり、中間サーバーのディスク容量が足りない場合に大きなファイルがコピーできない

 といった問題がある。
 実は、sshには設定ファイルがあり、設定を行うことで、間に何台のサーバーを挟んでいようとも、あたかも直接アクセスしているかのように接続することができるのであるが、世間的にはあまり知られていないようだ。知らないのは非常にもったいないので、簡単に説明しておく。
 設定ファイルは~/.ssh/configにある。なければ自分で作る。
 まず、設定ファイルの書き方なのだが、基本的にはホスト単位でいろいろと設定項目を書いておく。

Host host2
     ProxyCommand ssh host1 nc %h %p

 host1, host2の部分で、host1に踏み台の名前を、host2にアクセスしたいサーバーの名前を書く。ProxyCommandというのはその名の通り、そのホストに接続しに行く前に、あらかじめこのコマンドを実行しておけよ、というものである。ncというのはコマンドで、manによると「nc ― arbitrary TCP and UDP connections and listens」とあるが、どういうプログラムなのかは正直良くわかってない。connect.cとか、他にも同様の事をしてくれるプログラムはいくつかあるみたいなのだが、ncは最近のLinux Distributionだとデフォルトで入っていることが多いみたいで、ncと書いておいて困ることはほぼない。
 これだけでhost1の事は無視して直接host2に接続しているみたいにsshしたりscpしたりすることができる。さらに、host2を踏み台としてhost3に行きたい場合は

Host host3
     ProxyCommand ssh host2 nc %h %p
Host host2
     ProxyCommand ssh host1 nc %h %p

 と書いておけば、ssh host3とすると、自分からhost1, host2の2台の踏み台を経由してhost3に接続することができる。当然、もっと踏み台を増やすこともできる。何段まで可能なのかは試したことがないのでわからないが、原理的にはいくらでもいけそうだ。
 実は、この設定はsshをするときに便利だというだけではなく、emacsでtramp modeを使うときなどにも非常に有効である。tramp modeのmulti hopの設定はサンプルも少ないし、正直良くわからないのだが、ssh側で設定してしまえば問題なく、踏み台の向こう側にあるファイルを手元のemacsで編集することが出来る。
 この他にも、sshの設定ファイルには、

  • ホスト毎にログインするユーザー名を変える機能
  • ホスト毎に使うsshの鍵を変える機能

 など、使いこなすと便利な機能が沢山あるので、ぜひ使いこなして便利なsshライフを送っていただきたい。
 あと、書いてる途中に見つけたんだけど、すでにとても良い記事がありました → ncある限りぼくはどこまででもいけるッ!