LINUX.ORG.RU
решено ФорумAdmin

Virtual box + bridge + docker container = не работает

 , , networking,


0

1

Клиент-серверная архитектура, обмен по юдипи. Запускаю сервер в докер компоуз, там создается две собственные сети, но с доступом к хостовой (--network host). Графического клиента запускаю на виртуалке и нужно виртуалку затащить в ту же сеть, что и в докер компоуз создается, чтобы они могли обмениваться данными. Для этого я в виртуалке выбирают бридж и выбираю виртуальный адаптер, который создал докер. В итоге клиент пингует сервер и наоборот, между ними происходит обмен на уровне ядра - я по tcpdump вижу, что нужные пакеты от клиента приходят на сервер и наоборот. Но на уровене приложения пакетов нет - клиент и сервер не видят друг друга. Т.е. ядро их отбрасывает. netstat -s показывает, что чексумма неверная и по tcpdump'у тоже это видно - но чексумма рассчитывается сетевухой, т.е. это в принципе не страшно, ну и чексумма кривая только у серверных пакетов, а клиент посылает с корректной суммой, но сервер его не видит. Пытался через ethtool отключить offloading, но в контейнере это недоступно, судя по всему, может capabilities какие-то надо, я хз, я тут уже потерял землю под ногами и на ощупь пытался что-то сделать. В общем, пАмАгИтЕ люди добрые советом, что ли. Как так, пакеты приходят, но ядро их отбрасывает?

З.Ы. если в качестве бриджа взять реальный адаптер И в виртуалке использовать адрес из сети куда смотрит этот адаптер, то виртуалка начинает видеть сервер, но сервер один хрен не видит, и на него пакеты даже не приходят

Оказалось, что в виртуальной машине нужно выбирать не мост (br-ae23643f4e3e, например), который создает докер для каждой сети, а виртуальный ethernet адаптер (veth3172205@if28), связанный с этим мостом. При этом с докер контейнера, которому принадлежит второй виртуальный адаптер из их пары, UDP пакеты будут приходит без контрольной суммы и ядро на виртуалке их отбрасывает. Выходом стало использование любого другого виртуального адаптера из этой же сети, т.е. с другого контейнере, не того, с которым нужен был обмен. Выглядит не очень логично, на первый взгляд, но у меня так вышло. По крайней мере я могу продолжить работу на стенде и с виртуалбоксом, и с докером одновременно. Мне этого достаточно, дальше разбираться уже не буду.

З.Ы. на самом деле логику в таком поведение найти можно - в паре из двух виртуальных интерфейсов для проброса данных из одного пространства имен в другое данные проходят по кратчайшему пути, который не подразумевает расчет контрольной суммы. А когда обмен идет по двум виртуальным интерфейсам из разных пар данные проходят по более длинному пути и там включается расчет контрольной суммы. Но это просто догадка.

yetanother ★★
() автор топика