什麼是 0.0.0.0%virbr0?
我從以下行得到
ss -lun
:udp UNCONN 0 0 0.0.0.0%virbr0:67 0.0.0.0:* users:(("dnsmasq",pid=950,fd=3))
我想知道
0.0.0.0%virbr0
這裡是什麼意思。在人身上沒有它的踪跡,在搜尋引擎中很難找到。
SO_BINDTODEVICE
除了使用socket 選項的 IPv4 萬用字元地址之外,這將適用於綁定到特定介面的套接字。從socket
(7)開始:
SO_BINDTODEVICE
將此套接字綁定到特定設備,如“eth0”,如傳遞的介面名稱中指定的那樣。如果名稱為空字元串或選項長度為零,則移除套接字設備綁定。傳遞的選項是一個可變長度的以空結尾的介面名稱字元串,最大大小為
IFNAMSIZ
. 如果套接字綁定到介面,則只有從該特定介面接收到的數據包才會被套接字處理。請注意,這僅適用於某些套接字類型,尤其是AF_INET
套接字。數據包套接字不支持它bind
(在那裡使用普通(2))。在 Linux 3.8 之前,可以設置此套接字選項,但無法使用
getsockopt
(2) 檢索。從 Linux 3.8 開始,它是可讀的。optlen 參數應包含可用於接收設備名稱的緩衝區大小,建議為IFNAMSIZ
字節。實際設備名稱長度在optlen
參數中報告。(強調我的)
通常,您會將套接字綁定到介面的 IP 地址。
SO_BINDTODEVICE
雖然略有不同。除非被rp_filter
防火牆阻止,只要傳入數據包的目標地址與套接字綁定的地址匹配(即使數據包不是來自該介面¹),系統就會接受到給定地址的連接。使用SO_BINDTODEVICE
,如上所述,僅考慮來自該介面的數據包。舉個例子:
$ sudo socat udp-listen:1234,so-bindtodevice=guest-bridge - & $ ss -Hau 'sport = 1234' UNCONN 0 0 0.0.0.0%guest-bridge:1234 0.0.0.0:*
dnsmasq
在您的情況下,它可能是由 libvirt 啟動的實例綁定的 DHCP 伺服器 UDP 套接字。您可以看到軟體在被要求綁定到介面或排除某些介面時確實設置了該選項。對於 DHCP 伺服器,您不想綁定到介面的地址,因為 DHCP 伺服器旨在接受以 255.255.255.255 作為目標的廣播“發現”數據包。在這裡使用萬用字元地址
SO_BINDTODEVICE
意味著您可以讓dnsmasq
來自該網橋介面的 DHCP 請求virbr0
和一個單獨的dnsmasq
(或其他軟體)在不同介面上的相同萬用字元地址上為它們提供服務。¹這是一件非常正常和普遍的事情。例如,一個路由器通常會接受從其任何介面到其任何入站地址的傳入連接,或者您通常可以對任何網路介面的本地地址進行的本地環回連接