Назад | Перейти на главную страницу

Периодическая потеря пакетов в мостовой сети Linux (контекст KVM)

У меня есть стандартная настройка моста между реальным миром и гостевой виртуальной машиной 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-адреса решило проблему для меня.