在 OpenBSD 6.1 上看到:
当我fstat | grep internet
在我的 openbsd 服务器(192.168.102.128)上执行 a 时,我得到以下结果:
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 连接,所以我理解第一行。
但是为什么第二行的 root 帐户从同一个套接字和同一个客户端端口执行 sshd(进程 69801)?
这是我的 SSH 客户端在客户端的特殊配置吗? (我在客户端使用putty)
编辑: 在绝对 OpenBSD 第二版,您只能看到一根连接线,而不是两条。
答案1
这是我所期望的。要侦听特权端口,进程必须以 root 特权运行。但是,一旦用户连接,我们希望该进程以连接用户的权限运行。如果服务器进程只是放弃其特权,那么它将无法为来自不同用户的请求提供服务。还有一个问题是服务器必须同时处理多个连接。因此,发生的情况是,服务器(以 root 身份运行)监听套接字,直到用户连接,然后为了允许它处理其他请求并以正确的权限级别运行,它会分叉,创建 2 个实例。一个实例返回侦听连接,另一个实例切换到特权较低的用户。两者都有引用套接字连接的句柄的副本。
如果任何一个进程关闭套接字,那么与两个进程对同一文件的通信不同,连接将丢失。