当 TTL=2 时生成 ICMP 数据包?

当 TTL=2 时生成 ICMP 数据包?

通过检查有效载荷ICMP time-exceeded数据包,我注意到有时它是最后一个路由器(ttl=2在返回的数据包中时)或者甚至是先前的路由器(最多 5 跳之前ttl=5),它会丢弃数据包并生成 ICMP 消息。

怎么会这样?这背后有什么原因吗?

你如何设置这个思科路由器?

编辑:

请注意全部这些数据包是 ICMP 类型 11 代码 0,这意味着:

类型 = 超出时间,代码 = ttl-zero-during-transit

编辑2:这里有两个这样的 ICMP 数据包的例子。

###[ IP ]###
  version   = 4L
  ihl       = 5L
  tos       = 0x0
  len       = 168
  id        = 9969
  flags     = 
  frag      = 0L
  ttl       = 243
  proto     = icmp
  chksum    = 0x19ea
  src       = 193.51.189.25
  dst       = 134.59.129.241
  \options   \
###[ ICMP ]###
     type      = time-exceeded
     code      = ttl-zero-during-transit
     chksum    = 0xbf6e
     unused    = 0
###[ IP in ICMP ]###
        version   = 4L
        ihl       = 5L
        tos       = 0x0
        len       = 52
        id        = 57161
        flags     = DF
        frag      = 0L
        ttl       = 2
        proto     = tcp
        chksum    = 0xcf32
        src       = 134.59.129.241
        dst       = 173.194.20.89
        \options   \
###[ TCP in ICMP ]###
           sport     = 43843
           dport     = http
           seq       = 3927922380L
           ack       = 3188073609L
           dataofs   = 8L
           reserved  = 0L
           flags     = A
           window    = 14165
           chksum    = 0x51f9
           urgptr    = 0
           options   = [('NOP', None), ('NOP', None), ('Timestamp', (5088093, 1579045454))]
###[ Padding ]###
              load      = '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x9d\xeb\x00\x08\x01\x01\x00\nA\x01'





    ###[ IP ]###
  version   = 4L
  ihl       = 5L
  tos       = 0x0
  len       = 168
  id        = 37758
  flags     = 
  frag      = 0L
  ttl       = 246
  proto     = icmp
  chksum    = 0xaa73
  src       = 193.51.189.2
  dst       = 134.59.129.241
  \options   \
###[ ICMP ]###
     type      = time-exceeded
     code      = ttl-zero-during-transit
     chksum    = 0x2e1c
     unused    = 4
###[ IP in ICMP ]###
        version   = 4L
        ihl       = 5L
        tos       = 0x0
        len       = 60
        id        = 53079
        flags     = DF
        frag      = 0L
        ttl       = 5
        proto     = tcp
        chksum    = 0x6d73
        src       = 134.59.129.241
        dst       = 74.125.230.71
        \options   \
###[ TCP in ICMP ]###
           sport     = 45799
           dport     = http
           seq       = 2382327024L
           ack       = 0
           dataofs   = 10L
           reserved  = 0L
           flags     = S
           window    = 14600
           chksum    = 0x83ed
           urgptr    = 0
           options   = [('MSS', 1460), ('SAckOK', ''), ('Timestamp', (5088167, 0)), ('NOP', None), ('WScale', 4)]
###[ Padding ]###
              load      = '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00X\xf6\x00\x08\x01\x01\x04\x01\x81\xff'

答案1

http://packetlife.net/blog/2008/dec/22/disabling-mpls-ttl-propagation/

http://www.ciscopress.com/articles/article.asp?p=680824&seqNum=4

当外部标签的 TTL 减少到 0 时,您的数据包将被 MPLS 封装,但内部数据包 TTL 未更新,因此 TTL 过期的标签数据包将被转发,而内部 IP 数据包(具有明显有效的 TTL)将作为已过期数据包由最终 MPLS 路由器返回给您。

============================

当标记数据包的 TTL 过期时,数据包实际上会继续转发,直到它所在的“隧道”结束,因为将 TTL 字段减为 0 的路由器可能没有返回原始发送者的有效路由。因此,MPLS 标签被编辑以指示 TTL 过期,最终,最终隧道路由器解封装“有效但标签过期”的数据包并将其与 TTL 失败消息一起发送回去。

