Имеется 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
Если для 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:
Включаем обе опции:
Проверяем.
Сначала из офиса, что бы проверить разрешение “через мир”:
[simterm]
[setevoy@setevoy-arch-work ~] $ dig ec2-63-***-***-138.eu-west-1.compute.amazonaws.com +short 63.***.***.138
[/simterm]
Теперь – с хоста с OpenVPN, что бы проверить разрешение имени через VPC peering:
[simterm]
openvpnas@openvpnas2:~$ dig ec2-63-***-***-138.eu-west-1.compute.amazonaws.com +short 172.31.41.159
[/simterm]
172.31.41.159 – приватный IP ЕС2-инстанса с Bitwarden, всё хорошо.
Route53
Далее требуется обновить запись в Route53: сейчас для имени accounts.examle.com указана IN A
запись в виде IP – меняем её на CNAME
, и указываем публичное имя инстанса:
Ждём несколько минут, пока обновятся DNS, проверяем из офиса:
[simterm]
[setevoy@setevoy-arch-work ~] $ dig accounts.examle.com +short ec2-***-***-252-138.eu-west-1.compute.amazonaws.com. 63.***.***.138
[/simterm]
И с хоста с OpenVPN:
[simterm]
openvpnas@openvpnas2:~$ dig accounts.examle.com +short ec2-63-***-***-138.eu-west-1.compute.amazonaws.com. 172.31.41.159
[/simterm]
С хоста с 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:
[simterm]
openvpnas@openvpnas2:~$ dig @10.0.10.2 ya.ru +short 87.250.250.242
[/simterm]
Далее переходим в админпанель OpenVPN, и указываем DNS:
Подключаемся к VPN из офиса:
[simterm]
[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 ...
[/simterm]
И проверяем имя accounts.examle.com:
[simterm]
[setevoy@setevoy-arch-work ~] $ dig accounts.examle.com +short ec2-63-***-***-138.eu-west-1.compute.amazonaws.com. 172.31.41.159
[/simterm]
172.31.41.159 – приватный IP инстанса с Bitwarden, всё работает.
Готово.