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
Host 【名前】の区切りで、一つの接続先の情報を記す。名前は適当に決められる。HostName・User・IdentityFileはsshコマンドの内容を分解して記しているだけ。- よく 「IdentifyFile」と間違えて「Bad configuration option」とかいうエラーが出てしまうので、つづりに注意。
- 参考 : ubuntu SSH Config + Github
mybastion と名付けた接続先定義は、特に問題ないだろう。
少々分かりづらいのは、myprivate と名付けた、「踏み台を経由して接続したいサーバ」の定義情報だろう。
IdentifyFileは、ローカル端末にある SSH 鍵ファイルを指定する。ProxyCommandは、ssh 【踏み台サーバのホスト名】 nc -w 10 %h %pと書く。コレはもうおまじないと捉えてしまって良い。
ProxyCommand という項目名のとおり、踏み台サーバを経由するよう、nc コマンドを指定している。%h や %p は ProxyCommand 用のオプションで、ホスト名とポート番号を表す。-w 10 は接続に失敗した場合のタイムアウト秒数。
ココで踏み台サーバがプロキシ的に機能するために、nc コマンドが踏み台サーバにインストールされている必要がある。
- 参考 : ncある限りぼくはどこまででもいけるッ! - (ひ)メモ
- 参考 : 2段階SSH接続を,ProxyCommandを使って一度のsshコマンドで接続する - Qiita
- 参考 : ~/.ssh/config で簡単に複数ホストへのSSH接続を管理する - すぱぶろ
実際に接続してみる
~/.ssh/config に定義した情報を参照して接続するには、以下のように Host 名を指定すれば良い。
$ ssh mybastion
# 踏み台サーバに SSH 接続した
$$ whoami
myadmin
さて、多段 SSH の真価、あたかも直接お目当てのサーバに繋いだかのように、コマンド1発で myprivate サーバに接続してみせよう。
$ ssh myprivate
# 目的のサーバに SSH 接続している
$$ whoami
myuser
このとおり、見た目上は mybastion サーバを経由していないようにすら見える。
3段以上の多段 SSH も原理上は可能
さて、仕組みが分かれば、Host myprivate 的な書き方をして中継サーバを間に3つも4つも作ることは、原理上できる。
理解が合ってるかしら…
自分が試した環境ではコレでうまく動いたのだが、ProxyCommand あたりは自分の理解が合っているか怪しい気がする…。