조건 설명

조건 설명

조건 설명

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가 지속적으로 실행되지 않고 클라이언트를 처리하기 위해 하나의 인스턴스만 호출한다는 것을 의미합니다. 대신 systemd가 포트 22에서 수신 대기 중임을 표시합니다. systemd와 sshd는 동시에 동일한 포트에서 수신 대기할 수 없으므로 ssh.service를 지정하는 ssh.socket에 충돌이 있습니다.

답변2

이해해야 할 중요한 점은 당신이 보고 있는 것이 "소켓" 장치의 특정 용도라는 것입니다.:http://0pointer.de/blog/projects/inetd.html

따라서 의 특정 경우에는 ssh.socket이전 스타일과 동일합니다.inetd와 유사한 호출(코어 소켓 장치 설정: ) Accept=yes, 여기서 포트 22(systemd에서 관리)로 들어오는 각 요청은 별도의 실행을 초래합니다.[email protected] .

systemd.socket 매뉴얼 페이지도 참조하십시오.https://www.freedesktop.org/software/systemd/man/systemd.socket.html

Accept=yes로 설정된 경우 서비스 템플릿은[이메일 보호됨]존재해야 하며 서비스는 들어오는 연결마다 인스턴스화됩니다.

따라서 sshd를 시작하는 방법에는 두 가지가 있습니다.

  • ssh.service( sshd.service별칭일 뿐) 기본 sshd 프로세스를 시작한 다음 들어오는 모든 연결을 처리하고 하위 프로세스를 생성하는 등의 작업을 수행합니다.
  • ssh.socket+ [email protected], 여기서 systemd는 소켓 관리 포트에서 들어오는 각 연결을 새 인스턴스에 연결합니다.[이메일 보호됨], inetd 스타일. 그렇기 때문에 템플릿 서비스에는 StandardInput=socket, , 에 대한 옵션이 ExecStart=/usr/sbin/sshd있습니다 -i.

분명히 한 번에 하나의 방법만 사용할 수 있으므로 Conflicts=두 방법이 동시에 실행되지 않도록 하십시오. (그런데 섹션의 실제 위치는 Conflicts=중요하지 않습니다. ssh.service에 해당 섹션을 작성할 수 있지만 하나만 있으면 충분합니다.)

관련 정보