为什么我在 fstat 中看到同一套接字/端口的两行?

为什么我在 fstat 中看到同一套接字/端口的两行?

在 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 个实例。一个实例返回侦听连接,另一个实例切换到特权较低的用户。两者都有引用套接字连接的句柄的副本。

如果任何一个进程关闭套接字,那么与两个进程对同一文件的通信不同,连接将丢失。

相关内容