我刚刚注意到一种非常奇怪的情况,我没有很好的解释。
机器(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
,而不是ifconfig
。ifconfig
Linux 中已弃用多年,并且缺少许多功能。影响您的案例的具体功能是能够在单个接口上添加/显示多个 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
如何显示所有地址。