SSHによるリバースポートフォワード

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 
同じタグの記事: Linux
同じタグの記事: SSH
同じカテゴリの記事: Linux