绑定到不存在的接口

绑定到不存在的接口

我刚刚注意到一种非常奇怪的情况,我没有很好的解释。

机器(debian)有一个接口,分配了一个IP地址:

# ifconfig vmbr0 |grep inet
inet addr:192.168.1.26  Bcast:192.168.1.255  Mask:255.255.255.0

在一些软件设置中(如果需要的话,powerdns recursor)指定其守护进程绑定到以下接口:

local-address=127.0.0.1 192.168.1.24

您可能已经注意到,这是 IP 地址值中出现的错误,但问题是 - 守护进程已成功绑定到它:

# netstat -nlp | grep 1.24 | grep 53
tcp        0      0 192.168.1.24:53         0.0.0.0:*               LISTEN      328862/pdns_recurso
udp        0      0 192.168.1.24:53         0.0.0.0:*                           328862/pdns_recurso

192.168.1.24更令人惊讶的是 - 交换机成功地将流量路由到这台机器( LAN 中没有其他机器,因此没有 IP 地址冲突)。

那么有人能解释为什么它是可能的并且有效吗?

我认为内核只会接受具有正确目的地的 IP 数据包并丢弃所有其他数据包。

答案1

正如评论中所指出的,地址(192.168.1.24)实际上存在于主机上,但由于实用ifconfig程序的限制,它没有显示。相反,你应该使用路由2实用ip,而不是ifconfigifconfigLinux 中已弃用多年,并且缺少许多功能。影响您的案例的具体功能是能够在单个接口上添加/显示多个 IP 地址(无需创建接口别名)。

向接口添加多个 IP 地址的方法ifconfig是创建接口别名(eth0->eth0:0 eth0:1等)。但是,单个接口上只能有 255 个别名,因此对于某些企业设置来说,这是一个重大限制。
使用 Iproute2ip实用程序,您可以将无限数量的地址添加到单个接口。

例如:

$ ip addr add 169.254.0.1 dev eth0
$ ip addr add 169.254.0.2 dev eth0

$ ifconfig eth0 | grep '\<inet\>'
        inet 192.168.0.20  netmask 255.255.255.0  broadcast 192.168.0.255

$ ip addr show dev eth0 | grep '\<inet\>'
    inet 192.168.0.20/24 brd 192.168.0.255 scope global eth0
    inet 169.254.0.1/32 scope global eth0
    inet 169.254.0.2/32 scope global eth0

因此请注意如何ifconfig仅显示一个地址,而ip addr如何显示所有地址。

相关内容