Доступ к UDP порту одного контейнера из другого

Переехав на Docker с малины на NAS, и перенеся по быстрому туда все контейнеры, захотел отвязать от сети host и привязать к bridge свой dns сервер на базе dnsmasq, работающий в отдельном контейнере.

Задача вроде бы тривиальная, что может быть проще? Делаем проброс портов через GUI или в консоли и всего делов. Сказано – сделано. Маплю в GUI 53/tcp к 53/tcp и 53/udp к 53/udp, указываю сеть bridge и запускаю. Проверяю с ноутбука – все работает, запросы успешно обрабатываются. Дело сделано, можно отдыхать. Да? Нет.

Через несколько часов замечаю что в ХА перестала приходить информация о температуре за бортом, отправляемая скриптом из отдельного контейнера с cron. Лезу в него, вижу в логах скрипта, что ему не удалось соединиться с MQTT сервером. Проверяю ping-ом, больше там ничего из сетевых утилит нет, и вижу что он резолвит имя MQTT брокера неверно, так как если бы он делал запрос ко внешнему серверу, а не к моему внутреннему. Странно. Лезу по очереди во все контейнеры так же привязанные к bridge и убеждаюсь, что ни из одного из них недоступен мой dns сервер. Запускаю отдельный контейнер, ставлю в него nmap, проверяю порты – 53tcp – open, 53udp – open/filtered. Ничего не понимаю, при этом с ноута оба порта просто open и опять таки dns работает штатно.

В общем, после пары часов изысканий, выяснилось, что бы все работало так как я хочу, порты мапить нужно не просто порт:порт, а хост:порт:порт, и только в таком случае все будет работать как ожидается. Не стал пробовать как с этим справится GUI Synology, просто удалил контейнер и создал его вручную в консоли при помощи такой команды

docker run -d --name dnsmask-adblock -v /volume1/docker/dnsmasq:/opt/dnsmasq -p 192.168.1.50:53:53 -p 192.168.1.50:53:53/udp --network bridge istitch07/dnsmasq-adblock

Вроде как полет нормальный, а эта информация может кому-нибудь пригодиться, в том числе и мне, когда я соберусь его пересоздавать и благополучно все забуду 🙂

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *