Хорошей практикой является прятать внутренние ресурсы (базы, дев и сервисные окружения), делать все чтоб они оставались приватными и не светились в мир. Если отдельно поговорить об DNS записях (которые используются внутри инфраструктуры) они не должны индексироваться, доступ к ним должен быть закрыт из вне. Никто кроме нас и внутренних ресурсов не должен знать про них.
Для того чтоб спрятать DNS записи внутренних ресурсов от всяких сканеров (DNS brute-force, etc), подозрительных личностей и обезопасить Ваши спокойные будни от стрессов, есть хорошее решение, это AWS Route53 Private Hosted Zone. Если создать записи в этой зоне они будут доступны только в пределах одной или нескольких выбранных вами VPC.
Перед тем как приступим к созданию зоны нужно сделать следующее:
- В настройках VPC проверить чтоб был включен DNS hostnames и DNS resolution
- В VPC Peering проверить в DNS Settings активацию Accepter DNS resolution
Cоздание AWS Private HosterZone
Переходим в AWS Console –> Route53 –> Create hosted zone:
В VPC to associate with the hosted zone нужно указать в каких VPC будет доступна зона. Для теста указал одну VPC приложения, а вторую базы данных, между ними настроен vpc-peering:
создание зоны завершилось, посмотрим на нее:
Теперь добавим запись CNAME для кластера RDS (публичный доступ к базе отключен), жмем Create Record:
Проверим доступ с дев сервера:
$ dig dev.mysql.example.local +short ***************-cluster.cluster-ro-cslqcox3qst3.us-east-2.rds.amazonaws.com. ***************-cluster-instance-2.cslqcox3qst3.us-east-2.rds.amazonaws.com. 10.0.16.37
Подключаемся к базе:
$ mysql -h dev.mysql.example.local -u ***** -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 3521341 Server version: 5.7.12-log MySQL Community Server (GPL) Copyright (c) 2000, 2021, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> exit; Bye
Проблема: can’t resolve hostname
На некоторых серверах стал замечать ошибку, запись не резолвиться, при этом все настройки верны. Стал копать в чем может быть проблема.
Заглянем в файл /etc/resolv.conf:
$ cat /etc/resolv.conf domain us-east-2.compute.internal search us-east-2.compute.internal nameserver 127.0.0.1
Если вспомнить как работает DNS в VPC, то увидим следующее, для примера в VPC c Cidrs 172.50.4.0/24 шлюзом будет адрес 172.50.4.1, а адрес DNS-сервера VPC 172.50.4.2:
- *.*.*.1 – адрес шлюза.
- *.*.*.2 – адрес DNS-сервера VPC.
Нужной записи у нас нет. Ми не можем взять и изменить файл resolv.conf на прямую, так как он будет перезаписан. Есть много решений на просторах интернета, но я выбрал следующее здесь.
Для того чтоб решить проблему нужно:
- отредактировать файл по пути /run/systemd/resolve/resolv.conf, прописать nameserver 172.100.0.2 (DNS-ceрвер нашей VPC).
- удалить файл /etc/resolv.conf.
- создать символьную ссылку для resolv.conf, чтоб файл с /etc/resolv.conf ссылался к файлу с директории /run/systemd/resolve/resolv.conf.
Приступим, отредактируем сначала запись sudo vim /run/systemd/resolve/resolv.conf добавив nameserver:
# This file is managed by man:systemd-resolved(8). Do not edit.
#
# This is a dynamic resolv.conf file for connecting local clients directly to
# all known uplink DNS servers. This file lists all configured search domains.
#
# Third party programs must not access this file directly, but only through the
# symlink at /etc/resolv.conf. To manage man:resolv.conf(5) in a different way,
# replace this symlink by a static file or a different symlink.
#
# See man:systemd-resolved.service(8) for details about the supported modes of
# operation for /etc/resolv.conf.
nameserver 172.100.0.2
search us-east-2.compute.internal
удаляем файл resolv.conf с директории /etc:
sudo rm -f /etc/resolv.conf
создаем ссылку:
sudo ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf
проверяем:
$ ls -ln /etc/ | grep resolv lrwxrwxrwx 1 0 0 32 Oct 20 10:38 resolv.conf -> /run/systemd/resolve/resolv.conf drwxr-xr-x 4 0 0 4096 Sep 22 16:07 resolvconf
Символьная ссылка создалась. Иногда нужно перезапустить сервер чтоб изменения применились, а иногда работает без перезапуска.
Проверим резолвиться ли или нет:
$ dig dev.mysql.example.local +short ***************-cluster.cluster-ro-cslqcox3qst3.us-east-2.rds.amazonaws.com. ***************-cluster-instance-2.cslqcox3qst3.us-east-2.rds.amazonaws.com. 10.0.16.37
работает.