Проверяя полезную нагрузку ICMP time-exceeded
пакетов, я заметил, что иногда это предпоследний роутер (когда ttl=2
в возвращенном пакете) или даже в предыдущем (до 5 переходов до этого, ttl=5
), который отбрасывает пакет и генерирует сообщение ICMP.
Как так? По какой-то причине?
Как установить это в CISCO роутер?
Редактировать:
обратите внимание, что ВСЕ эти пакеты имеют код 0 ICMP типа 11, что означает:
тип = истекло время, код = ttl-zero-во время транспортировки
Edit2: Вот два примера таких пакетов 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'
http://packetlife.net/blog/2008/dec/22/disables-mpls-ttl-propagation/
http://www.ciscopress.com/articles/article.asp?p=680824&seqNum=4
Ваши пакеты инкапсулируются в MPLS, когда TTL внешней метки уменьшается до 0, но TTL внутреннего пакета не обновляется, поэтому помеченный пакет с истекшим TTL пересылается, а внутренний IP-пакет (с очевидно допустимым TTL) возвращается в истек срок действия последнего маршрутизатора MPLS.
============================
Когда срок действия помеченного пакета истекает, пакет фактически пересылается до конца «туннеля», в котором он включен, поскольку маршрутизатор, уменьшивший поле TTL до 0, может не иметь действительного маршрута обратно к исходному отправителю. Таким образом, метка MPLS редактируется, чтобы указать истечение срока TTL, и в конечном итоге конечный туннельный маршрутизатор декапсулирует «действительный, но истек срок действия метки» и отправляет его обратно с сообщением об ошибке TTL.
Отказ от ответственности: я прочитал относящиеся к TTL разделы нескольких RFC, но ничего не было определено относительно этой обработки, поэтому я бы сказал, что это поведение может варьироваться от поставщика к поставщику.
Свидетельство из захваченного пакета:
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
Маршрутизаторы должны уменьшать время жизни в поле на 1 за каждую секунду, потраченную на обработку пакета, но ни в коем случае не должны уменьшаться менее чем на 1.
Таким образом, если маршрутизатор тратит на обработку пакета больше секунды, он должен уменьшите TTL более чем на единицу. Однако очень редко маршрутизатор бы тратить больше секунды на обработку пакета, если только он не застрял.
За исключением ошибок реализации маршрутизатора, это единственное, что я могу придумать, чтобы это объяснить.
Хотя это возможно, ошибка на этом элементарном уровне маловероятна; плюс, учитывая (быстрое) время, необходимое для обработки пакетов, я бы предпочел направить сходство проблемы на какой-то цикл или отскок. В тривиальном / обычном случае маршрутизатор уменьшает TTL и направляет пакет на правильный интерфейс на основе своей таблицы маршрутизации.
Есть несколько более сложных случаев, когда TTL может зависеть от реализации маршрутизатора. Из моей головы идет NAT маскировка где пакет может "повторно войти" в маршрутизатор после выполнения трансляции адресов - обычно это тот случай, когда нужно проверить IP-адрес WAN маршрутизатора из внутри (и это работает не на всех роутерах)
Например,
source:
local 10.1.2.3/24
destination:
public: 198.252.206.16/32 (an example..)
адрес 198.252.206.16
быть собственным адресом, видимым из Интернета (сторона WAN маршрутизатора), который внутренне привязан к 10.1.2.3
т.е. фактически тот же хост, что и отправитель
Маршрутизатор получает пакет и понимает, что адрес WAN является его собственным адресом, пакет "повторно входит" в интерфейс WAN (зависит от реализации) и направляется на адрес LAN. 10.1.2.3
.
Как обрабатывается TTL в этом случае (который работает не на всех маршрутизаторах) зависит от реализации.
Хотя я не могу точно сказать, что здесь происходит, пакет Time Exceeded отправляется при одном из двух условий: превышен TTL или превышено время повторной сборки фрагмента. Какой код отправлен обратно (второй кусок полезной нагрузки). Если это 1
, причина отправки пакета - превышено время сборки. Обычно это значение должно быть от 60 до 120 секунд, а не 0,01 с. Всегда ли один и тот же маршрутизатор отправляет эти пакеты обратно? Можете ли вы отправить полный пакет, который вы получаете, и? Можете ли вы разместить информацию о роутерах в вопросах? Делать? Модель?
Ответ на "Почему ты получаешь time-exceeded
пакеты"(ваш исходный вопрос"Как так? По какой-то причине?") легко ответить:
Посмотрите, сколько времени вы захватили, какое значение кода внутри. Если он равен 0, это была проблема TTL на генерирующем маршрутизаторе, если это было 1, это была проблема фрагментации на генерирующем маршрутизаторе.
Вопрос "Как это установить в маршрутизаторе CISCO?"не имеет смысла, установить что? В соответствии с тем, что вы сказали, не было обнаружено необычного поведения.
"Почему у маршрутизатора есть проблемы с TTL или фрагментацией?Я считаю, что здесь хороший вопрос. Если маршрутизатор (при условии, что он всегда один и тот же) находится вне вашего контроля, то мы не можем сказать наверняка. Но мы можем немного порассуждать. Это может быть несоответствие MTU между интерфейсами , я полагаю, это также может быть проблема с буферизацией. Предполагается, что это проблемы с фрагментацией. Если это проблема с TTL, это может быть неправильная конфигурация MPLS LSP или MPLS LSR, который дает конфликтующее чтение ICMP из-за PHP / UHP и т.д. (хотя маловероятно).
Когда вы получаете эти сообщения об истечении времени, возникают ли проблемы с текущими потоками UDP / TCP, пропадают ли какие-либо из них? Сообщение о превышении времени должно содержать часть пакета данных, которая вызвала генерацию пакета ICMP, является ли исходный блок данных jumbo-кадром или большим TCP-пакетом, установлен ли в нем бит DF?
Вы не так много рассказали о контексте, в котором в первую очередь генерируются пакеты ICMP.