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

Два интерфейса в одной сети с мостом

У меня есть гипервизор qemu с двумя физическими интерфейсами. eth0 используется для трафика хоста (управления), а eth1 не имеет IP и является частью br0 вместе с интерфейсами подключения виртуальной машины. Обе физические сетевые адаптеры подключены к одному и тому же неуправляемому коммутатору, и все находится в одной сети (192.168.1.0/24).

Все работает нормально. Но трафик между виртуальными машинами и хостом (например, хост запускает сервер samba) уходит из eth0 и возвращается в eth1. В этом есть смысл. Но я бы предпочел, чтобы хост перенаправлял свой трафик напрямую на br0, если он предназначен для виртуальной машины. Когда виртуальная машина отвечает хосту, кажется, что трафик перенаправляется с br0 на хост напрямую (без выхода eth1). По этой причине в моей таблице ARP я получаю две записи для каждого IP-адреса виртуальной машины. В одном говорится, что к виртуальной машине можно подключиться через eth0, а в другом - через br0.

Итак, мой вопрос таков: есть ли способ сообщить хосту, что, если в его кеше есть две записи ARP для одного и того же устройства, предпочитать одну другому?

Или, возможно, мой дизайн изначально очень плохой. Мне нравится, чтобы один интерфейс был зарезервирован для трафика виртуальной машины (потому что это интерфейс GB), а другой - для управления (потому что это интерфейс FE). Я понимаю, что для использования общей пропускной способности этих сетевых адаптеров мне, вероятно, следует связать обе сетевые карты, но это не вариант для меня, поскольку коммутатор, к которому они подключены, неуправляемый.

Буду признателен за любые предложения.

Спасибо.

Я нашел способ выполнить то, что мне нужно. Это будет работать только с openvswitch, а не с обычными мостами linux (к счастью, я использую OVS)

Теперь у меня есть интерфейсы eth0, eth1 и всех ответвлений в br0. Я установил "внутренний" порт моста и eth0 как порт доступа с vlan 200

ovs-vsctl add-port br0 eth0 tag=200
ovs-vsctl set port br0 tag=200

Затем я добавляю eth1 (физический ник виртуальной машины, через который должен проходить трафик виртуальной машины) в мост, но с vlan 200, а также все интерфейсы ответвлений.

ovs-vsctl add-port br0 eth1 tag=100
ovs-vsctl add-port br0 tap1 tag=100 -- set interface tap1 ofport_request=1001
ovs-vsctl add-port br0 tap2 tag=100 -- set interface tap2 ofport_request=1002

На данный момент это похоже на два моста, поскольку у нас есть 2 vlan. Теперь я хочу иметь возможность получать трафик между хостом и каждой виртуальной машиной без необходимости выходить из eth0 и обратно в eth1. Итак, для каждого интерфейса крана я добавляю 2 потока:

ovs-ofctl add-flow br0 "table=0,in_port=1001,priority=500,dl_type=0x800,nw_dst=192.168.1.33,actions=output=LOCAL"
ovs-ofctl add-flow br0 "table=0,in_port=LOCAL,priority=500,dl_dst=mac_of_vm,actions=output=1001"