古いノートPCにLubuntuを入れ、家庭内で使う軽量な作業用マシンとして整えようと思いました。GUI操作は最小限にして、基本はmacOSからSSHで接続する想定です。
ところが、OpenSSHを入れて設定した直後、SSH接続がうまくいったり、途中で止まったりする状態に遭遇しました。
1. OpenSSHを入れた直後の違和感
Lubuntu 24.04 LTS をインストールしたPCをLAN内に設置し、
クライアントはmacOSのターミナルです。
SSHは標準のOpenSSHを使用しています。
Lubuntu側でOpenSSHサーバーをインストールし、systemctl status sshで確認すると、サービスは確かに起動していました。

それにもかかわらず、macOSから ssh user@IPアドレス を実行すると、何も表示されないまま待機状態になりました。
ユーザー名やIPアドレスを間違えると即座にエラーになるため、通信自体は成立していそうでした。
この時点では、設定ミスなのか、ネットワークの問題なのか判断がつきませんでした。
1.1. 時間をおいたらログインできた
しばらくしてから再度SSH接続を試すと、今度は正常にログインできました。

初回接続時のホスト鍵のfingerprint確認が表示され、その後 lubuntu側のユーザーのログインパスワードを入力するとログイン完了です。
2. 公開鍵認証の設定(ssh-copy-id)
パスワード入力を毎回行うのは手間なので、macOS側でSSHキーを作成し、ssh-copy-idを使ってLubuntu側に公開鍵を登録しました。
ssh-keygen -t ed25519
ssh-copy-id user@IPアドレスCode language: CSS (css)

この作業自体は特に問題なく完了し、鍵認証でもログインできるようになりました。

2.1. SSHのセキュリティ重視の設定(sshd_config)
公開鍵ログインを有効化して動作確認できたので、パスワードによるログインを無効化しました。
/etc/ssh/sshd_configを編集して、コメントアウトされている箇所を変更しました。

root 直接ログインは原則禁止し、公開鍵認証を主にしました。
PermitRootLogin no
PubkeyAuthentication yes
AuthenticationMethods publickey
PasswordAuthentication no
KbdInteractiveAuthentication no
AllowUsers chii
総当たり攻撃に備えるため、ログイン試行の回数を制限しました。
また、SSH の転送機能は「使わない」のでオフにしています。
あと、ポート番号も標準の22ではなく、別の番号に変更しておきます。
Port ######
MaxAuthTries 3
LoginGraceTime 20
MaxSessions 2
AllowAgentForwarding no
AllowTcpForwarding no
X11Forwarding no
PermitTunnel no
Code language: PHP (php)
これらを変更後、設定ファイルをテストし、sshを再起動しました。
sudo sshd -t
sudo systemctl daemon-reload
sudo systemctl restart ssh
2.2. sshの接続でポート番号を指定する
開いているポート番号を変更したので、sshでアクセスするときに -p オプションでポート番号を指定します。

そうでないと、「port 22: Connection refused」というエラーになります。
これを毎回指定するのは大変なので、クライアント側で設定しておくことができます。~/.ssh/config に保存します(すでにあれば追記)。

Host test-lubuntu
HostName 192.168.2.108
User chii
Port ######
Code language: CSS (css)
すると、以後は登録しているホスト名でアクセスできます。
ssh test-lubuntu

3. 突然の切断とエラーメッセージ
しばらく作業していると、SSH接続が突然切断され、次のようなエラーが表示されました。
client_loop: ssh_packet_write_poll: Connection to 192.168.2.108 port n: Host is downCode language: CSS (css)
最初は認証や鍵の設定を疑いましたが、このメッセージは「相手ホストと通信できなくなった」ことを示すもので、認証エラーではありません。
つまり、SSHの設定そのものではなく、接続先の状態に原因があると分かりました。
3.1. 原因はスリープだった
調べていくと、Lubuntu側が一定時間操作されないと自動的にスリープに入っていることが分かりました。
SSHで接続中でも、ディスプレイや電源管理の設定によってはサスペンドされてしまいます。
スリープに入れば、当然SSHは応答しなくなります。
3.2. systemctl mask sleep.target
そこで、systemdの機能を使い、スリープやサスペンド関連のtargetをまとめて無効化しました。
sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.targetCode language: CSS (css)
sleep.targetやsuspend.targetなどをmaskすると、OSレベルでこれらの動作が禁止されます。
GUIの省電力設定よりも強力で、SSH用途には向いた方法です。
3.3. wifi-powersave.conf
また、NetworkManager の Wi-Fi 省電力も無効化しておきました。
sudo nano /etc/NetworkManager/conf.d/wifi-powersave.conf
wifi-powersave.confは空だったので、以下の設定ファイルを保存しました
[connection]
wifi.powersave = 2
あとは、NetworkManagerを再起動しました。
sudo systemctl restart NetworkManager
4. まとめ
今回の問題は、SSHの設定ミスではなく、Lubuntu側の省電力動作が原因でした。
サービスが起動していても、ホスト自体がスリープしてしまえば接続は維持できません。
SSHを常用する用途では、スリープやネットワーク省電力の挙動まで含めて確認する必要があると感じました。