奇怪的 init 进程监听 TCP 端口 53,LinuxMint Victoria

奇怪的 init 进程监听 TCP 端口 53,LinuxMint Victoria

当我运行时netstat -nptl,我有这个奇怪的输出:

tcp        0      0 127.0.2.1:53            0.0.0.0:*               LISTEN      1/init

这是来自dnscrypt-proxyDoH 服务的默认配置。

ps uww 1
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.1  0.0 166580 11936 ?        Ss   12:15   0:01 /sbin/init splash

我想知道为什么 PID 1 现在没有意义了

答案1

在 Linux 上 usingnetstat应替换为 using ss,因为它提供了更多信息。对于这种情况,它提供了全部共享套接字的进程,同时netstat在第一个进程停止。还有其他细微差别,例如提供comm名称 ( systemd) 而不是cmd名称 ( init)。这里是 Debian 12,但任何基于 systemd 的 Linux 系统都会类似:

# netstat -tnlp | awk 'NR <=2 || /127.0.2.1:/'
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.2.1:53            0.0.0.0:*               LISTEN      1/init              
# ss -nptl src 127.0.2.1
State   Recv-Q  Send-Q   Local Address:Port     Peer Address:Port  Process  
LISTEN  0       4096         127.0.2.1:53            0.0.0.0:*      users:(("dnscrypt-proxy",pid=6245,fd=8),("systemd",pid=1,fd=49))

可以看到两者systemd共享dnscrypt-proxy同一个套接字。

为什么?因为dnscrypt-proxy虽然正在运行系统插座 激活: 类似的机制内网但经过改进,允许(如果如此配置)在守护进程实际运行之前进行套接字侦听,准备在第一次调用时启动守护进程。当一个系统 服务配置有一个关联的系统 套接字配置(具有足够的依赖性,此处Requires=dnscrypt-proxy.socket),这意味着它正在使用套接字激活。

# systemctl status dnscrypt-proxy.socket 
* dnscrypt-proxy.socket - dnscrypt-proxy listening socket
     Loaded: loaded (/lib/systemd/system/dnscrypt-proxy.socket; enabled; preset: enabled)
     Active: active (running) since Tue 2024-01-09 18:16:11 UTC; 23min ago
   Triggers: * dnscrypt-proxy.service
       Docs: https://github.com/DNSCrypt/dnscrypt-proxy/wiki
     Listen: 127.0.2.1:53 (Stream)
             127.0.2.1:53 (Datagram)
      Tasks: 0 (limit: 18402)
     Memory: 12.0K
        CPU: 1ms
     CGroup: /system.slice/dnscrypt-proxy.socket

[...]
# systemctl status dnscrypt-proxy.service
* dnscrypt-proxy.service - DNSCrypt client proxy
     Loaded: loaded (/lib/systemd/system/dnscrypt-proxy.service; enabled; preset: enabled)
     Active: active (running) since Tue 2024-01-09 18:38:54 UTC; 1min 20s ago
TriggeredBy: * dnscrypt-proxy.socket
       Docs: https://github.com/DNSCrypt/dnscrypt-proxy/wiki
   Main PID: 6245 (dnscrypt-proxy)
      Tasks: 12 (limit: 18402)
     Memory: 10.6M
        CPU: 60ms
     CGroup: /system.slice/dnscrypt-proxy.service
             `-6245 /usr/sbin/dnscrypt-proxy -config /etc/dnscrypt-proxy/dnscrypt-proxy.toml

[...]

套接字的创建是systemd通过.socket与该部分关联的部分直接处理的.service,然后该侦听套接字被继承dnscrypt-proxy(必须知道此方法)。

这种方法有多种优点,其中至少有这两个(其他的在插座 激活链接):

  • 即使在启动时,守护进程也不必以任何权限运行来打开特权端口
  • 守护进程可以选择在一段时间不活动后停止,从而释放系统资源。系统如果收到新的查询,将重新启动它,同时系统不会拒绝连接。

相关内容