リバースポートフォワーディングまわり
参考記事
DHCPクライアントとして起動するマシンはIPアドレスが変動するため、IPアドレスを確認してからでないとSSHログインができない。
そこでSSH接続用ゲートウェイマシンを用意して、DHCPクライアントとして起動するマシンからSSHリバースポートフォワードで接続させる。
以下はCentOSで行った。
使い方
クライアント上の~/.ssh/configへ
Host <接続先サーバーIP> ServerAliveInterval 60 ExitOnForwardFailure yes TCPKeepAlive no
を追加。そしてreverse_ssh.shの自動接続用スクリプトを以下のように用意する。
$ vim reverse_ssh.sh
host_ip="***.***.***.*" port="22222" ssh_port="22" user="user_name" CMD="ssh -l ${user} -N -f -R ${port}:localhost:${ssh_port} ${host_ip}" pgrep -f -x "$CMD" > /dev/null 2>&1 || $CMD
***は接続したいホストのIPアドレスを、user_nameにはそこに接続するためのユーザー名をいれる。
それが自動的に行われるように
$ crontab -e
をして、vimが立ち上がるので
* * * * * /bin/sh /<さっきの置いた場所>/reverse_ssh.sh tunnel.log 2>&1
と上書き保存する。
サーバー側から、sshされているか確認するコマンドは
$ netstat -a | grep localhost
で空いているポート番号を確認できる。さきほど記したポート番号があればオッケー
問題
起動時には何故か一発でreverse_ssh.shが起動されない。調べると
$ tunnel.log Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
とパーミッションの問題で接続ができていないことが分かる。
これは、crontabの権限や.shファイルまわりの権限、もしくは.ssh以下のファイルの設定が怪しいと睨んでいるが解決できずにいる。
仕方ないので手動で
$ ./reverse_ssh.sh
と行っている。手動で行えるのも謎。。。
ポートの削除
クライアント側からは、バックグラウンドでsshが起動するので、それをやめたい時は
ps -ef | grep <調べたいポート番号>
で調べたいポート番号のPIDが分かるため
kill <そのPID>
で切ることができる。