Multicast versus allmulti a VXLANy

Jan Kasprzak kas na fi.muni.cz
Středa Březen 31 22:19:59 CEST 2021


	Zdravím,

TL;DR: jak poznám jaké HW filtry MAC adres síťová karta aktuálně používá?

narazil jsem na takový problém, který se asi nějak týká multicastu.
Mám fyzické stroje pro virtualizaci (nad OpenNebulou). Tyto stroje mají
dedikovanou síťovou kartu jen pro své virtuální stroje - je tam MTU 9000
a nad tím jsou VXLANy, které spojují ty VM do různých sítí. Fyzické
stroje jsou stejné, a tato rozhraní pro VXLAN overlay sítě jsou zapojena
všechna do jednoho VLANu jednoho switche. Switch má vypnutý IGMP snooping,
ale toto asi není důležité. Šíření MAC adres nad overlay sítěmi a šíření
broadcastů/multicastů je řešeno IP multicastem nad fyzickou sítí,
žádné BGP-EVPN tam není.

	Na jednom z těchto VXLANů mám několik stovek VM. Děje se mi to,
že některé tyto VM na sebe navzájem občas přestávají vidět, a zase za čas
se to zase spraví, a třeba zase na sebe přestanou vidět jiné dva VM.

	Postupným tcpdumpováním jsem našel případ, kdy jedna VM pošle
ARP dotaz (broadcast), tento broadcast vidím tcpdumpem na eth rozhraní
fyzického stroje (zabalený do IP multicastu té nížší vrstvy),
ale už ho nevidím na eth rozhraní druhého fyzického stroje, kde běží ta VM,
jíž primárně je ten ARP dotaz určen.

	Náhodou jsem pak zadal tcpdump bez -p, čímž jsem přepnul eth
rozhraní druhého fyzického stroje do promiskuitního režimu, a ono to
začalo fungovat. Několikrát jsem ověřil zrušením ARP záznamu z cache
virtuálního stroje, pokusem o komunikaci s druhým virtuálním strojem (ping),
a uvedením fyzického eth rozhraní hosta, kde běží druhý virtuální stroj,
do promiskuitního režimu, že přesně tím zrušením z ARP cache se komunikace
rozbije, a tím promiskuitním režimem se zase opraví. Přitom tcpdump jako
první packet (neběží-li s -p) vidí právě ten zapouzdřený ARP dotaz.

	Z toho mi vyplynulo, že možná síťová karta nepodává kernelu
multicast rámce, které by měla podávat. Tak jsem zkusil
"ifconfig eth1 allmulti", což nepomohlo. Naopak "ifconfig eth1 promisc"
podle očekávání pomohlo. Multicastové adresy které má eth karta přijímat
jsou nastavené správně - podle "ip maddress ls" je u té síťové karty

        link  01:00:5e:00:00:XX
        inet  239.0.0.YY

Kde XX je číslo VXLANu v šestnáctkové, a YY v desítkové soustavě.

Mám teorii, že může být problém v tom, že síťová karta má špatně
nastavené HW filtry na MAC adresy, které má dál předávat kernelu.
Nebo že těch filtrů chce kernel víc, než hardware podporuje.
Ale nevím, kde takovouto teorii ověřit, nebo co dalšího zkusit.
Máte na to někdo nějaký názor?

Díky,

-Yenya

-- 
| Jan "Yenya" Kasprzak <kas at {fi.muni.cz - work | yenya.net - private}> |
| http://www.fi.muni.cz/~kas/                         GPG: 4096R/A45477D5 |
    We all agree on the necessity of compromise. We just can't agree on
    when it's necessary to compromise.                     --Larry Wall


Další informace o konferenci Linux