Closed2
SSH -Rでリバーストンネルを掘る
2つのマシンがあり、管理のため、BからAを操作したい。ただし、事情により、Aに対するインバウンド通信(Aを宛先とする通信)を完全に遮断したい。
リバースポートフォワーディング(ssh -R
)を利用すれば、Aからのアウトバウンド通信(Aを起点とする通信)のみで、Aをssh操作することができる。
接続方向
操作方向
操作者からすると、ssh(B)からsshd(A)に直接繋がっているように見える。
接続方法
あらかじめ、ssh(A)からsshd(B)への接続時に以下のようにオプション指定し、トンネルを掘る。
ssh -R <Z>:localhost:<Y> -p <X> userB@B
この要請によって、sshd(B)はポートZへのアクセスをlistenするようになる。
実際に、ssh(B)からsshd(A)に接続する際は、このポートZにアクセスすれば、sshd(B)とssh(A)がリレーしてくれる(今回はたまたまsshを転送しているが、何でも転送できる)。
ssh userA@localhost -p <Z>
サーバ側の設定
sshd_config
AllowTcpForwarding yes
ポートフォワーディング機能をONにするだけ。
Dockerfileなどに書くなら、こう。
sed -i 's/AllowTcpForwarding no/AllowTcpForwarding yes/g' /etc/ssh/sshd_config
クライアント側の設定
ポートフォワーディングに関しては、特に何も設定する必要はない。
ただ、AWS SSMのようにエージェントのみで完結する方式と違い、この方式ではsshdを起動しておく必要があるため、外部からの接続を受け入れないよう締めておく。
sshd_config
# --- 接続元制限 ---
ListenAddress 127.0.0.1
# --- ユーザ制限 ---
AllowUsers userA
# --- 認証方式の制限 ---
PasswordAuthentication no
PermitRootLogin no
ChallengeResponseAuthentication no
UsePAM no
これで、同じマシン上からの接続しかできなくなる。
また、userAでのみ、公開鍵認証でのみ接続可能な状態になるので、外部から攻撃される余地をかなり減らせるはず。
このスクラップは4ヶ月前にクローズされました