У меня есть DNS-контейнер bind9, работающий на 10.64.128.53, который находится на сетевых «серверах» докеров в подсети 10.64.128.0/24. это отлично работает, и если я запускаю:
nslookup google.com 10.64.128.53
Я получаю вывод:
Сервер: 10.64.128.53
Адрес: 10.64.128.53#53
Неавторитетный ответ:
Название: google.ru
Адрес: 216.58.193.142
Когда я запускаю ту же команду в контейнере докеров: docker run --rm -it --сетевые серверы --dns 10.64.128.53 alpine nslookup google.com 10.64.1 28.53
Я получаю вывод:
Сервер: 10.64.128.53
Адрес: 10.64.128.53:53
Неавторитетный ответ:
Название: google.ru
Адрес: 216.58.193.142
Это ожидается
Теперь, если я бегу: docker run --rm -it --сетевые серверы --dns 10.64.128.53 alpine nslookup google.com
Я получаю вывод:
nslookup: запись на «127.0.0.11»: в соединении отказано
;; время соединения истекло; нет доступа к серверам
Для меня это не имеет особого смысла, потому что я указал свой DNS-сервер докера, но я предполагаю, что докер запускает его через внутренний прокси-сервер на 127.0.0.11. Это было бы здорово, если бы я использовал его, но мне это не нужно. Лучшее решение, о котором я могу думать, это перезапись /etc/resolv.conf
с моим DNS-сервером, но это кажется ужасным решением. я видел это https://github.com/moby/moby/issues/19474#issuecomment-173093011 но не могу заставить это работать в nftables, но я думаю, что это единственный способ, потому что кажется, что DNS-серверу докеров требуются подключения с 127.0.0.11:53
Хост - Gentoo Linux, я знаю, что сеть работает, когда установлен iptables. Я вижу эти ошибки в журналах докеров всякий раз, когда запускаю виртуальную машину:
time="2022-01-25T03:08:56Z" level=warning msg="Не удалось найти iptables: exec: \"iptables\": исполняемый файл не найден в $PATH"
time="2022-01-25T03:08:56Z" level=error msg="установить правило не удалось, [-t nat -I DOCKER_OUTPUT -d 127.0.0.11 -p udp --dport 53 -j DNAT --to- пункт назначения 127.0.0.11:50360]"
time="2022-01-25T03:08:56Z" level=error msg="установить правило не удалось, [-t nat -I DOCKER_POSTROUTING -s 127.0.0.11 -p udp --sport 50360 -j SNAT --to- источник: 53]"
time="2022-01-25T03:08:56Z" level=error msg="установить правило не удалось, [-t nat -I DOCKER_OUTPUT -d 127.0.0.11 -p tcp --dport 53 -j DNAT --to- пункт назначения 127.0.0.11:46531]"
time="2022-01-25T03:08:56Z" level=error msg="установить правило не удалось, [-t nat -I DOCKER_POSTROUTING -s 127.0.0.11 -p tcp --sport 46531 -j SNAT --to- источник: 53]"
Я также вижу эту ошибку каждый раз, когда пытаюсь запустить команды nslookup в контейнерах докеров, но я не уверен, насколько это связано:
time="2022-01-25T03:20:08.094540639Z" level=error msg="Обработчик POST /v1.41/exec/d52b964c2e34acb78b67e5d2f02a8143e1efb3c45da0936fe128ed14fb6296ce/resize вернул ошибку: невозможно изменить размер остановленного контейнера: неизвестно"
Просто использование iptables на самом деле не является решением, я хочу, чтобы это был чисто nftables, и это не кажется неразумным.
Если у меня работает iptables, Docker DNS работает, но в iptables не добавляются правила. Я этого не понимаю, почему он требует iptables, но не устанавливает правил?