У меня есть стандартная настройка моста между реальным миром и гостевой виртуальной машиной KVM.
Мостик выглядит нормально:
[root@t ~]# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.40f2e9c6033d no eno2
vnet0
virbr0 8000.000000000000 no
Шлюз по умолчанию - br0 на хосте.
Я могу пропинговать виртуальную машину с хоста и хост с виртуальной машины.
Если я пингую что-то за пределами виртуальной машины или самого хоста, я вижу периодическую потерю пакетов:
[root@locoxen2 ~]# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=55 time=4.59 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=55 time=4.59 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=55 time=4.67 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=55 time=4.75 ms
64 bytes from 8.8.8.8: icmp_seq=5 ttl=55 time=4.69 ms
64 bytes from 8.8.8.8: icmp_seq=15 ttl=55 time=1224 ms
64 bytes from 8.8.8.8: icmp_seq=16 ttl=55 time=224 ms
64 bytes from 8.8.8.8: icmp_seq=17 ttl=55 time=4.49 ms
64 bytes from 8.8.8.8: icmp_seq=18 ttl=55 time=4.48 ms
64 bytes from 8.8.8.8: icmp_seq=19 ttl=55 time=4.54 ms
64 bytes from 8.8.8.8: icmp_seq=20 ttl=55 time=4.52 ms
64 bytes from 8.8.8.8: icmp_seq=21 ttl=55 time=4.55 ms
64 bytes from 8.8.8.8: icmp_seq=22 ttl=55 time=4.70 ms
64 bytes from 8.8.8.8: icmp_seq=23 ttl=55 time=4.57 ms
64 bytes from 8.8.8.8: icmp_seq=24 ttl=55 time=4.88 ms
64 bytes from 8.8.8.8: icmp_seq=25 ttl=55 time=4.65 ms
64 bytes from 8.8.8.8: icmp_seq=26 ttl=55 time=4.53 ms
64 bytes from 8.8.8.8: icmp_seq=36 ttl=55 time=1430 ms
64 bytes from 8.8.8.8: icmp_seq=37 ttl=55 time=430 ms
64 bytes from 8.8.8.8: icmp_seq=38 ttl=55 time=4.57 ms
64 bytes from 8.8.8.8: icmp_seq=39 ttl=55 time=4.53 ms
Это особенно происходит, если трафик покидает виртуальную машину и хост одновременно.
Если я выключаю виртуальную машину (т.е. гарантирую отсутствие трафика с этой стороны моста), я не вижу потери пакетов, если я пингую с хоста, как указано выше.
Запуск tcpdump на физическом порте (eno2) на хосте при одновременном пинге с хоста и виртуальной машины показывает мне такие вещи (40: f2 - хост, 52:54 - виртуальная машина):
17:53:26.382679 40:f2:e9:c6:03:3d > e8:f7:24:49:49:ee, ethertype IPv4 (0x0800), length 98: 192.168.0.191 > 8.8.8.8: ICMP echo request, id 27485, seq 23, length 64
17:53:27.200397 52:54:00:16:f5:f4 > e8:f7:24:49:49:ee, ethertype IPv4 (0x0800), length 98: 192.168.0.221 > 8.8.8.8: ICMP echo request, id 11460, seq 2, length 64
17:53:27.382244 40:f2:e9:c6:03:3d > e8:f7:24:49:49:ee, ethertype IPv4 (0x0800), length 98: 192.168.0.191 > 8.8.8.8: ICMP echo request, id 27485, seq 24, length 64
17:53:28.200304 52:54:00:16:f5:f4 > e8:f7:24:49:49:ee, ethertype IPv4 (0x0800), length 98: 192.168.0.221 > 8.8.8.8: ICMP echo request, id 11460, seq 3, length 64
т.е. пакеты уходят, но ответы не приходят.
То же, но без трафика от ВМ или ВМ выключена:
17:53:05.346226 40:f2:e9:c6:03:3d > e8:f7:24:49:49:ee, ethertype IPv4 (0x0800), length 98: 192.168.0.191 > 8.8.8.8: ICMP echo request, id 27485, seq 2, length 64
17:53:05.350936 e8:f7:24:49:49:ee > 40:f2:e9:c6:03:3d, ethertype IPv4 (0x0800), length 98: 8.8.8.8 > 192.168.0.191: ICMP echo reply, id 27485, seq 2, length 64
17:53:06.348159 40:f2:e9:c6:03:3d > e8:f7:24:49:49:ee, ethertype IPv4 (0x0800), length 98: 192.168.0.191 > 8.8.8.8: ICMP echo request, id 27485, seq 3, length 64
17:53:06.352855 e8:f7:24:49:49:ee > 40:f2:e9:c6:03:3d, ethertype IPv4 (0x0800), length 98: 8.8.8.8 > 192.168.0.191: ICMP echo reply, id 27485, seq 3, length 64
iptables и ebtables не показывают правил - все установлено на ACCEPT. Я отключил все функции разгрузки на портах. Склеивание не используется. MAC-адреса уникальны - я не вижу совпадений.
Обратите внимание, что я вижу это для установок как CentOS6, так и 7.
Что я упускаю из виду?
В конце концов, с моей настройкой все было в порядке.
Проблема заключалась в том, что вышестоящий сетевой коммутатор не был настроен на использование статической VLAN на соответствующем порте коммутатора. Несколько MAC-адресов, которые он видел, вызвали путаницу в отношении того, какие VLAN следует назначить порту.
Как раздражает!
Я столкнулся с той же проблемой, но основная проблема была другой. Я столкнулся с этим вопросом, пытаясь диагностировать проблему, и решил, что оставлю ответ с другим возможным виновником, особенно при запуске KVM / qemu из командной строки, для всех, кто может извлечь пользу из этой информации.
Если вы явно не устанавливаете MAC-адрес для виртуального сетевого интерфейса, qemu назначит ему адрес по умолчанию. Если вы запускаете несколько виртуальных машин и не установили MAC-адреса на их сетевых интерфейсах, qemu почти наверняка предоставит им одинаковый MAC-адрес. (Обратите внимание, что большинство GUI-оболочек KVM, таких как virt-manager, назначат вам случайный MAC-адрес.)
Очевидно, это наносит ущерб маршрутизации уровня 2 между виртуальными машинами, и они будут бороться за то, кому принадлежит адрес.
Предоставление каждому хосту другого MAC-адреса решило проблему для меня.