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 あたりは自分の理解が合っているか怪しい気がする…。