ssh_configで多段sshの設定

以前の記事ssh接続をちょこっと楽にする - Ruby_logで~/.ssh/configをいじって、ユーザ名、ホスト名を省略できるようにしました。
どうせなら面倒なこともっと減らそうってことで、多段sshについての設定を書いて、自動で踏み台ホストを超えて、目的のホストへ接続できるようにします。

多段ssh

目的のサーバへ接続するために、別のサーバへ一旦接続しないといけない状況を考えます。
例えば、

ホスト1,2,3はそれぞれ、フルパスで書くとhost1.example.com, host2.example.com, host3.example.com であるとしておきます。
赤ので囲まれたホスト2,3は同じLAN上にあり、ホスト3は外部へ公開されていない。
ホスト2は外部へ公開されている。
ホスト1からホスト3へ接続したいとします。

通常だと、ホスト1からホスト2へ接続 → ホスト2からホスト3へ接続


host1$ ssh user2@host2.example.com
user2@host2.example.com's password:
host2$ ssh user3@host3.example.com
user3@host3.example.com's password:
host3$

で、この操作ってめんどいよね!!ってことで、省略していきます。

~/.ssh/configを編集

以前の記事で編集した内容は出来てるものとして、説明はしません。
今回はホスト1からホスト2を経由して、ホスト3へ接続するので、ホスト1の~/.ssh/configを編集します。


Host h2
User user2
Host host2.example.com

Host h3
User user3
Host host3.example.com
ProxyCommand ssh h2 nc %h %p
はい、これでOK
試しに

host1$ ssh h3
としてみると、見かけ上直通でホスト1からホスト3へ接続できます。
# パスワード認証だと2回パスワード入力が必要なのでそれほど…な感じかもしれませんが…
# 秘密鍵認証で、ホスト2,3両方への鍵を用意しておいて、パスフレーズ無しかssh-agent起動済みなら完全に見かけ上直通!!

ちょこっと説明

さて、前回のと大して~/.ssh/configの内容変わらないわけですけど、赤文字になってる最後の行が変わってますね。
ProxyCommandはこのホストに接続する前に実行するコマンドを指定します。
今回のでは、事前にホスト2へ接続しないといけないので、ProxyCommandでホスト3へ接続する前に、ホスト2へ接続しておいてねとお願いしていることになりますね。

そのProxyCommandの中身についての説明もいりますね…


ssh h2 nc %h %p
がその中身なわけですが、ssh h3 の部分はいいですよね? フツーにsshでh3に接続してねってお願いしてるとこです。
今回は~/.ssh/configのこの箇所より上の部分でh2について設定を書いてあるので、h2って書いておけば、ユーザ名、ホスト名などは書かなくてもいいみたいです。
残りの…

nc %h %p
ってのがさっぱりかと思います。
実は自分もよくわかってまs…ゲフンゲフン
nc っていうのは普通にコマンドラインで使えるネットワーク関係のコマンドですね。
フルネーム(?)だとnetcat。ポートスキャンだとか、ファイルの送受信なんかにも使えるコマンドらしいです。
今回はncのいくつかある役割の中からネットワーク上で入出力をなにかうまくやってくれる機能(?)を使っているということ
# このあたりよくわかってません(´;ω;`)ブワッ
で、ncの件はこれくらいで許してもらうとして、%h %pってなに?って聞かれそうなんですが…
%hはホスト名、%pはポート番号に展開されるということです。
ちなみに、%pがポート番号なら、sshのデフォルトポート22番を使用していれば%pいらないよね?
…というわけにはいかなくて、実際にやってみると接続できませんでした。
あくまで推測でちゃんと確かめたり、調べたわけではないけど、ポート番号を受け取っているコマンドはsshじゃなくてncなんでncからするとsshのデフォルトポートなんてわかるか!!ってなるんでしょうかね(・ω・`)

sftp,scp

ちょっと話が変わって
ホスト1にホスト3のファイルが欲しい場合、~/.ssh/configの設定をしてなくて、普通にやろうとした場合、

ホスト1からホスト2へssh接続して、sftp/scpでホスト3のファイルをホスト2へ一旦置いて、
ホスト1からホスト2へsftp/scpで一旦置いたファイルを回収…
という手順を踏むことになると思います。

sshで見かけ上直接ホスト1からホスト3へ接続できるので、sftp/scpでももちろん見かけ上直接接続できます!!
なので先ほどのような面倒な手順を踏まずに
ホスト1からホスト3へsftp/scpでファイルを取ってくる
ことができるわけです。これでホスト2へ無駄なファイルを一旦置く必要がなくなります!
# あとで消しに行くのが面倒なんですよね…(・ω・`)


以上、エイプリルフールネタが一切無くてごめんなさい!!!!!