korechi’s diary

とあるVR/ARエンジニアのブログ

リバースポートフォワーディングまわり

参考記事
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>

で切ることができる。