autosshをサービス化してSSH接続を強化
Page content
autosshがなぜかいなくなる
SSHのセッションを極力持続してくれるツールとして「autossh」がある。
このautosshを自宅のUbuntuサーバで利用中、いつのまにかSSHセッションのプロセスがいなくなっていることがあって (他のプロセスが上限近くまでメモリ消費する時間帯が毎日あるせいかもしれない)、時折困っていた。autosshのオプションを変更したりして改善を試みたものの、埒が明かない。
状況の改善には、対処療法的ではあるが「autosshのプロセス監視が必要かな?」と考えていたところ、autosshをsystemdでサービス化する方法があることを知った。これだと、何らかの原因でもしautosshのサービスが落ちても、サービス再起動の処理をsystemdに任せることができるらしい。
systemdでサービス化する方法
autosshのサービス化をsystemdでどのように行えばいいか、具体的な方法をウェブ検索してみると、断片的な情報も多いが、次のリンクにあった一連の作業手順が良くまとまっていて、そのまま過不足無く使えたので、ご紹介します。
どのような手順なのか、簡単に解説です。
- ファイル
/etc/default/autossh@example
と/etc/systemd/system/autossh@.service
の雛形をcurlで取得する - サービス化するautosshの実行ユーザとして「tunnel」を用意し、初回のSSH公開鍵認証を済ませる
/etc/default/autossh@example
を、ファイル名の「example」部分を任意の文字列に、たとえば「host1」に変更して複製する (このファイル名がサービスの識別子になる)/etc/default/autossh@host1
内の次の2行を、実施したいSSHポートフォワーディングの内容に合わせて編集する
TARGET_HOST=remote.example.com
FORWARDS=-L 7474:127.0.0.1:7474
systemctl start autossh@host1.service
でサービスを起動し、正常に起動するかどうかログを確認する- サービスが正常に起動したなら、
systemctl enable autossh@host1.service
で自動起動を設定しておくとよし
サービスの状態確認
サービスの状態確認は、systemctl status autossh@host1.service
で行うことができる。下記はその一例。
$ systemctl status autossh@host1.service
* autossh@host1.service - Keeps an ssh tunnel to host1 open
Loaded: loaded (/etc/systemd/system/autossh@.service; indirect; vendor preset: enabled)
Active: active (running) since Wed 2019-07-17 19:54:26 JST; 1 day 3h ago
Main PID: 1476 (autossh)
Tasks: 2 (limit: 4915)
CGroup: /system.slice/system-autossh.slice/autossh@host1.service
|-1476 /usr/lib/autossh/autossh -NT -o ExitOnForwardFailure=yes -o ServerAliveInterval=10...(省略)
`-1560 /usr/bin/ssh -NT -o ExitOnForwardFailure=yes -o ServerAliveInterval=10 -o ServerAl...(省略)
Jul 17 19:54:26 host2 systemd[1]: Started Keeps an ssh tunnel to host1 open.
Jul 17 19:54:27 host2 autossh[1476]: port set to 0, monitoring disabled
Jul 17 19:54:27 host2 autossh[1476]: starting ssh (count 1)
Jul 17 19:54:27 host2 autossh[1476]: ssh child pid is 1560
感想
今回のautosshサービスを24時間以上動かしているが、接続は切れておらずいまのところ問題なし。
実は私、今回はじめて、ユーザプロセスのsystemdでのサービス化をやってみたのだった。これは楽だし実用的だなぁ、と巨人の肩の上に乗る威力を思い知る。良いテンプレートを参考にするとほぼ難しくないし、他のプロセスのサービス化にも挑戦してみる気になっている。