Linuxサーバに掲題の内容を設定する機会があり、
なんだかんだ時間がかかってしまったためメモ。
そして誰かの役に立ってくれればと思い、書いてみました。
やりたかったこと
・Linuxサーバ(Local)にトンネル(local:50000)を設置
・Linuxサーバ(踏み台)からRDSへ接続
・とあるサービス(Linuxサーバ(Local)で動いている)でトンネルを使用してRDSへ接続
・なので自分が接続するためではなく、あくまでなんかのサービス様の利用目的
各情報
Localサーバ
・port 50000をRDSへsshポートフォワーディング
踏み台サーバ
ホスト :「999.999.999.999」
ユーザ名:「fumidai」
証明書 :「/etc/ssh/fumidai.pem」
RDS
ホスト :「RDS.com」
ポート :「3306」
結局いきついたコマンド
上記の各情報を踏まえて以下になりました。
「ssh -o ServerAliveInterval=30 -f -N -L 50000:RDS.com:3306 fumidai@999.999.999.999 -i /etc/ssh/fumidai.pem」
簡単なコマンドの説明
オプション「-o」
「-o」オプションを設定することで、ssh_configに記載されているパラメータを設定できるみたい。
「-o XXXXX=30」とか。
オプション「-f -N」
ポートフォワーディング(トンネル)のプロセスをバックグラウンドにしたい場合に必要。
二つじゃないとだめ、「-f」だけだと無理。
オプション「-L」
Localサーバのlocalポート指定時に使用。
「-R」の場合リモートみたい。詳しくは調べてない。
オプション「-i」
証明書の参照先。
コマンドにいきつくまで大変だったこと。
基本的なことだけど、出たとこ勝負でやるところがあるから何度もこけまくった。
証明書の権限
sshは権限に厳しいです。ちゃんと設定しないと接続してくれません。
参考サイト様:(https://note.mokuzine.net/ssh-permission-denied/)
プロセスが勝手に落ちる
どこのサイト様を見ても、バックグラウンドでトンネル設定を入れて、削除する場合は
プロセスを見つけてkillするとある。
しかし勝手に落ちられてしまうのは勘弁したい。
「-f -N」で動かした以上、バックグラウンドで動いてくれる。
netstatコマンドでも確認したが、ちゃんとListenの状態になっている。
しかし、大体2時間15分後くらいに落ちる。
しかも、プロセス起動して1時間後くらい(Listenのまま放置)に、サービス側に通信させると、
だいぶ放置しちゃったからなのか、ちゃんと通信が行われない。途中で失敗する。
そりゃ、通信も何も無しなので、なんか起きてるんだろうなと思ってました。
詳しく調べてみると、karnel?の仕様か何かで、通信が無い場合は、切れるみたい。
実際にプロセスを実行したターミナルにはプロセスが落ちたタイミングで「Write failed: Broken pipe」
って表示されてた。
参考サイト様:(https://www.riscascape.net/archives/9570)
:(https://alpha-netzilla.blogspot.com/2011/12/tcp-keepalive.html)
:(https://qiita.com/kuni-nakaji/items/c07004c7d9e5bb683bc2)
プロセスをどうにか生き永らえさせる
sshには「ServerAliveInterval」等があり、指定された周期・回数で通信を行ってくれる。
これで勝手に死ぬことはなくなりました。
1時間後くらい(Listenのまま放置)してもちゃんと通信も出来ている。
sshdの設定ではこのあたりの設定はデフォルトで「0」動きません。
参考サイト様:(https://qiita.com/ysk24ok/items/2f4ced5edf306fdd9dfb)
:(http://www.koganemaru.co.jp/cgi-bin/mroff.cgi?sect=5&cmd=&lc=1&subdir=man&dir=jpman-11.2.2%2Fman&subdir=man&man=ssh_config)
:(https://tech.sv-cat.net/entry/2018/08/21/190127)
今後の課題
といってもやはりプロセスは1回起こせばいいってものじゃない。
多分なんかで落ちてしまう場合があるはず。
通信先の踏み台やRDSが落ちたりしたら、間違いなくプロセスは落ちちゃう。
なので不慮の事故を想定して、再度プロセスを起動する仕組みが必要。
crondで監視して回す予定。systemdでサービス化も考えたけれども、
結局シェル頼みになりそうだから、crondでよさそう。
他にもっと良い手段等ございましたら、ご享受いただけると幸いです。