OpenBSD 6.1에서 볼 수 있는 것:
fstat | grep internet
내 openbsd 서버(192.168.102.128)에서 실행 하면 다음과 같은 결과가 나타납니다.
jrx sshd 87949 3* internet stream tcp 0x0 192.168.102.128:22 <-- 192.168.102.67:63857
root sshd 69801 3* internet stream tcp 0x0 192.168.102.128:22 <-- 192.168.102.67:63857
_smtpd smtpd 26906 8* internet6 stream tcp 0x0 [::1]:25
_smtpd smtpd 26906 9* internet6 stream tcp 0x0 [fe80::1%lo0]:25
_smtpd smtpd 26906 10* internet stream tcp 0x0 127.0.0.1:25
root sshd 20185 3* internet stream tcp 0x0 *:22
root sshd 20185 4* internet6 stream tcp 0x0 *:22
_syslogd syslogd 13823 4* internet dgram udp *:514
_syslogd syslogd 13823 5* internet6 dgram udp *:514
_dhcp dhclient 62845 3* internet dgram udp *:0
_dhcp dhclient 62845 9* internet raw ip 0x0
root dhclient 90416 3* internet dgram udp *:0
내 계정 jrx를 사용하여 호스트 192.168.102.67에서 SSH 연결이 있으므로 첫 번째 줄을 이해합니다.
그런데 두 번째 줄의 루트 계정이 동일한 소켓 및 동일한 클라이언트 포트에서 sshd(프로세스 69801)를 실행하는 이유는 무엇입니까?
이것이 클라이언트 측 SSH 클라이언트의 특별한 구성입니까? (클라이언트 측에서는 퍼티를 사용합니다)
편집하다: 존재하다절대 OpenBSD 제2판, 두 개가 아닌 하나의 연결선만 표시됩니다.
답변1
이것이 내가 기대했던 것입니다. 권한 있는 포트에서 수신 대기하려면 프로세스가 루트 권한으로 실행되어야 합니다. 그러나 사용자가 연결되면 연결하는 사용자의 권한으로 프로세스가 실행되기를 원합니다. 서버 프로세스가 단순히 권한을 포기하면 다른 사용자의 요청을 처리할 수 없습니다. 서버가 동시에 여러 연결을 처리해야 하는 문제도 있습니다. 따라서 루트로 실행되는 서버는 사용자가 연결할 때까지 소켓에서 수신 대기하다가 다른 요청을 처리하고 올바른 권한 수준으로 실행할 수 있도록 포크하여 2개의 인스턴스를 생성합니다. 한 인스턴스는 다시 연결 수신 대기 상태로 돌아가고 다른 인스턴스는 권한이 낮은 사용자로 전환됩니다. 둘 다 소켓 연결을 참조하는 핸들의 복사본을 가지고 있습니다.
만약에누구나프로세스가 소켓을 닫으면 동일한 파일에서 통신하는 두 프로세스와 달리 연결이 끊어집니다.