OpenSSHのリモートポートフォワーディングでは、転送するポートにアクセスできるのはデフォルトでは踏み台サーバ自身のみとなっています。
例えばssh -i keyfile.pem fumidai@a.b.c.d -R 8800:localhost:80
で踏み台サーバにログインし、ss -lt
を実行すると
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 0.0.0.0:ssh 0.0.0.0:*
LISTEN 0 128 127.0.0.1:8800 0.0.0.0:*
LISTEN 0 128 [::]:ssh [::]:*
LISTEN 0 128 [::1]:8800 [::]:*
というようにポート8800
はアドレス127.0.0.1
(と[::1]
)でのみ待ち受けるようになっている事が確認出来ます。
他のホストからもポート8800
へのアクセスを受け付けるようにするには、sshと同じようにすべてのアドレスを表す0.0.0.0
で待ち受けるようにするか、アドレスを個別に指定してa.b.c.d
で待ち受けるようにする必要があります。
sshd_configの変更
sshdはデフォルトではリモートポートフォワーディング時の待ち受けるポートを変更できないようになっています。これを変更できるようにするには、/etc/ssh/sshd_config
を編集し、GatewayPorts
をclientspecified
に変更します。
変更後:
GatewayPorts clientspecified
編集が終わったらsystemctl restart ssh.service
でsshdを再起動します。
注: Google等で検索するとGatewayPorts
をyes
にする方法が紹介されている事が有りますが、この設定は望ましくないので、特別な理由がなければclientspecified
を使うようにしてください。
待ち受けアドレスの指定方法
GatewayPorts
を変更しただけでは、リモートポートフォワーディング時の待ち受けポートは変わりません。
変える為には、ssh接続時に以下のようにサーバ側での待ち受けポートを指定する必要が有ります。
ssh -i keyfile.pem fumidai@a.b.c.d -R 0.0.0.0:8800:localhost:80 -N
これで踏み台サーバ上で0.0.0.0:8800
で待ち受けるようになるはずです。
他の原因
自宅サーバ上で ssh -i keyfile.pem fumidai@a.b.c.d -R 8800:localhost:80 -N を実行しましたが、インターネットから接続できません。タイムアウトします。
タイムアウトするというのはちょっと気になりますね。待ち受けアドレスの問題ならば通常はタイムアウトではなくて接続が拒否されます。
本当にタイムアウトしているならば、上記の待ち受けアドレスの問題の他にネットワークの問題が有ると思われます。
その場合はファイアウォール等で接続を止めていないか確認してみてください。
他の方法
sshのリモートポートフォワーディングを使う場合、ssh接続していない間は接続出来なくなるという問題が有ります。
本格的にやるならば自宅サーバと踏み台サーバの間でVPNを張って、踏み台サーバ上でリバースプロキシを動かすという方法を取る事になると思います。
ただ、手軽にやるならばsshのリモートポートフォワーディングを使うのも悪くは無いと思います。