Когда Linux работает как bridge, он не просто механически пересылает Ethernet-кадры между интерфейсами.
У него есть собственная forwarding database - FDB.
Когда кадр приходит на bridge, ядро смотрит на его source MAC и запоминает, откуда он пришёл:
aa:bb:cc:dd:ee:01 → eth0
aa:bb:cc:dd:ee:02 → eth1
Посмотреть таблицу можно:
bridge fdb show
После этого кадр для
aa:bb:cc:dd:ee:02 уже не нужно отправлять на все порты - bridge знает, что destination находится за eth1.Если destination MAC неизвестен, кадр будет flood’иться по подходящим портам. После получения ответа bridge снова обновит FDB.
У записей есть timeout, поэтому старый MAC постепенно исчезает:
bridge fdb show br br0
Особенно интересно это проявляется при миграции VM.
Было:
VM → eth0
После миграции:
VM → eth1
MAC тот же, но source frames начинают приходить с другого интерфейса. Bridge переучивает запись:
old MAC → eth0
↓
new MAC → eth1
Если MAC начинает постоянно перемещаться между портами, можно получить MAC flapping - и тогда проблема уже не в IP-маршрутизации.
Linux bridge в таком режиме фактически выполняет ту же базовую функцию, что и физический L2-коммутатор: строит таблицу MAC → порт на основании уже увиденного трафика.
N.A.

