我们一般会使用 ping 来判断网络的连通性,如果再多问几个问题,能否全部回答出来,比如:
-
如何知道是否有人正在发起 ping
-
对方执行 ping 的时候,能否在对方不知情的情况下获取对方的 IP
-
ping 命令工作在 OSI 七层网络模型的哪一层?
先说一个 ping 的工作机制,ping 使用的是 ICMP 协议。ICMP 协议既不是 TCP 也不是 UDP,TCP 和 UDP 是第四层,ICMP 比它们还要再低一层。
ping 命令工作在网络模型的第三层,即网络层。OSI 网络模型模型(Open Systems Interconnection),该模型将网络通信划分为七个层次,分别是:
-
物理层(Physical Layer)
-
数据链路层(Data Link Layer)
-
网络层(Network Layer)
-
传输层(Transport Layer)
-
会话层(Session Layer)
-
表示层(Presentation Layer)
-
应用层(Application Layer)
ping 命令使用 ICMP(Internet Control Message Protocol)协议来测试主机的可达性和测量往返时间(RTT)。ICMP 是 OSI 模型中的第三层协议,它通常用于网络设备之间的错误报告和网络状态信息的传递。
ping 命令通过发送 ICMP Echo Request 请求并接收 ICMP Echo Reply 响应,以测试主机之间的连接状态。
回到开头的问题,如果有人正在 ping 我们,有没有办法知道是谁在 ping ?
在 Linux 上比较容易回答以上问题。我们使用 iptables 创建一个日志过滤器可以跟踪 ping 请求。使用以下命令创建一条过滤器:
iptables -I INPUT
-p icmp
-j LOG
--log-prefix "ICMP: "
$ iptables -nL INPUT
Chain INPUT (policy ACCEPT)
target prot opt source destination
LOG icmp -- 0.0.0.0/0 0.0.0.0/0 LOG flags 0 level 4 prefix "ICMP: "
当有人对主机发起 ping 请求时,使用 dmesg 可以查询到 iptables 的日志信息,其中包含 ping 请求的源地址 IP
除了使用 iptables 创建日志过滤器,也可以使用 tcpdump 查看 ping 请求:
tcpdump -n -q icmp
tcpdump 查看的是实时信息,如果此时有 ping 包进来,第一时间可以看到进包和回包。如果只想看请求包,不想看回包,可以在 tcpdump 中加过滤条件:
$ tcpdump -n -q icmp and icmp[icmptype] == 8
$ tcpdump -n -q icmp and icmp[icmptype] == 0
icmptype 8 是请求包,icmptype 0 是回包。不加条件则是所有的 icmp 包。tcpdump 虽然命令里有个 tcp ,但它既可以处理 icmp 协议,也可以处理 udp 协议,它就是个抓包工具。
同样在 windows 上,也可以使用抓包工具分析是谁正在 ping 我们。使用的工具是 Wireshark。这里只给几张截图,就不多介绍了,原理类似。
全文完。
如果转发本文,文末务必注明:“转自微信公众号:生有可恋”。
原文始发于微信公众号(生有可恋):如何知道有人正在 ping 服务器
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论