Ноутбук разработчика завершает соединение по тайм-ауту при подключении к приватной конечной точке RDS, хотя те же учётные данные работают с bastion-хоста. Ничего не упало. Пути между этим ноутбуком и базой данных не хватает одного из трёх: имени, которое разрешается, маршрута, который несёт трафик, или правила группы безопасности, которое пропускает источник, который база данных действительно видит. Выясните, чего не хватает, прежде чем менять два других.

Читайте отказ на правильном уровне

Тайм-аут — это не одна ошибка. Имя, которое не разрешается, отказывает раньше, чем пакет покидает машину. Адрес без маршрута отправляет пакеты в чёрную дыру. Отфильтрованный порт даёт ожидание, которое выглядит в точности как неверный хост. Выполняйте шаги по порядку и остановитесь на первом, который не пройдёт.

dig +short db.internal.example
nc -vz db.internal.example 5432

Если имя возвращает публичный адрес или ничего, туннель пока не проблема.

Если имя разрешается, а проверка порта зависает, сравните разрешённый адрес с адресом, который сообщает база данных. Управляемая конечная точка может разрешаться в приватный адрес внутри VPC и ни во что полезное снаружи, а адрес, скопированный из старого поиска, будет указывать на хост, который больше не отвечает.

Отделите туннель от маршрута

Подключение клиентского VPN не маршрутизирует автоматически каждый приватный диапазон. Профиль несёт маршруты, которые проталкивает служба, и клиент может установить только некоторые из них. Посмотрите, какие диапазоны клиент действительно добавил и попадает ли адрес базы данных в один из них.

ip route get 10.20.40.15
ip addr show tun0

Маршрут, указывающий на интерфейс туннеля, необходим; его недостаточно, потому что противоположная сторона всё ещё должна принять трафик.

Профили раздельного туннеля — обычный источник этого половинчатого отказа. Они работают для приложения, под которое профиль создан, и оставляют диапазон базы данных за пределами туннеля, что даёт ровно такой тайм-аут, какой дал бы межсетевой экран.

Согласуйте группу безопасности с реальным источником

Группа безопасности RDS пропускает источники, а не людей. В зависимости от архитектуры источником может быть пул клиентов VPN, приватный адрес bastion-хоста или адрес NAT, в который транслируется трафик. Читайте правило и фактический источник пакета вместе.

aws ec2 describe-security-groups --group-ids sg-0123456789abcdef0 \
  --query 'SecurityGroups[].IpPermissions'

Правило для домашнего адреса одного ноутбука — это проблема сопровождения, а не проект доступа.

Когда на пути стоит клиентский VPN или шлюз NAT, база данных может видеть адрес транслятора вместо адреса туннеля разработчика. Поэтому правило, скопированное с работающей настройки bastion-хоста, может не сработать для ноутбука: два пути приходят из разных источников, хотя оба выглядят внутренними.

Предпочитайте узкий путь широкому

Когда одному разработчику нужна одна база данных, перенаправление на основе сеанса часто дешевле в эксплуатации, чем полный сетевой туннель. Локальный клиент подключается к перенаправленному порту, а удалённый компонент устанавливает соединение с базой изнутри сети.

ssh -N -L 5432:db.internal.example:5432 bastion.internal.example

Сохраняйте проверку TLS нетронутой в такой схеме. Клиент по-прежнему должен сверять сертификат сервера с ожидаемым именем; локальный перенаправленный порт не причина отключать проверку, а её отключение скрывает ровно ту проблему идентичности, которую стоит поймать.

Выбор между полным туннелем и узким перенаправлением — решение об охвате, а не о театре безопасности.

Оставьте после себя повторяемый путь

Задокументируйте имя конечной точки вместо разрешённого адреса, диапазон источника, который пропускает группа безопасности, и роль базы данных, которую использует разработчик. Эти три факта объясняют большинство будущих сбоев без звонка. Добавьте и версию клиентского профиля, потому что изменение профиля может убрать маршрут, который несла старая.

Затем один раз проверьте отрицательный случай: клиент вне одобренного источника должен по-прежнему получать отказ.

Приватная база данных, которая работает только для того, кто её настроил, — не приватный доступ; это недокументированное исключение, ждущее, когда его снова обнаружат. Запишите путь, и следующий разработчик унаследует метод вместо загадки.

Похожие статьи