LINUX.ORG.RU
ФорумAdmin

Debian9 KVM Bridge Пропадает шлюз при добавлении интерфейса

 , ,


1

1

Здравствуйте.

Быть может кто-то подскажет решение. Всё перерыл, нигде ничего похожего не нашел.

Обычный мост, br0, на нем белый адрес самого сервера. На нем гостевые виртуалки, KVM (QEMU)-машины (две) имеют тоже белые адреса и запускаются нормально. Шлюз тот же, что и у хоста (провайдерский). Друг-друга видят, хост машину тоже видят, и она их видит. НО! Глюк. Только одна машина имеет выход наружу и сам хост. Если их запустить в другой последовательности - то первая будет иметь наружу доступ, а вторая нет.

Проблема, которая проявляется не сразу и не всегда: все вместе они не могут выходить наружу. Только одна и хост. Только вторая и хост. Бывает даже, как только запускаешь вторую машину, хост пропадает (не видит шлюза), но внутри моста все друг друга видят (я захожу на них через доступную машину). На машине, которая не имеет доступа во вне, в arp таблице шлюз указан как incomplete. В tcpdump видно, как шлюз запрашивает мак этой машины, и даже ему ответ. Но не работает нихрена. Т.е. мост почему-то не пропускает эти пакеты. sysctl двадцать раз все перепроверил - все нужные переменные как надо стоят (forward=1).

Если я первую машину заглушу, то вторая будет нормально работать. Адреса, ессно, разные, маски правильные. Прописано, конечно, всё правильно - перепроверено сто раз.

Т.е. проблема именно после того, как в бридж добавляется какой-то один из интерфейсов (подозреваю скрипт bridge-ifupdown). В консоли появляется сообщение о том, что «такой-то интерфейс перешел в promiscous mode».

Но такое сообщение появляется в принципе и после старта других машин.

Проблема давняя, возникает каждый раз после перезагрузки сервера-хоста (Debian9). Т.к. это происходит крайне редко, то и с проблемой бороться приходится редко.

Ранее помогал такой танец с бубном: идешь в скрипт запуска машины (обычно той, которая является источником проблемы), там меняешь имя ее интерфейса, например, было tap0, меняешь на tap4.

Там примерно такой скрипт:

/usr/bin/kvm \
-drive file=disk.img,cache=none,if=virtio \
-boot c -m 2048 -vnc :1 -cpu core2duo -name vm1 \
-net nic,model=virtio -net tap,ifname=tap4 &

Стартуешь машину, и, о чудо, ничего не пропадает, все машины друг-друга видят, интернет видят, хост тоже всё и всех видит. Видимо, где-то как-то хранится какая-то история мак-адресов, имен интерфейсов. Всё заработало, ну и оставляешь так года на два-три, пока хостеру не приспичит питание переключить или что-то еще такое.

Вот сейчас хостеру приспичило заменить мои адреса (внешние, я их ставлю на виртуалки). Всё изменил, всё работало - это к тому, что адреса рабочие и доступные из-вне.

Для верности решил перезагрузить хост - и на тебе. Две машины нормально, одна - недоступна, и хост тоже становится недоступен. Та машина, которая доступна - захожу на нее, с нее вижу всю сеть нормально - и хост, и проблемную машину. Могу на них заходить. Но с них недоступен шлюз провайдерский (ну и конечно недоступны из-вне).

Так вот сейчас, что только ни пробовал - тот танец с бубном никак не помогает.

Временно решил так: создал еще один бридж (br1), с внутренней сетью (192.168.х.х), интерфейс этой машины поместил туда, прописал у нее адрес из этой сети, шлюз - хост-машину, и на хосте сДНАТил ее внешний ИП на внутренний. И сНАТил ее выход через этот ип (сделал полный проброс ип-адреса).

Работает нормально. Т.е. в другой бридж она нормально добавляется, ничего никуда не пропадает, ходит туда-сюда как надо.

Но это костыль. Хочется сделать нормально.

Может кто-нибудь сталкивался? Не может же быть, что за 10 лет (старт сервера в 2014г) я один с таким глюком.



Последнее исправление: tonikas (всего исправлений: 4)
Ответ на: комментарий от vel

Извиняюсь, забыл сказать, да, МАКи разные совершенно. Игра с ними в скриптах запуска ни к чему не приводит. Помогало только изменение имени интерфейса (tap0, tap1).

Показывать нечего по сути, адреса, маски, маки, arp - все норм кроме одной машины (которая является «причиной» проблемы).

Еще вот какая особенность. На этой как раз машинке, когда вручную задаешь мак в скрипте запуска, на ней сетка не запускается, интерфейс внутри при каждом запуске становится на один номер выше: был eth0, стал eth1, потом eth2 и т.д. Но интерфейс в скрытом режиме, видно только по ifconfig -a, при попытке его поднять показывает ошибку cannot assign address.

Убрал из скрипта мак (дал бриджу самому решить какой мак ставить), сразу сетка нормально стала (eth0, адрес ставится без ошибок). Но все равно шлюз недоступен.

tonikas
() автор топика
Ответ на: комментарий от tonikas

С маками вообще как-то всё странно.

Если мак не указан в скрипте запуска, на хосте у этого интерфейса мак равен маку бриджа. Но в самой системе совсем другой.

Если мак таки указан, то на хосте у интерфейса этого мак не равен маку бриджа, но и не равен тому, что указан в строке запуска, а в системе тот, что указан в строке запуска.

Может так и надо. Во всяком случае раньше всё работало. А никто ничего не делал.

tonikas
() автор топика