ICMP

网络控制消息协议:Internet Control Message ProtocolICMP)是网路协议族的核心协议之一。它用于 TCP/IP网络中发送控制消息,提供可能发生在通信环境中的各种问题反馈,通过这些信息,令管理者可以对所发生的问题作出诊断,然后采取适当的措施解决。

ICMP 依靠IP来完成它的任务,它是IP的主要部分。它与传输协议,如TCP和UDP显著不同:它一般不用于在两点间传输数据。它通常不由网络程序直接使用,除了ping和traceroute这两个特别的例子。 IPv4中的ICMP被称作ICMPv4,IPv6中的ICMP则被称作ICMPv6。

 
技术细节

ICMP是在RFC 792中定义的互联网协议族之一。通常用于返回的错误信息或是分析路由。ICMP错误消息总是包括了源数据并返回给发送者。 ICMP错误消息的例子之一是TTL值过期。每个路由器在转发数据报的时候都会把ip包头中的TTL值减一。如果TTL值为0,“TTL在传输中过期”的消息将会回报给源地址。 每个ICMP消息都是直接封装在一个IP数据包中的,因此,和UDP一样,ICMP是不可靠的。

虽然ICMP是包含在IP数据包中的,但是对ICMP消息通常会特殊处理,会和一般IP数据包的处理不同,而不是作为IP的一个子协议来处理。在很多时候,需要去查看ICMP消息的内容,然后发送适当的错误消息到那个原来产生IP数据包的程序,即那个导致ICMP讯息被传送的IP数据包。

很多常用的工具是基于ICMP消息的。traceroute是通过发送包含有特殊的TTL的包,然后接收ICMP超时消息和目标不可达消息来实现的。 ping则是用ICMP的"Echo request"(类别代码:8)和"Echo reply"(类别代码:0)消息来实现的。

ICMP部分的结构报头

ICMP报头从IP报头的第160位开始(除非使用了IP报头的可选部分)。

Bits160-167168-175176-183184-191
160TypeCode校验码(checksum)
192ID序号(sequence)
  • Type - ICMP的类型;
  • Code - 进一步划分ICMP的类型;例如,ICMP的目标不可达类型可以把这个位设为1至15等来表示不同的意思。
  • Checksum - 这个字段包含有从ICMP报头和数据部分计算得来的,用于检查错误的数据,其中此校验码字段的值视为0。
  • ID - 这个字段包含了ID值,在ECHO REPLY类型的消息中要返回这个字段。
  • Sequence - 这个字段包含一个序号,同样要在ECHO REPLY类型的消息中要返回这个字段。
填充数据

填充的数据紧接在ICMP报头的后面(以8位为一组):

  • Linux的 "ping"工具填充的ICMP除了8个8字节的报头以外,还另外填充数据使得总大小为64字节。
  • Windows的"ping.exe" 填充的ICMP除了8个8字节的报头以外,还另外填充数据使得总大小为40字节

可能的消息列表 (不是全部)

Type

Code

Description

0 - Echo Reply

0

echo响应 (被程序ping使用)

1 and 2

 

保留

3 - 目的地不可到达

0

目标网络不可达

1

目标主机不可达

2

目标协议不可达

3

目标端口不可达

4

要求分段并设置DF flag标志

5

源路由失败

6

未知的目标网络

7

未知的目标主机

8

源主机隔离

9

禁止访问的网络

10

禁止访问的主机

11

Network unreachable for TOS

12

Host unreachable for TOS

13

网络流量被禁止

4 - Source Quench

0

Source quench (congestion control)

5 - Redirect Message

0

重定向网络

1

重定向主机

2

Redirect Datagram for the TOS & network

3

Redirect Datagram for the TOS & host

6

 

Alternate Host Address

7

 

保留

8 - Echo Request

0

Echo请求

9 - Router Advertisement

0

路由建议

10 - Router Solicitation

0

Router discovery/selection/solicitation

11 - Time Exceeded

0

TTL在传输中过期

1

Fragment reassembly time exceeded

12 - 错误的IP头

0

Pointer indicates the error

1

丢失选项

2

不支持的长度

13 - Timestamp

0

时间戳

14 - Timestamp Reply

0

时间戳响应

15 - Information Request

0

Information Request

16 - Information Reply

0

Information Reply

