我有一台运行 libvirtd 的服务器。我刚刚检查了 libvirtd 端口并看到以下输出。我想知道为什么端口 16514 PID 始终为 1,以及为什么 tcp6 处理具有多连接的 ipv4。
有人可以告诉我吗?
root@prd-140:~# netstat -anpt |grep 16514
tcp6 0 0 :::16514 :::* LISTEN 1/systemd
tcp6 0 0 10.1.6.140:16514 10.2.127.52:60556 ESTABLISHED 12289/libvirtd
tcp6 0 0 10.1.6.140:16514 10.2.127.52:29463 ESTABLISHED 12289/libvirtd
root@prd-140:~# lsof -i :16514
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root 59u IPv6 9761899 0t0 TCP *:16514 (LISTEN)
libvirtd 12289 root 5u IPv6 9761899 0t0 TCP *:16514 (LISTEN)
libvirtd 12289 root 30u IPv6 20539283 0t0 TCP prd-140:16514->10.2.127.52:60556 (ESTABLISHED)
libvirtd 12289 root 35u IPv6 20549679 0t0 TCP prd-140:16514->10.2.127.52:29463 (ESTABLISHED)
答案1
- 第一部分是关于 systemd 基于套接字的激活。
- 第二部分是关于 IPv4/IPv6 双栈处理
systemd 基于套接字的激活
以“.socket”结尾的单元配置文件包含有关 IPC 或网络套接字或由 systemd 控制和监督的文件系统 FIFO 的信息,例如基于套接字的激活。
对于每个套接字单元,必须存在一个匹配的服务单元[...]
请注意,使用套接字单元配置套接字激活的守护程序软件需要能够从 systemd 接受套接字,可以通过 systemd 的本机套接字传递接口(参见sd_listen_fds(3) 有关所使用的精确协议和文件描述符传递顺序的详细信息)或通过传统inetd(8)-style 套接字传递(即通过标准输入和输出传递套接字,在服务文件中使用 StandardInput=socket)。
此功能是对inetd(“互联网超级服务器”)可以提供,但可能需要应用程序的额外支持(用于 systemd 的本机套接字传递接口)。
libvirtd 确实提供了这样的支持:
当 libvirtd 守护进程由 systemd 管理时,可以使用许多所需的功能,最显著的是套接字激活。
libvirtd.service
- 在系统模式下启动 libvirtd 守护进程的主要单元文件。
libvirtd.socket
- 主读写 UNIX 套接字对应的单元文件/var/run/libvirt/libvirt-sock
。
看来楼主的设置不只是使用默认的 unix 套接字,还启用了TLS 远程连接。
目标是让systemd无需运行即可管理套接字libvirtd直到收到该套接字上的请求。systemd然后将开始libvirtd继承套接字的服务。
IPv6采用IPv4/IPv6双栈模式
第二个功能就是双 IPv4/IPv6 堆栈的工作方式:使用 IPv6 API,免费获取 IPv4。可以使用套接字IPV6_ONLY
选项禁用此功能,但默认为双堆栈,如 RFC 3493:IPv6 的基本套接字接口扩展中所鼓励的那样:
5.3 AF_INET6 套接字的 IPV6_V6ONLY 选项
此套接字选项将 AF_INET6 套接字限制为仅用于 IPv6 通信。如第 <3.7 与 IPv4 节点的兼容性>,AF_INET6 套接字可用于 IPv4 和 IPv6 通信。
默认情况下此选项是关闭的。
这意味着默认情况下,IPv6 可以在遵循 RFC 的系统上处理 IPv4,并且应用程序不会主动禁用此功能。
netstat
选择显示纯 IPv4,但例如在已建立的套接字实际上是IPv4 映射的 IPv6 地址:(::ffff:10.1.6.140
或::ffff:0a01:068c
)ss -anpt
在 Linux 上显示。金属丝当然保持正常的 IPv4 地址。