免责声明:我阅读了几个 RFC 中与 TTL 相关的部分,但对此处理没有明确的规定,所以我想说这种行为可能因供应商而异。

从捕获的数据包中得到的证据:

Internet Control Message Protocol
Type: 11 (Time-to-live exceeded)
Code: 0 (Time to live exceeded in transit)
Checksum: 0xf4df [correct]
Internet Protocol, Src: 192.168.1.x (192.168.1.x), Dst: 8.8.8.8 (8.8.8.8)
    Version: 4
    Header length: 20 bytes
    Differentiated Services Field: 0x80 (DSCP 0x20: Class Selector 4; ECN: 0x00)
    Total Length: 92
    Identification: 0x6b56 (27478)
    Flags: 0x00
    Fragment offset: 0
    Time to live: 2  <===== payload of packet entering MPLS tunnel
    Protocol: ICMP (1)
    Header checksum: 0x7abb [correct]
    Source: 192.168.1.x (192.168.1.x)
    Destination: 8.8.8.8 (8.8.8.8)
Internet Control Message Protocol
    Type: 8 (Echo (ping) request)
    Code: 0
    Checksum: 0xf78f [correct]
    Identifier: 0x0001
    Sequence number: 111 (0x006f)
    Sequence number (LE): 28416 (0x6f00)
    Data (64 bytes)
MPLS Extensions
    Version: 2
    Reserved: 0x000
    Checksum: 0x5581 [correct]
    MPLS Stack Entry
        Length: 0x0008
        Class: 1
        C-Type: 1
        Label: 1864, Exp: 4, S: 1, TTL: 1
            0000 0000 0111 0100 1000 .... = Label: 1864
            .... .... .... .... .... 100. = Experimental: 4
            .... .... .... .... .... ...1 = Stack bit: Set
            Time to live: 1    <========== MPLS TTL 

答案2

路由器应该在处理数据包的每一秒内将生存时间字段减少 1,但在任何情况下,该减少量都不应小于 1。

因此,如果路由器处理数据包的时间超过一秒,它应该将 TTL 减少 1 以上。然而,路由器花费一秒以上的时间处理一个数据包,除非它严重受阻。

除非路由器实现有错误,否则这是我能想到的唯一可以解释这种情况的事情。

答案3

虽然我无法确切地说出这里发生了什么,但超时数据包是在以下两种情况之一下发送的:TTL 超时或片段重组时间超时。发回的代码是什么(有效载荷的第二部分)。如果是1,则发送数据包的原因是重组时间超时。这通常应设置为 60 到 120 秒,而不是 0.01 秒。总是由同一个路由器发回这些数据包吗?您能发布您收到的完整数据包吗?您能发布有关有问题的路由器的任何信息吗?品牌?型号?

答案4

答案是“为什么你会收到time-exceeded数据包“(你最初的问题是“怎么会这样?这背后有什么原因吗?“)很容易回答:

查看捕获的超时数据包,里面的代码值是什么。如果是 0,则表示生成路由器存在 TTL 问题;如果是 1,则表示生成路由器存在碎片问题。

问题“如何在 CISCO 路由器中设置此项?“没有意义,设置什么?根据你所说的,没有表现出任何不寻常的行为。

为什么路由器存在 TTL 或碎片问题?“我认为这是个好问题。如果路由器(假设它始终是同一个)不受您的控制,那么我们就不能肯定地说。但我们可以稍微推测一下。这可能是接口之间的 MTU 不匹配,也可能是缓冲问题。这是假设它是一个碎片问题。如果是 TTL 问题,则可能是 MPLS LSP 或 MPLS LSR 的配置错误,由于 PHP/UHP 等原因,它给出了冲突的 ICMP 读数(尽管不太可能)。

当您收到这些超时消息时,当前的 UDP/TCP 流是否有问题,是否有任何流丢失?超时消息应包含导致生成 ICMP 数据包的数据包的一部分,原始数据单元是巨型帧还是大型 TCP 数据包,它是否设置了 DF 位?

首先,您还没有提供太多有关 ICMP 数据包生成环境的信息。

相关内容