条件説明
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
ユニットファイルにディレクティブがありません。Before
sshd.socket
どちらのシステムも、これによって発生する問題を発見できませんでした。何か目的があると思われますが、見つかりません。
ベストアンサー1
systemdソケットは、systemdが自分自身をポート(またはUnixドメインソケットファイルパスなどの他のリソース)にバインドし、すべての接続に対して新しいサービスインスタンスを作成できるようにする特別な種類のデバイスです。 ssh.serviceが有効になると、sshdはlsofに示されているように継続的に実行され、ソケットにバインドされます。対照的に、ssh.socketを有効にすることは、sshdが継続的に実行されず、クライアントを処理するために1つのインスタンスのみを呼び出すことを意味します。代わりに、systemdがポート22でリッスンしていることを示します。 systemdとsshdは同時に同じポートでリッスンできないため、ssh.serviceを指定するssh.socketに競合があります。