如果精确判断一个IP是否被占用
我们在局域网经常需要去测试一个IP是否在用,通过使用ping命令去测试网络通还是不通,但这种方法不是很精确。
我在cnaaa.com上购买了云服务器。
原因是 ping 命令使用的是 ICMP 协议(Internet Control Message Protocol),ICMP协议是 TCP/IP 协议族中的一员,它也含IP头,所以我们可以使用 IP 去 ping。ICMP协议是用来侦测网络错误的,ping 命令用到了 ICMP 中的 ICMP ECHO REQUEST 和 ICMP ECHO REPLY,用来判断 IP 地址是否通。之所以说这种方法判断 IP 是否被占用不太可靠,是因为与TCP和UDP协议一样,在防火墙上是可以禁用此类网络包的。也就是对方可以禁ping,让你无法 ping 通对方。
之所以会出现禁ping策略,是因为很多网络攻击是先通过ICMP协议判断主机是否存活,如果 ping 不通有可能会躲避一部分网络攻击。但 ping 不通只说明 ICMP 协议被禁,TCP 或 UDP 协议也可以用来判断主机是否存活,所以禁 ping 只能躲避一些简单攻击,如果对方对端口进行扫描,服务器如果存在开放的端口的话,还是会被对方发现。
我们假定主机就是一台普通PC,没有对外开放服务端口,并且在防火墙上禁了ICMP协议,此时还有没有办法判断此PC的IP是否处于活跃状态?
ping 命令可以跨网段,此时使用的是三层网络,中间会用到IP和路由。如果在二层网络下,设备间是通过 MAC 地址而非IP来进行通讯的。二层网络会被局限在一个VLAN或网段里,也就是说跨网段通信需要三层路由,但在同网段内,设备彼此是可以通过ARP广播来判断 MAC 地址是否存在,如果存在即可存在交换机或终端的ARP表中方便直接进行通讯。
我们看一下 Windows 下PC的ARP表
arp -a
Linux 下命令类似
在 PC 或服务器的 ARP 列表中,只会存与网卡相连的同网段网络 MAC,而不会存跨网络网络的MAC。因为ARP是“Address Resolution Protocol”(地址解析协议)的缩写。在同网段中,通过地址解析协议,源主机可以通过目的主机的IP地址获得目的主机的MAC地址。也就是说,IP是三层网络的地址,MAC是二层网络的地址。防火墙工作在三层网络,所以在二层网络,MAC 和 IP 是可以直接被定位到的。
PC 只存同网络的 MAC 地址,跨网络如何查。跨网络的MAC可以在交换机的ARP地址表中查,如果网关在核心交换机上,那么所有需要通信的主机的IP和MAC的相对应的关系都在交换机上可以找到。所以说一个IP有没有占用,交换机肯定是知道的。
我们在交换机ruijie-8610设备上查看VLAN 25的MAC与IP的映射关系
root@ns-xxzx-svr:~# telnet 192.168.25.254Trying 192.168.25.254...Connected to 192.168.25.254.Escape character is '^]'.
User Access Verification
Password:
ZXYYNQ-CORE-RG8610>enable
Password:ZXYYNQ-CORE-RG8610# show arp VLAN 25
交换机的 arp 列表存在缓存,当设备上线或离线时,无法找到设备时会触发ARP广播,从而刷新ARP缓存。在Windows或Linux下可以使用arp -d命令清空arp表,重新通过arpi学习更新arp表。在ping一个地址时,如果arp表为空,此时就会触发一个arp请求。有没有手动进行arp请求的方法?有,这个命令叫 arping ,与 ping 不同,ping 使用的是 ICMP 协议,而 arping 使用 arp 请求来代替 ICMP。
arping 只能 ping 同网段的IP,不能跨网络发起 arp 请求,这是二层网络通信决定的。如果存在多个网卡,此时需要指定网卡接口,不然 arping 不知道从哪个网卡接口出去。
arping -I eth0 192.168.10.1
Windows 下有没有类似的工具?有,但是第三方的,下载地址:
- https://elifulkerson.com/projects/arp-ping.php
使用方法与 Linux 下一致
总结,通过 arping 可以精确判断一个设备的IP是否是在线状态,此时防火墙是无法阻止对方通过 arping 来 ping 你,如果在 MAC 地址层面不通,说明此网络接口网络不通。