nc と ssh config ファイルを使って多段 SSH 接続する

2019年5月より、毎日更新を止めようと思います。ハッキリとは決めていませんが、2日に1度とか、週1とか、不定期更新とかにしようかと。

お知らせまで。


本題。

本番稼動するサーバは、セキュリティ上の観点から、SSH 接続できる通信元が限られている場合がある。そんな時に、踏み出しサーバに一度 SSH 接続してから、目的のサーバにさらに SSH 接続したりすることがある。

# ローカル端末のターミナル
$ whoami
Neos21

# ローカル端末から踏み台サーバに SSH 接続する
$ ssh -i /Users/Neos21/.ssh/id_rsa myadmin@128.200.100.10

# 踏み台サーバに SSH 接続した
$$ whoami
myadmin

# 踏み台サーバから目的のサーバに SSH 接続する
$$ ssh -i /home/myadmin/.ssh/id_rsa myuser@128.200.200.55

# 目的のサーバに SSH 接続した
$$$ whoami
myuser

しかし、こんな風に何回も ssh コマンドを叩くのは面倒だし、踏み台サーバに秘密鍵ファイル (.ssh/id_rsa) を用意したりしないといけなくて大変だ。

そこで、nc (NetCat) というコマンドと、~/.ssh/config という設定ファイルを組み合わせて、多段 SSH 接続を行ってみる。

nc コマンドの準備

まずは、踏み台サーバに nc コマンドをインストールする。CentOS の場合はデフォルトではインストールされていないと思うので、Yum で以下のようにインストールする。

$ yum install -y nmap-ncat

$ nc --version

コレで準備 OK。

~/.ssh/config ファイルを作る

続いて、ローカル端末の ~/.ssh/ 配下に config という名前のファイルを作り、以下のように書く。インデントのスペースの数は一応4つにしたが、適当で良いっぽい。

# 踏み台サーバ
Host mybastion
    HostName        128.200.100.10
    User            myadmin
    IdentityFile    ~/.ssh/id_rsa

# 踏み台サーバを経由して接続したいサーバ
Host myprivate
    Hostname        128.200.200.55
    User            myuser
    IdentityFile    ~/.ssh/id_rsa
    ProxyCommand    ssh mybastion nc -w 10 %h %p

mybastion と名付けた接続先定義は、特に問題ないだろう。

少々分かりづらいのは、myprivate と名付けた、「踏み台を経由して接続したいサーバ」の定義情報だろう。

ProxyCommand という項目名のとおり、踏み台サーバを経由するよう、nc コマンドを指定している。%h%p は ProxyCommand 用のオプションで、ホスト名とポート番号を表す。-w 10 は接続に失敗した場合のタイムアウト秒数。

ココで踏み台サーバがプロキシ的に機能するために、nc コマンドが踏み台サーバにインストールされている必要がある。

実際に接続してみる

~/.ssh/config に定義した情報を参照して接続するには、以下のように Host 名を指定すれば良い。

$ ssh mybastion

# 踏み台サーバに SSH 接続した
$$ whoami
myadmin

さて、多段 SSH の真価、あたかも直接お目当てのサーバに繋いだかのように、コマンド1発で myprivate サーバに接続してみせよう。

$ ssh myprivate

# 目的のサーバに SSH 接続している
$$ whoami
myuser

このとおり、見た目上は mybastion サーバを経由していないようにすら見える。

3段以上の多段 SSH も原理上は可能

さて、仕組みが分かれば、Host myprivate 的な書き方をして中継サーバを間に3つも4つも作ることは、原理上できる。

理解が合ってるかしら…

自分が試した環境ではコレでうまく動いたのだが、ProxyCommand あたりは自分の理解が合っているか怪しい気がする…。