
У меня такая топология сети:
Видите ли, em1
(1.1.8.209) — это физический интерфейс, с которым я могу общаться через Интернет. И я создал два экземпляра виртуальной машины: PID 8740
и PID 8817
, оба используют сетевой IP-адрес 1.1.8.210/29
и 1.1.8.211/29
, оба публичные IP-адреса.
теперь я могу общаться с em1 через интернет.
но у меня есть требование: я хочу иметь прямой доступ к двум виртуальным машинам, поэтому я хочу присоединить em1 к br0
.
затем я выполнил это:
brctl addif br0 em1
топология становится такой:
Однако после выполнения этой команды я получаю сообщение об ошибке, я 1.1.8.209
больше не могу общаться. Затем я удалил вложение brctl delif br0 em1
, и теперь я могу получить доступ 1.1.8.209
.
Почему у меня эта проблема? Я не понимаю, пожалуйста, помогите объяснить почему.
решение1
Когда интерфейс становится портом моста, он больше не участвует в маршрутизации.
Подробности низкого уровня описаны в этом блоге.Правильная изоляция моста Linux:
передать кадр глобальному или специфичному для устройства обработчику протокола (например, IPv4, ARP, IPv6).
Для мостового интерфейса ядро настроило обработчик приема, специфичный для устройства
br_handle_frame()
. Эта функция не позволит никакой дополнительной обработки в контексте входящего интерфейса, за исключением кадров STP и LLDP или если включено «brouting». Поэтомуобработчики протоколов никогда не выполняютсяв этом случае.
IP-адрес такого порта моста становится неактуальным для входящего пакета. Если оставить его там, где он есть, это может по-прежнему нарушать правильную маршрутизацию исходящих пакетов, поскольку они все еще могут быть отправлены через порт моста напрямую (хотя они больше не должны).
Что необходимо сделать, так это переместить IP-адрес либо в систему (или сетевое пространство имен, или даже на другой свободный конец пары veth в том же месте), другой конец которой подключен к мосту, либо в собственный порт моста, т. е. сам мост. Всегда будет небольшой временной интервал, в течение которого во время этого перемещения будет существовать нарушение, поэтому действия, выполняемые локально для изменения этой конфигурации, не должны зависеть от доступа к сети (например: не должны зависеть от ввода команд удаленно через оболочку с использованием нарушенного маршрута).
Ниже я буду использовать только новые инструменты с новым синтаксисом.
Например:
ip address flush dev em1
ip address add 1.1.8.209/29 dev br0
Вместо этого, другой способ оставить мост без участия в маршрутизации и использовать дополнительныйветКонец пары (в одном и том же сетевом пространстве имен) для участия в маршрутизации может быть:
ip address flush dev em1
ip link add name em1twin type veth peer name br0portem1twin
ip link set br0portem1twin master br0 up
ip link set em1twin up
ip address add 1.1.8.209/29 dev em1twin
В обоих случаях, если маршрут по умолчанию (или другие маршруты) зависели от существования этого адреса, этот маршрут также необходимо добавить снова, поскольку он исчез.