我从以下行得到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
这里是什么意思。在人类身上找不到它的踪迹,很难在搜索引擎中找到它。
答案1
这适用于除了使用SO_BINDTODEVICE
套接字选项的 IPv4 通配符地址之外还绑定到特定接口的套接字。从socket
(7):
SO_BINDTODEVICE
将此套接字绑定到特定设备,例如“eth0”,如传递的接口名称中所指定。如果名称为空字符串或选项长度为零,则删除套接字设备绑定。传递的选项是一个可变长度的以 null 结尾的接口名称字符串,最大大小为IFNAMSIZ
。 如果套接字绑定到接口,则套接字仅处理从该特定接口接收的数据包。请注意,这仅适用于某些套接字类型,特别是AF_INET
套接字。数据包套接字不支持它(bind
在那里使用正常的 (2))。在 Linux 3.8 之前,可以设置此套接字选项,但无法使用
getsockopt
(2) 检索。从Linux 3.8开始,它是可读的。 optlen 参数应包含可用于接收设备名称的缓冲区大小,建议为IFNAMSIZ
字节。实际设备名称长度在参数中报告optlen
。
(强调我的)
通常,您会将套接字绑定到接口的 IP 地址。SO_BINDTODEVICE
不过略有不同。除非被防火墙阻止rp_filter
,否则只要传入数据包的目标地址与套接字绑定的地址匹配(即使数据包不是来自该接口1),系统就会接受到给定地址的连接。对于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
该virbr0
桥接接口为 DHCP 请求提供服务,并让单独的dnsmasq
(或其他软件)在不同接口上的相同通配符地址上为它们提供服务。
1 这是一件非常正常和常见的事情。例如,路由器通常会接受从其任何接口到其任何入站地址的传入连接,或者通常可以对任何网络接口的本地地址执行的本地环回连接
答案2
virbr0 接口和端口 67 的本地地址 (0.0.0.0)。