😸
SSH トンネル (SSH Port Forwarding) によるリモートアクセス
SSH Port Forwarding を使うと、直接アクセスできないサーバーに、踏み台サーバーの SSH を経由してアクセスすることができます。
実行例
ポート転送の実行
ssh コマンドで -L オプションを指定してポート転送(port forwarding)を実行すると、ローカル PC 上のバインドポートへの通信が、踏み台(Bastion)サーバーを経由してリモートサーバーに転送されるようになります。(BIND_PORT にはローカル PC 上で他に使用していない番号を指定すること)
BIND_HOST=localhost
BIND_PORT=(ローカル PC にバインドするポート番号)
BASTION_HOST=(踏み台サーバーのホスト名またはアドレス)
BASTION_SSH_PORT=(踏み台サーバーの SSH ポート番号)
BASTION_USERNAME=(踏み台サーバーの SSH ユーザー名)
REMOTE_HOST=(アクセスしたいリモートサーバーのホスト名またはアドレス)
REMOTE_PORT=(アクセスしたいリモートサーバーのサービスポート番号)
ssh -v -N -L ${BIND_HOST}:${BIND_PORT}:${REMOTE_HOST}:${REMOTE_PORT} -p ${BASTION_SSH_PORT} ${BASTION_USERNAME}@${BASTION_HOST}
これを実行したまま、ローカル PC のバインドしたポートに対して通信することで踏み台サーバー経由でリモートサーバーと通信することができます。
例) SSH トンネルを経由してリモートサーバーに SSH でログインする場合。
REMOTE_USERNAME=(アクセスしたいリモートサーバーの SSH ユーザー名)
ssh -p ${BIND_PORT} ${REMOTE_USERNAME}@localhost
例) SSH トンネルを経由してリモートサーバーの MySQL サーバーにアクセスする場合。
DB_USERNAME=(DB ユーザー名)
mysql -h localhost -P ${BIND_PORT} --protocol TCP -u ${DB_USERNAME} -p -e "(SQL)"
ssh/scp で一発アクセスする
ssh コマンドでは ProxyCommand オプションに指定することで、上で説明したポート転送コマンドを別途実行せずに、一発で踏み台サーバーを経由してアクセスすることもできます。
例) ssh
ssh -o ProxyCommand="ssh -p ${BASTION_SSH_PORT} ${BASTION_USERNAME}@${BASTION_HOST} -W %h:%p" \
${REMOTE_USERNAME}@${REMOTE_HOST}
例) scp
scp -o ProxyCommand="ssh -p ${BASTION_SSH_PORT} ${BASTION_USERNAME}@${BASTION_HOST} -W %h:%p" \
(転送するファイル) <remote_user>@<remote_host>:<remote_path>
Discussion