DNS внутри контейнера

Photo Credit: WeGraphics

DNS внутри контейнера

Сегодня расскажу как поднять свой DNS сервер в Docker контейнере.
Уже почти год как сам пользуюсь таким в Digital Ocean. Приватной сети у данного провайдера все еще нет. Поэтому все мои машинки соединены через OpenVPN и в этот же VPN прокинут DNS сервер, через который осуществляется service location. О такой конфигурации и пойдет речь.

Собираем образ

Cоберем образ сервера с помощью Docker.

## Dockerfile
FROM ubuntu
MAINTAINER Denis Golovachev

RUN apt-get update
RUN apt-get install -y bind9 

CMD usr/sbin/named -c /etc/bind/named.conf -f
docker build -t server/bind .

И заберем из контейнера папку с конфигурацией DNS сервера.

bindId=$(docker run -d serer/bind)
docker cp $bindID:/etc/bind ./bind
docker stop $bindID

Теперь мы можем отредактировать конфигурацию DNS сервера

DNS Server

Добавим своих DNS записей. Для этого создадим свою доменную зону .tapcat

# bind/named.conf.local - Добавим запись вида
include "/etc/bind/named.conf.tapcat";
# bind/named.conf.tapcat - Создадим файл
zone "tapcat" {
        type master;
        file "/etc/bind/db.tapcat";
};
# bind/db.tapcat - Создадим файл. За доп опциями можно обратиться в man bind
$TTL 10
$ORIGIN tapcat.

@ IN SOA        ns1.tapcat hostmaster.tapcat. (
                    2014040901 ; Serial
                    2h ; Refresh
                    1h ; Retry
                    1w ; Expire
                    2h ; Negative Cache TTL
)

@               IN      NS      ns1.    ; Master

ns1.tapcat.         IN       A       10.8.0.19
master.tapcat.      IN       A       10.8.0.19

cname.tapcat.       IN      CNAME   master.tapcat.
cname2.tapcat.      IN      CNAME   master.tapcat.

Запускаем с нашей конфигурацией

docker run -d -p 53:53/udp -v /home/postengineering/bind9/conf:/etc/bind -c 25 -m 30m server/bind

Готово. У нас теперь свой ДНС сервер. Давайте прокинем его в OpenVPN.

OpenVPN

Машина, на которой установлен bind должна находиться в VPN сети. После этого мы редактируем конфиг VPN сервера

# /etc/openvpn/server.conf - добавим строчку
push "dhcp-option DNS 10.8.0.3"
# где 10.8.0.3 - адрес машины с VPN сервером

Изменяем конфигурацию наших VPN клиентов

# etc/openvpn/client.conf - добавляем
up /etc/openvpn/update-resolv-conf
down /etc/openvpn/update-resolv-conf

И кладем данный update-resolv-conf рядышком. Сам скрипт лежит у вас в репозитории пакетов или гуглится.
Перезапускаем bind:

docker run -d -p $VPN_IP:53:53/udp -v /home/postengineering/bind9/conf:/etc/bind -c 25 -m 30m server/bind

Готово. Теперь в нашей внутренней сети есть свой маленький DNS сервер.