t.sugi
2024年8月5日 17時33分
お世話になっております。
Debian12をインストールしたArmadillo-IoT G3LでSSHを使用する際に待ち受けIPをeth0に設定したIPに制限するためにsshd_configでListenAddressを設定したところ、以下の通りの動作となりました。
・ハードウェア起動時は設定が有効にならない。
・ハード起動後コンソールからSSHのサービスを再起動させた場合は設定が有効になる。
・SSHのサービスファイル(ssh.service)に以下を追加するとハード起動時でも設定が有効になる。
After=network-online.target
Wants=network-online.target
上記よりハードウェア起動時ネットワークインタフェースの起動がSSHの起動までに間に合っておらず、SSH側で設定情報を読み込んだ際に指定されたIPを認識できていないのではないかと考えております。
なお、Debian10ではssh.serviceに上記の設定を追加しなくてもハード起動時にListenAddressの設定が有効になっていました。
対策としては上記の通りssh.serviceを修正することで可能と考えていますが、SSHのサービスファイルを変更せずに対応する方法がありましたら教えていただけないでしょうか。
コメント
at_dominique.m…
t.sugiさん
お待たせしました、
マルティネです。
> 上記よりハードウェア起動時ネットワークインタフェースの起動がSSHの起動までに間に合っておらず、SSH側で設定情報を読み込んだ際に指定されたIPを認識できていないのではないかと考えております。
はい、ssh 起動時に ip が存在しない場合にエラーします:
root@armadillo:~# /usr/sbin/sshd -o ListenAddress=10.1.1.2 -d debug1: sshd version OpenSSH_7.9, OpenSSL 1.1.1n 15 Mar 2022 debug1: private host key #0: ssh-rsa SHA256:SwlxxF+ss2HCMN/DI8AYXRLGEyz3WAswwE5gViU7MJU debug1: private host key #1: ecdsa-sha2-nistp256 SHA256:BmGGWUbeVYNQ5qBoFLkaNbWqVrH+veyoGiBBh4BgMNI debug1: private host key #2: ssh-ed25519 SHA256:mmb/Sj0GGllvIxW0EZ/Niox5+uf+6cxs+pcHN/vzKCQ debug1: rexec_argv[0]='/usr/sbin/sshd' debug1: rexec_argv[1]='-o' debug1: rexec_argv[2]='ListenAddress=10.1.1.2' debug1: rexec_argv[3]='-d' debug1: Set /proc/self/oom_score_adj from 0 to -1000 debug1: Bind to port 22 on 10.1.1.2. Bind to port 22 on 10.1.1.2 failed: Cannot assign requested address. Cannot bind any address. root@armadillo:~# echo $? 255
> なお、Debian10ではssh.serviceに上記の設定を追加しなくてもハード起動時にListenAddressの設定が有効になっていました。
Debian10 でも network-online前に sshd が実行されてますので、アップデートで何かのタイミングが変わりましたね。
サービスに Restart=on-failure がありますので、Debian10 でリトライの回数が足りていて Debian12 で eth0 の ip を設定する前に諦めている可能性があります。
失敗した時の「journalctl -b -u sshd
」で確認できます。
> 対策としては上記の通りssh.serviceを修正することで可能と考えていますが、SSHのサービスファイルを変更せずに対応する方法がありましたら教えていただけないでしょうか。
方法はいくつか考えれます:
- systemd のサービスは drop-in という別のファイルで変更できますので、「systemctl edit sshd」 (か直接に)/etc/systemd/system/ssh.service.d/hoge.conf で [unit]のAfter/wants だけを設定するのはそんなに悪くないと考えています。
- systemd のポリシーとしては、一般的に個別のアドレス・インタフェースに listen しないでくださいというスタンスですので、ListenAddress ではなく別の方法でフィルターすればこの問題がなくなります。方法としては iptables/nftables、sshd の別のオプション(Match address や AllowUsers等)、systemd の IPAddressDeny/Allow 等の設定も可能です。
よろしくお願いします
t.sugi
t.sugi
2024年8月8日 14時42分
お忙しいところ申し訳ありませんが、本件ご回答をいただくことはできますでしょうか?