SSHによるリバースポートフォワードについて整理してみました。DHCPクライアントとして起動するマシンはIPアドレスが変動するので、IPアドレスを確認してからでないと、SSHログインができません。IPアドレスを使わなくてもSSHログインできるようにする方法にはいくつかありますが、応用性の高いものにSSHによるリバースポートフォワードがあります。SSH接続用ゲートウェイマシンを用意しておいて、そこへDHCPクライアントとして起動するマシンからSSHリバースポートフォワードで接続させればいいのです。ここでは、その実現手順について簡単に説明をします。
DHCPクライアントとして起動するマシンhost001から、固定IP 192.168.0.100 を持つマシンへリバースポートフォワードをすることにします。つまり、192.168.0.100がSSH接続用ゲートウェイマシンだとします。また、192.168.0.100にはSSH接続ができるユーザuser001が用意されていて、これを使うとします。
最初に、host001 上で鍵の生成をし、192.168.0.100へコピー
$ ssh-keygen $ ssh-copy-id user001@192.168.0.100
host001 上で、$HOME/.ssh/config へ接続維持のための設定を追加
Host 192.168.0.100 ServerAliveInterval 60 ExitOnForwardFailure yes TCPKeepAlive no
host001 上に reverse_ssh.sh の自動接続用スクリプトを用意。指定した$CMDが実行されていない場合は起動します。
#!/bin/sh host_ip="192.168.0.100" port="10022" ssh_port="22" user="user001" CMD="ssh -l ${user} -N -f -R ${port}:localhost:${ssh_port} ${host_ip}" pgrep -f -x "$CMD" > /dev/null 2>&1 || $CMD
crontab -e で reverse_ssh.sh で1分ごとに自動起動チェック
* * * * * /bin/sh /root/reverse_ssh.sh
リバースポートフォワードを接続された方(ここでは192.168.0.100)では、localhostの10022ポートへSSH接続することで、SSHリバースポート接続をしてきているマシンへログインできます。ここでは、host001にはユーザ vagrant でパスワード認証のSSHログインができるとします。host001へ接続するためにlocalhostと指定している点に注意をしてください。
$ netstat -a | grep localhost|grep 10022 tcp6 0 0 localhost:10022 [::]:* LISTEN $ ssh -l vagrant -p 10022 localhost
SSHリバースポート接続をしてきているマシンのIPアドレスを確認するには192.168.0.100で下記コマンドを実行します。hostname -Iのコマンドがhost001上で実行されるのでIPアドレスがわかります。
$ ssh -l vagrant -p 10022 localhost hostname -I vagrant@localhost's password: 192.168.1.123