条件説明

条件説明

条件説明

Ubuntu 18.04.3 LTSでsystemdとsshを使用すると、奇妙な状況が発生します。

デバイスの状態を確認しましたssh.socket

$ systemctl status ssh.socket
● ssh.socket - OpenBSD Secure Shell server socket
   Loaded: loaded (/lib/systemd/system/ssh.socket; disabled; vendor preset: enabled)
   Active: inactive (dead)
   Listen: [::]:22 (Stream)
 Accepted: 0; Connected: 0

非アクティブですが、同時に ssh でログインするため、サービス自体が実行され、SSH 用ソケットとそのポートが開いています。

$ lsof -P -i -n | grep sshd
sshd      26785            root    3u  IPv4 14858764      0t0  TCP 10.200.130.28:22->10.100.40.141:42188 (ESTABLISHED)
sshd      26875          xxx_root    3u  IPv4 14858764      0t0  TCP 10.200.130.28:22->10.100.40.141:42188 (ESTABLISHED)
sshd      63859            root    3u  IPv4   238437      0t0  TCP *:22 (LISTEN)
sshd      63859            root    4u  IPv6   238439      0t0  TCP *:22 (LISTEN)

だからssh.socketのユニットファイルを見ました/lib/systemd/system/ssh.socket

[Unit]
Description=OpenBSD Secure Shell server socket
Before=ssh.service
Conflicts=ssh.service
ConditionPathExists=!/etc/ssh/sshd_not_to_be_run

[Socket]
ListenStream=22
Accept=yes

[Install]
WantedBy=sockets.target

このBefore=ssh.serviceディレクティブはsshサービスの前に開始する必要があり、このConflicts=ssh.serviceディレクティブはsshサービスの開始時に停止する必要があります。

これは、ユニットファイルの面で発生する理由を説明しますが、他の質問を提起します。

質問

ssh.socketデバイスの非アクティブ状態が実際のSSHソケットに影響しないのはなぜですか?

管理者がこのConflictディレクティブを追加したのはなぜですか?たとえば、docker.socketそのユニットファイルが設定されていないことを確認した場合、docker.service.sshdの場合はどうなりますか?

追加情報

私は古いFedora 30ワークステーションでもこれを確認しました。条件は同じですが、若干の違いがあります。つまり、sshd.serviceおよびをユニット名として使用し、sshd.socketユニットファイルにディレクティブがありません。Beforesshd.socket

どちらのシステムも、これによって発生する問題を発見できませんでした。何か目的があると思われますが、見つかりません。

ベストアンサー1

systemdソケットは、systemdが自分自身をポート(またはUnixドメインソケットファイルパスなどの他のリソース)にバインドし、すべての接続に対して新しいサービスインスタンスを作成できるようにする特別な種類のデバイスです。 ssh.serviceが有効になると、sshdはlsofに示されているように継続的に実行され、ソケットにバインドされます。対照的に、ssh.socketを有効にすることは、sshdが継続的に実行されず、クライアントを処理するために1つのインスタンスのみを呼び出すことを意味します。代わりに、systemdがポート22でリッスンしていることを示します。 systemdとsshdは同時に同じポートでリッスンできないため、ssh.serviceを指定するssh.socketに競合があります。

おすすめ記事