逆ポートフォワードで NAT 配下のサーバを外から弄る

  • 研究室の NAT 配下に一時的に置いたサーバを外から弄りたい。
  • でも、一時的なものだし、担当の先輩にポート開放頼むのもめんどくさいな。

と思ったので、ssh の逆方向のポートフォワードを使った。

弄りたいサーバ (以下 server) にて以下のコマンドを実行しておくと、example.com の 127.0.0.1:8022 が server の 127.0.0.1:22 に転送され、example.com で ssh localhost -p 8022 すると server につながる。

NAT 配下なので、ServerAliveInterval を設定して接続が維持されるようにしている。

# ssh -o ServerAliveInterval=30 -N -R 8022:127.0.0.1:22 example.com -l user

さらに、研究室のネットワークは、ネットワーク機器が古いせいかコネクションがブチブチ切れるので、接続が切れたら再接続するようにしたい。
なので、daemontools で上記コマンドを実行するようにする。

server から example.com にノーパスログインできるようにした上で、daemontools の run スクリプトを以下のように書く。

#!/bin/sh

PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/sbin:/usr/sbin
export PATH

sleep 3
exec 2>&1

exec ssh -o ServerAliveInterval=30 -N -R 8022:127.0.0.1:22 example.com -l user

このようにすれば、ssh 接続が切れた時だけでなく server が再起動した時も、勝手に再接続してくれる。
これは ssh -L や ssh -D の時にも使える。

ちなみに、example.com の sshd_config にて GatewayPorts を yes に設定すると、example.com の 0.0.0.0:8022 が転送されるようになり、example.com の外から 8022 番ポートにアクセスしても server につながる。