DNS поиск из докку контейнера
Я запускаю приложение узла внутри контейнера Dokku на сервере Ubuntu, который также запускается bind9
для DNS. В приложении узла я запускаю экспресс. В приложении узла я выполняю обратный поиск DNS по IP-адресу клиента следующим образом (упрощенно):
const dns = require('dns');
const app = require('express')();
app.get('/myhostname', (req, res) => {
dns.reverse(req.headers['x-forwarded-for'], (err, hostnames) => {
res.json({ hostname: hostnames[0] });
});
});
Это прекрасно работает локально, но после развертывания в контейнере Dokku происходит сбой с ENOTFOUND
ошибка. Предположительно, это связано с тем, что приложение не настроено на использование сервера Ubuntu в качестве DNS-сервера. Так что я попробовал это сразу после require('dns')
:
dns.setServers([process.env.DNS_SERVERS])
где DNS_SERVERS
устанавливается либо на локальный IP-адрес локальной сети сервера, либо на внутренний IP-адрес докера. Любой из этих адресов приводит к задержке и возможному таймауту при попытке получить адрес.
Как я должен идти об этом?
1 ответ
Решение было таким:
Задавать
DNS_SERVERS=172.17.0.1
Разрешить запросы через брандмауэр на
docker0
интерфейсУдостовериться
bind
прослушивает 172.17.0.1 и что он разрешает запросы от172.17.0.0/16
спектр
Второй пункт в списке - это то, что я не рассматривал...