AWS: VPC peering DNS resolution и настройки DNS для OpenVPN AS

Автор: | 05/17/2019
 

Имеется VPC с OpenVPN. Эта VPC через VPC Peering объединена с другими VPC в нашем AWS-аккаунте.

Проблема в том, что для разрешения DNS имён на приватные, а не публичные IP, сейчас используется dnsmasq на хосте с VPN-сервером, для которого создан файл /etc/dnsmasq.hosts, в котором вручную приходится вносить приватные IP для доменов.

Подробнее см. в посте OpenVPN: настройки DNS и dnsmasq.

Более правильный подход — использовать опцию DNS Resolve через DNS Resolution самих VPC. Про DNS в AWS VPC подробно описывал в посте DNS: установка BIND, DNS Load Balancing и network-based routing через view.

Документация по VPC DNS Resolution — Enabling DNS Resolution Support for a VPC Peering Connection.

Ниже пример настройки разрешения имён между VPC с OpenVPN, и VPC с ЕС2, на котором работает менеджер паролей Bitwarden (см. Bitwarden: менеджер паролей организации — установка self-hosted версии на AWS EC2). К ЕС2 подключен Elastic IP, на который через IN A запись направлен домен accounts.example.com.

DNS Hostnames

См. DNS Support in Your VPC.

Если для VPC не включена поддержка DNS Hostnames — необходимо сначала включить её.

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

Т.е. при запросе из мира — имя будет резолвиться на публичный IP, а при запросе из VPC — на приватный.

Переходим в VPC, находим нужную VPC, выбираем Edit DNS Hostnames:

Включаем поддержку имён:

DNS Resolution via VPC Peering

Далее — включаем поддержку разрешения имён между VPC через их peering.

Переходим в VPC > Peering Connections, выбираем нужное соединение, выбираем Edit DNS Settings:

Включаем обе опции:

Проверяем.

Сначала из офиса, что бы проверить разрешение «через мир»:

[setevoy@setevoy-arch-work ~] $ dig ec2-63-***-***-138.eu-west-1.compute.amazonaws.com +short
63.***.***.138

Теперь — с хоста с OpenVPN, что бы проверить разрешение имени через VPC peering:

openvpnas@openvpnas2:~$ dig ec2-63-***-***-138.eu-west-1.compute.amazonaws.com +short
172.31.41.159

172.31.41.159 — приватный IP ЕС2-инстанса с Bitwarden, всё хорошо.

Route53

Далее требуется обновить запись в Route53: сейчас для имени accounts.examle.com указана IN A запись в виде IP — меняем её на CNAME, и указываем публичное имя инстанса:

Ждём несколько минут, пока обновятся DNS, проверяем из офиса:

[setevoy@setevoy-arch-work ~] $ dig accounts.examle.com +short
ec2-***-***-252-138.eu-west-1.compute.amazonaws.com.
63.***.***.138

И с хоста с OpenVPN:

openvpnas@openvpnas2:~$ dig accounts.examle.com +short
ec2-63-***-***-138.eu-west-1.compute.amazonaws.com.
172.31.41.159

С хоста с VPN вернулся приватный адрес 172.31.41.159 — работает.

DNS в OpenVPN

В VPN Settings указываем приватный IP DNS-сервера этой VPC.

DNS в VPC всегда имеет адрес <network>.2.

В данном случае сеть VPC для OpenVPN имеет блок 10.0.10.0/24, следовательно DNS будет по адресу 10.0.10.2:

Можно проверить доступность DNS с хоста в этой VPC:

openvpnas@openvpnas2:~$ dig @10.0.10.2 ya.ru +short
87.250.250.242

Далее переходим в админпанель OpenVPN, и указываем DNS:

Подключаемся к VPN из офиса:

[setevoy@setevoy-arch-work ~] $ sudo openvpn --config vpnroot-client.ovpn
...
Thu May 16 12:05:31 2019 /etc/openvpn/update-resolv-conf tun0 1500 1553 172.27.240.75 255.255.248.0 init
dhcp-option DNS 10.0.10.2
...

И проверяем имя accounts.examle.com:

[setevoy@setevoy-arch-work ~] $ dig accounts.examle.com +short
ec2-63-***-***-138.eu-west-1.compute.amazonaws.com.
172.31.41.159

172.31.41.159 — приватный IP инстанса с Bitwarden, всё работает.

Готово.