Closed2

SSH -Rでリバーストンネルを掘る

js4000alljs4000all

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>
js4000alljs4000all

サーバ側の設定

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ヶ月前にクローズされました