17 - Address Mask Request

0

Address Mask Request

18 - Address Mask Reply

0

Address Mask Reply

19

 

因安全原因保留

20 through 29

 

Reserved for robustness experiment

30 - Traceroute

0

信息请求

31

 

数据报转换出错

32

 

手机网络重定向

33

 

Where-Are-You (originally meant for IPv6)

34

 

Here-I-Am (originally meant for IPv6)

35

 

Mobile Registration Request

36

 

Mobile Registration Reply

37

 

Domain Name Request

38

 

Domain Name Reply

39

 

SKIP Algorithm Discovery Protocol, Simple Key-Management for Internet Protocol

40

 

Photuris, Security failures

41

 

ICMP for experimental mobility protocols such as Seamoby [RFC4065]

42 through 255

 

保留

 

 

下面是几种常见的ICMP报文:

  1.响应请求

  我们日常使用最多的ping,就是响应请求(Type=8)和应答(Type=0),一台主机向一个节点发送一个Type=8ICMP报文,如果途中没有异常(例如被路由器丢弃、目标不回应ICMP或传输失败),则目标返回Type=0ICMP报文,说明这台主机存在,更详细的tracert通过计算ICMP报文通过的节点来确定主机与目标之间的网络距离。

  2.目标不可到达、源抑制和超时报文

  这三种报文的格式是一样的,目标不可到达报文(Type=3)在路由器或主机不能传递数据报时使用,例如我们要连接对方一个不存在的系统端口(端口号小于1024)时,将返回Type=3Code=3ICMP报文,它要告诉我们:嘿,别连接了,我不在家的!”,常见的不可到达类型还有网络不可到达(Code=0)、主机不可到达(Code=1)、协议不可到达(Code=2)等。源抑制则充当一个控制流量的角色,它通知主机减少数据报流量,由于ICMP没有恢复传输的报文,所以只要停止该报文,主机就会逐渐恢复传输速率。最后,无连接方式网络的问题就是数据报会丢失,或者长时间在网络游荡而找不到目标,或者拥塞导致主机在规定时间内无法重组数据报分段,这时就要触发ICMP超时报文的产生。超时报文的代码域有两种取值:Code=0表示传输超时,Code=1表示重组分段超时。

  3.时间戳

  时间戳请求报文(Type=13)和时间戳应答报文(Type=14)用于测试两台主机之间数据报来回一次的传输时间。传输时,主机填充原始时间戳,接收方收到请求后填充接收时间戳后以Type=14的报文格式返回,发送方计算这个时间差。一些系统不响应这种报文。

 

 ICMP FLOOD攻击

1.直接Flood

  要做这个的首要条件是你的带宽够,然后就是要一个好用的ICMP Flooder,别用ping.exe那种探路用的垃圾,例如我以前发布的AnGryPing,发包速度达到6000---9000/(512 Kbps ADSL),默认是32bytesECHO报文洪水,用它即使不能flood别人下去,防火墙也叫得够惨的了。直接攻击会暴露自己IP(如果对方没有还击能力那还无所谓,固定IP用户不推荐使用这种Flood),直接Flood主要是为了顾及Win9x/Me不能伪造IP的缺陷,否则一般还是别用为妙。

  简单示意:

  ICMP

  攻击者[IP=211.97.54.3]--------------------------------->受害者[截获攻击者IP=211.97.54.3]==>IP回来反击,嘿嘿

2.伪造IPFlood

  如果你是Win2000/XP并且是Administrator权限,可以试试看FakePing,它能随意伪造一个IPFlood,让对方摸不到头脑,属于比较隐蔽阴险的Flood

  简单示意:

  伪造IP=1.1.1.1ICMP

  攻击者[IP=211.97.54.3]--------------------------------->受害者[截获攻击者IP=1.1.1.1]==>倒死

3.反射

  用采取这种方式的第一个工具的名称来命名的“Smurf”洪水攻击,把隐蔽性又提高了一个档次,这种攻击模式里,最终淹没目标的洪水不是由攻击者发出的,也不是伪造IP发出的,而是正常通讯的服务器发出的!

  实现的原理也不算复杂,Smurf方式把源IP设置为受害者IP,然后向多台服务器发送ICMP报文(通常是ECHO请求),这些接收报文的服务器被报文欺骗,向受害者返回ECHO应答(Type=0),导致垃圾阻塞受害者的门口……

  从示意图可以看出,它比上面两种方法多了一级路径——受骗的主机(称为反射源”),所以,一个反射源是否有效或者效率低下,都会对Flood效果造成影响!

  简单示意:

  伪造受害者的ICMP 应答

  攻击者[IP=211.97.54.3]-------------------------->正常的主机--------------->受害者[截获攻击者IP=……网易?!]=

