← Home

Настройка dns в ubuntu

By Брендель В. М.

По горячим следам пока не забsл.

В Убунте намудренная сетевая система, включая систему разрешения имен.

Есть NetworkManager (позволяет управлять сетевыми интерфейсами, тоже как-то перекликается с DNS, но здесь не нужен).

Есть система переключения порядка обхода resolve

/etc/nsswitch.conf

hosts: files mdns4_minimal [NOTFOUND=return] dns myhostname

Здесь порядок такой files — /etc/hosts, mdns4_minimal — avaho, dns — по-умолчанию systemd-resolved, myhostname — хз че такое.

Задача — не правя руками /etc/hosts, зделоть зону .test для всех разрабатываемых сайтов и прокинуть адреса в докер.

Т.к. по умолчанию на порте 53 сидит systemd-resolved, нам нужно либо настроить его, либо (общепринято) накатывать простой dns сервер dnsmasq. Настроить system-resolved как-то поморочено. Напрямую править /etc/recolve.conf нельзя, так как файл перетирается.

Нужно поставить пакет resolvconf:

sudo apt install resolvconf Затем отредактирвоать /etc/resolvconf/resolv.conf.d$ sudo subl head

nameserver 127.0.0.1

Тогда в /etc/recolve.conf будет так:

nameserver 127.0.0.1

nameserver 127.0.0.1

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

Затем делаем sudo apt-get install dnsmasq. Скорее всего после установки, при запуске выскочит ошибка, что dnsmask не смог запуститься, так как кто слушает 53 порт. Этот кто-то - systemd-resolved.

( Свернуть ) Правим конфиг dnsmask sudo subl /etc/dnsmasq.con address=/test/127.0.0.1 — создает зону .test на локальном адресе.

listen-address=127.0.0.1 — слушаем запросы с локальный адреса

bind-interfaces — позволяет слушать 53 порт одновременно с systemd-resolved.

Делаем

sudo systemctl restart systemd-resolved

sudo systemctl restart dnsmasq И DNS настроен.

В docker-compose не забываем добавлять

nginx_rp:

image: nginx:alpine

container_name: nginx_rp

ports:

  - 80:80

  - 443:443

volumes:

  - ./nginx_rp/core/conf/:/etc/nginx/conf.d/

  - ./nginx_rp/www:/var/www/

  - ./nginx_rp/logs:/var/log/nginx/

  - ./nginx_rp/html:/usr/share/nginx/html/

#  - /etc/letsencrypt_docker:/etc/letsencrypt

networks:

  - web_rp

restart: always

extra_hosts:

  - p1.test:127.0.0.1

  - p2.test:127.0.0.1

Таким образом curl p1.test спросит у машины адрес, получит локальный, подет в интерфейс docker0, спросит там, пойдет в контейнер Nginx, внутри контейнера в /etc/hosts прописаны эти хосты.

Следущий этап прокидывать p1.test в nginx1, p2.test в nginx2. Это делается в nginx.cong nginx_rp контенйнера (Rуverse Proxy).

P.S. Есть еще проблема когда приложения из контейнера не могут ресолвить имена. Это например когда сеть компании блочит DNS google, куда стучатся контейнеры по умолчанию.

Для решения этой проблемы:

/etc/docker/daemon.json:

{ "dns": ["10.0.0.2", "8.8.8.8"] }

sudo service docker restart

P.P.S Скорее всего dnsmasq также придется настроить при перезде на хостинг.

Нужно будет сказать ему слушать внешний порт, и прямо прописать имена web-страничек и ассоциированных IP (127.0.0.1, разумется). Хотя может и не надо. Возможно на на nic.ru просто прописать IP сервера и все дела. По идее, он просто будет отдавать IP, а разруливать конкретного получателя все-равно будет nginx.