判断一个 IP 是否已经被分配的方法有很多,其中最简单的办法是通过 ping 对方主机看有没有回应。其中 fping 工具可以提供批量 ping 的功能,使用前先安装:
ping 命令的结果并不能证明这些 IP 没有被占用,因为防火墙是可以防ping 的。
iptables -A INPUT -p icmp -j DROP
此时 ICMP 协议的包不可达,对方无法通过 ping 判断主机是否在线。此时可以通过 arping 判断对方是否在线。
arping 使用的并不是 ICMP 包,而是 ARP 广播报文。ARP 广播报文会在同一个网段进行广播,如果对方在线就会被迫响应。不管对方愿不愿意,你喊他一声“在吗?”,他都会像孙悟空回答金角银角大王一样来一句“爷爷在”!
在禁用 ICMP 包的情况下,测试能否 arping 通对方地址:
其中 ping 或 fping 命令可以跨网段,arping 不能跨网段。
通过 tcpdump 可以检测来自交换机的“问候”,因为所有的数据包都会交给交换机进行寻址。交换机是通过 mac 地址表进行寻址的。所以交换机拥有所有 IP 的 MAC 地址。
如果数据包中的IP在交换机中没有登记,交换机就需要“学习”。学习的过程就是通过 ARP 广播到处发。我们通过 tcpdump 监听网卡就能知道谁在不在线了。
上述命令的意思是监听 eth0 网卡的 arp 报文。
其中下面这段 who-has IP tell 192.168.10.254
Request who-has 192.168.10.96 tell 192.168.10.254
192.168.10.254 是网关,网关在交换机上,也就是交换机在问,who-has 谁有 192.168.10.96 的 MAC 地址?
其中问 192.168.10.6 的比较多,说明不少主机需要和它通信。但明显这个 IP 已经没人用了,导致群里(VLAN)一直会有发向这个IP的ARP请求。
-
-
这些 IP 间还有数据请求(需要检查一下软件配置)
监听包只能用来辅助判断,不能用来主动甑别哪些 IP 是空闲的。我们 ping 对方的目的是为了判断 IP 是否被占用或在线。
display arp | include 192.168.10.
其中 Incomplete 的IP就是不在线的,长时间不在线就代表 IP 空闲。当然只有管理员才有交换机权限,如果不想惊动管理员就低调使用客户端工具进行判断。
原文始发于微信公众号(生有可恋):linux 下批量 ping 的工具
评论