😸

SSH トンネル (SSH Port Forwarding) によるリモートアクセス

2021/04/10に公開

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