我有一台運行 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”結尾的單元配置文件,編碼有關由 systemd 控制和監督的 IPC 或網絡套接字或文件系統 FIFO 的信息,用於基於套接字的激活。
對於每個套接字單元,必須存在匹配的服務單元[...]
請注意,配置為使用套接字單元進行套接字啟動的守護程式軟體需要能夠透過 systemd 的本機套接字傳遞介面從 systemd 接受套接字(請參閱sd_listen_fds(3) 有關所使用的精確協議和文件描述符傳遞順序的詳細資訊)或透過傳統inetd(8)-風格套接字傳遞(即透過標準輸入和輸出傳入的套接字,在服務文件中使用 StandardInput=socket)。
此功能是現有功能的改進內網(「網際網路超級伺服器」)可以提供,但可能需要應用程式的額外支援(對於 systemd 的本機套接字傳遞介面)。
libvirtd 確實提供了這樣的支援:
當 libvirtd 守護程序由 systemd 管理時,可以使用許多所需的功能,最顯著的是套接字啟動。
libvirtd.service
- 用於在系統模式下啟動 libvirtd 守護程序的主單元檔案。
libvirtd.socket
- 主讀寫UNIX套接字對應的單元檔/var/run/libvirt/libvirt-sock
。
在這裡,OP 的設定似乎不僅使用預設的 unix 套接字,而且還啟用了TLS 遠端連線。
目標是讓系統無需運行即可管理套接字庫虛擬機直到收到此套接字上的請求。系統然後將開始庫虛擬機繼承套接字的服務。
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
(或)在 Linux 上::ffff:0a01:068c
會顯示。ss -anpt
地址在金屬絲當然還是普通的 IPv4 位址。