百科

禁ping如何发现是否在线

时间:2010-12-5 17:23:32  作者:休闲   来源:综合  查看:  评论:0
内容摘要:ICMP封了,ping不通,不代表对方机器就下线了。我去年帮朋友排查一台阿里云服务器,控制台显示运行中,但ping死活不通。他急得不行,以为被DDoS打瘫了。我登上去一看,CPU占用2%,负载0.3,

ICMP封了,发现否线ping不通,发现否线不代表对方机器就下线了。发现否线我去年帮朋友排查一台阿里云服务器,发现否线控制台显示运行中,发现否线但ping死活不通。发现否线他急得不行,发现否线以为被DDoS打瘫了。发现否线我登上去一看,发现否线CPU占用2%,发现否线负载0.3,发现否线纯粹是发现否线安全组把ICMP协议全掐了。 那问题来了——禁ping之后,发现否线怎么判断一台主机是发现否线否在线?最直接的办法是换协议探测。TCP握手是发现否线绕不开的,只要机器活着,内核协议栈就会响应SYN包。用`nc -zv -w 3 目标IP 22`试一下,如果返回`Connection to 目标IP port 22 [tcp/ssh] succeeded`,说明22端口在监听,主机必然在线。哪怕SSH服务没开,只要端口有响应,就证明系统活着——死机或断网状态下,端口不可能有任何反应。 但有个坑:如果目标只开放了UDP服务呢?比如DNS或游戏服务器。UDP无连接,发个空包过去,对方不回,你不能断定它挂了。这时候换个思路,用应用层协议探活。假设对方开了HTTP服务,直接`curl -I --connect-timeout 3 http://目标IP`,看HTTP响应头。返回200或403都行,只要TCP连接建立并收到数据,就说明主机在线。如果curl报`Connection refused`,那可能是服务挂了但系统活着;如果报`Operation timed out`,那基本可以判断主机离线或网络不通。 还有个更刁钻的招——看TTL值。用`traceroute`或`ping`(如果部分路径不禁ICMP)探测中间路由的TTL变化。比如你发一个TTL=1的UDP包到目标端口,第一跳路由器会返回`Time exceeded`错误。如果连续几跳都有响应,最后一跳没动静,那可能是目标主机禁ping但路由器活着。反过来,如果连第一跳都没反应,那多半是本地网络问题,跟目标主机无关。 实际操作中,我习惯组合拳。先TCP扫常见端口(22、80、443、8080),再试UDP的DNS查询(如果对方开53端口)。用`dig @目标IP example.com`发个DNS请求,只要返回`ANSWER SECTION`里有记录,主机必然在线。DNS服务必须响应UDP查询,这是协议规定的,除非对方防火墙连DNS都封——但那样的话,这主机基本对外不可达,在线不在线也没啥区别。 有个反例得提一下。之前监控一台Windows Server,TCP 445端口通,但CPU占用100%,系统卡得跟死机似的。TCP握手能成功,因为网卡驱动和内核还在跑,但应用层完全没响应。这种“半死”状态,光靠端口探测发现不了。得配合SNMP或WMI去查系统负载——但那就不是简单的在线判断了,属于深度监控范畴。 最后说个取巧的法子。如果你有目标主机的公网IP,且它运行着NTP服务(123端口),用`ntpdate -q 目标IP`查询时间。NTP响应是UDP包,但协议要求必须回复。只要收到时间偏移信息,主机必然活着。这招对付那些封了TCP全端口、只留UDP的奇葩防火墙特别有效——但前提是你知道对方开了NTP,不然就是瞎猫碰死耗子。 总结成一句话:禁ping只是封了ICMP,TCP/UDP端口探活才是判断在线的硬道理。别迷信单一方法,多试几个端口,结合服务特性判断,基本不会误判。真遇到全端口封锁的主机,那它对外就是“隐形”的,你在不在线对它来说,也没啥意义了。
最近更新
热门排行
copyright © 2026 powered by 烟消火灭网   sitemap