### 配置 `iptables` 允许或阻止 ICMP 流量 `iptables` 是 Linux 系统中用于配置网络规则的强大工具,常用于控制进出系统的网络流量。ICMP(Internet Control Message Protocol)是网络层协议,常用于 `ping` 命令测试网络连通性。通过 `iptables`,可以灵活地控制是否允许或阻止 ICMP 请求和响应。 #### 1. 阻止所有 ICMP 请求 要阻止所有传入的 ICMP 请求(如 `ping` 请求),可以使用以下规则: ```bash iptables -A INPUT -p icmp --icmp-type 8 -j REJECT ``` 此规则匹配所有类型为 `8`(即 Echo Request)的 ICMP 包,并拒绝它们的访问请求[^1]。 #### 2. 仅允许特定 IP 地址的 ICMP 请求 如果希望仅允许来自特定 IP 地址的 ICMP 请求,可以添加如下规则: ```bash iptables -A INPUT -s 192.168.91.101 -p icmp --icmp-type 8 -j ACCEPT iptables -A INPUT -p icmp --icmp-type 8 -j REJECT ``` 上述规则表示仅允许 `192.168.91.101` 的 ICMP 请求,其他地址的请求将被拒绝。 #### 3. 允许本机发出 ICMP 请求(如允许本机使用 `ping`) 如果希望允许本机发送 ICMP 请求(如 `ping` 外部主机),可以配置如下规则: ```bash iptables -A OUTPUT -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT ``` 此规则允许本机发出新的 ICMP 请求,并保持已建立或相关的连接状态[^2]。 #### 4. 阻止 ICMP 响应(Echo Reply) 如果需要阻止系统对 ICMP 请求的响应,可以使用以下规则: ```bash iptables -A INPUT -p icmp --icmp-type 0 -j DROP ``` 此规则阻止类型为 `0`(即 Echo Reply)的 ICMP 包,使得系统不会回应 `ping` 请求。 #### 5. 允许特定 ICMP 类型 ICMP 协议包含多种类型的消息,如 `8`(Echo Request)和 `0`(Echo Reply)。可以根据需要允许特定类型的 ICMP 消息: ```bash iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT ``` 上述规则分别允许接收 ICMP 请求和响应。 #### 6. 阻止所有 ICMP 流量 如果需要完全阻止所有 ICMP 流量,可以使用以下规则: ```bash iptables -A INPUT -p icmp -j DROP iptables -A OUTPUT -p icmp -j DROP ``` 此规则将丢弃所有进入和离开的 ICMP 包,实现全面阻止 ICMP 流量的效果[^3]。 #### 7. 保存和恢复 `iptables` 规则 在配置完规则后,建议将当前规则保存,以便在系统重启后仍然生效: ```bash iptables-save > /data/iptables.bak ``` 恢复规则时,可以使用以下命令: ```bash iptables-restore < /data/iptables.bak ``` 为确保规则在系统启动时自动加载,可以将恢复命令写入 `/etc/rc.d/rc.local` 或 `~/.bashrc` 文件中,并赋予可执行权限: ```bash echo "iptables-restore < /data/iptables.bak" >> /etc/rc.d/rc.local chmod +x /etc/rc.d/rc.local ``` #### 8. 使用自定义链管理 ICMP 流量 如果希望更灵活地管理 ICMP 流量,可以创建自定义链进行管理。例如,创建名为 `BLOCK_ICMP` 的自定义链,并设置规则: ```bash iptables -N BLOCK_ICMP iptables -A BLOCK_ICMP -p icmp --icmp-type 8 -j REJECT iptables -I INPUT -i eth0 -j BLOCK_ICMP ``` 此配置将所有来自 `eth0` 接口的 ICMP 请求跳转到 `BLOCK_ICMP` 链,并在该链中执行拒绝操作[^4]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值