Это виртуальная машина, работающая под управлением kvm / libvirt / qemu (10.202.7.128
) пингует другую аппаратную систему (10.202.7.4
) через мост гипервизора. Все работает нормально, но 'tcpdump -neli any icmp and host 10.202.7.128'
показывает три записи на запрос:
14:42:39.921785 P 52:54:00:14:71:1b
ethertype IPv4 (0x0800), length 100: 10.202.7.128 > 10.202.7.4: ICMP echo request, id 2485, seq 1, length 64
Вторая запись идентична, за исключением P
заменяется на "Out"
, третья запись идентична первой. Далее следуют три ответа с одного и того же MAC-адреса для 10.202.7.4
с той лишь разницей, что P
, Out
, P
последовательность.
Почему на пинг три записи и что P
в направлении значит? Я тщетно искал в Интернете, если не искал не то.
Основываясь на ответе Zoredache, я связал спецификацию интерфейса с тремя задействованными: vnet5
(сетевая карта гостевой виртуальной машины на гипервизоре), br0
(мост гипервизора) и eno1
(физический сетевой адаптер, идентифицированный как порт моста для моста) и получил один запрос / ответ для каждого пинга при тестировании каждого интерфейса, поэтому я (безумно) предполагаю, что это причина трех записей с использованием «любой». Я все еще озадачен P
и последовательность P
, Out
, P.
Любое понимание?
Дальнейшее обновление (и я хочу поблагодарить Антона за его исследования, очень ценные.)
Провел тест снова с четырьмя спецификациями tcpdump, все '-neli <interface> icmp and host 10.202.7.128'
с интерфейсами vnet5
, br0
, eno1
и "any
". Отметил временные метки, чтобы определить, что"any
"запись соответствует отдельным записям интерфейса.
"Любые" результаты (vnet5/10.202.7.128
является 52:54:00:a2:bd:48
, 10.202.7.4
является b0:00:b4:02:93:6e
)
00:06:57.775050 P 52:54:00:a2:bd:48 ethertype IPv4 (0x0800), length 100: 10.202.7.128 > 10.202.7.4: ICMP echo request, id 27288, seq 1, length 64
00:06:57.775074 Out 52:54:00:a2:bd:48 ethertype IPv4 (0x0800), length 100: 10.202.7.128 > 10.202.7.4: ICMP echo request, id 27288, seq 1, length 64
00:06:57.775050 P 52:54:00:a2:bd:48 ethertype IPv4 (0x0800), length 100: 10.202.7.128 > 10.202.7.4: ICMP echo request, id 27288, seq 1, length 64
00:06:57.775940 P b0:00:b4:02:93:6e ethertype IPv4 (0x0800), length 100: 10.202.7.4 > 10.202.7.128: ICMP echo reply, id 27288, seq 1, length 64
00:06:57.775956 Out b0:00:b4:02:93:6e ethertype IPv4 (0x0800), length 100: 10.202.7.4 > 10.202.7.128: ICMP echo reply, id 27288, seq 1, length 64
00:06:57.775940 P b0:00:b4:02:93:6e ethertype IPv4 (0x0800), length 100: 10.202.7.4 > 10.202.7.128: ICMP echo reply, id 27288, seq 1, length 64
vnet5 результаты
00:06:57.775050 52:54:00:a2:bd:48 > b0:00:b4:02:93:6e, ethertype IPv4 (0x0800), length 98: 10.202.7.128 > 10.202.7.4: ICMP echo request, id 27288, seq 1, length 64
00:06:57.775956 b0:00:b4:02:93:6e > 52:54:00:a2:bd:48, ethertype IPv4 (0x0800), length 98: 10.202.7.4 > 10.202.7.128: ICMP echo reply, id 27288, seq 1, length 64
br0 результаты
00:06:57.775050 52:54:00:a2:bd:48 > b0:00:b4:02:93:6e, ethertype IPv4 (0x0800), length 98: 10.202.7.128 > 10.202.7.4: ICMP echo request, id 27288, seq 1, length 64
00:06:57.775940 b0:00:b4:02:93:6e > 52:54:00:a2:bd:48, ethertype IPv4 (0x0800), length 98: 10.202.7.4 > 10.202.7.128: ICMP echo reply, id 27288, seq 1, length 64
eno1 результаты
00:06:57.775074 52:54:00:a2:bd:48 > b0:00:b4:02:93:6e, ethertype IPv4 (0x0800), length 98: 10.202.7.128 > 10.202.7.4: ICMP echo request, id 27288, seq 1, length 64
00:06:57.775940 b0:00:b4:02:93:6e > 52:54:00:a2:bd:48, ethertype IPv4 (0x0800), length 98: 10.202.7.4 > 10.202.7.128: ICMP echo reply, id 27288, seq 1, length 64
В 775050
метка времени соответствует vnet5
и br0
, ожидаемый первый «прыжок» (vnet5
к br0
). В 775074
соответствует eno1
что является ожидаемым вторым "прыжком" (br0
к eno1
). У меня нет объяснения повторению второго 775050
запись, потому что это все еще запрос.
В 775940
отметка времени соответствует eno1
и br0
, ожидаемый первый «прыжок» ответа (eno1
к br0
). В 775956
отметка времени соответствует vnet5
, ожидаемый второй "прыжок" ответа (br0
к vnet5
). Опять же, у меня нет объяснения повторению второго 775940
запись, потому что это все еще ответ.
Заключительное примечание, оба "Out
"записи относятся к br0
передача на интерфейс (eno1
при исходящем, vnet5
на входящем).
Если у кого-то есть объяснение повторения двух записей, ответьте.
Я заглянул в исходный код из tcpdump
.
Значение поля типа пакета:
In
- пакет адресован хостуOut
- исходящий пакетB
- трансляцияM
- многоадресная передачаP
- пакет адресован другому хостуДублированные пакеты в tcpdump
выход, вызванный -i any
вариант.
Когда кадр Ethernet прошел через мост Linux, и вы используете -i any
вариант tcpdump, вы увидите этот кадр несколько раз. Первый раз вы видите рамку на интерфейсе ввода (vnet5
), второй раз на самом интерфейсе моста (br0
) и третий раз на выходном интерфейсе (eno1
). Просмотр транзитных кадров на интерфейсе моста - это побочный эффект реализации моста Ethernet в ядре Linux.
Кроме того, когда интерфейс моста имеет несколько портов (подчиненные интерфейсы), в некоторых случаях вы видите копии фреймов на каждом порту, когда фрейм Ethernet заправляется лавинной рассылкой. Это происходит с широковещательными, многоадресными и неизвестными одноадресными кадрами.
Большая часть вашего дублирования вызвана -i any
вариант вы прошли.
Когда вы это сделаете, tcpdump будет захватывать каждый интерфейс, а в случае маршрутизатора, моста или чего-то еще, где пакет пересылается между интерфейсами, он вернет копию пакета для каждый интерфейс, который он поражает.
Я не очень знаком с KVM, но я считаю, что если у вас есть 2 виртуальные машины, подключенные через интерфейс моста, у вас будет виртуальный интерфейс для каждой виртуальной машины и интерфейс моста.
В любом случае, если вы не хотите дублирования, ограничьте tcpdump одним интерфейсом, указав имя конкретного интерфейса для -i
вариант. Хотя для некоторых проблем вам действительно могут понадобиться все интерфейсы, и в этом случае вам просто нужно понять, что вы увидите дублирование.