Назад | Перейти на главную страницу

Как я могу использовать туннелирование портов для подключения к экземпляру частной базы данных через сетевой бастион?

У меня есть сетевой бастион, который общедоступен по адресу example.compute-1.amazonaws.com и частный экземпляр базы данных postgres по адресу postgres.example.us-east-1.rds.amazonaws.com:5432

Я могу войти в бастион по ssh, используя

$ ssh -i key.pem ec2-user@example.compute-1.amazonaws.com

Затем, когда я нахожусь в бастионе, я создаю туннель ssh с помощью:

$ ssh -i key.pem -L 5432:postgres.example.us-east-1.rds.amazonaws.com:5432 ec2-user@example.compute-1.amazonaws.com

Затем я могу проверить, что туннель работает, подключившись к базе данных из бастиона с помощью localhost:

$ psql -p 5432 -h localhost -U postgres

Однако я не могу подключиться к базе данных удаленно (не находясь в бастионе).

$ psql -p 5432 -h example.compute-1.amazonaws.com -U postgres
psql: could not connect to server: Connection refused
Is the server running on host "example.compute-1.amazonaws.com" () and accepting
TCP/IP connections on port 5432?

Я настроил группу безопасности бастиона для приема входящего трафика на порт 5432.

Я использую ssh -L правильно? Стоит ли использовать его вне бастиона? Любые советы будут высоко ценится.

Когда вы создаете туннель SSH, он не открывает открытый порт внешнему миру. Открытый порт доступен только как localhost. По сути, вы построили туннель от своего бастиона к своему бастиону.

Вместо этого вы хотите создать туннель с локального компьютера через бастион.

Итак, вы создаете свой туннель как часть вашего подключения с вашего локального компьютера на ваш бастион. Вам не нужно создавать другое SSH-соединение.

Итак, локально вы должны выполнить:

$ ssh -i key.pem -L 5432:postgres.example.us-east-1.rds.amazonaws.com:5432 ec2-user@example.compute-1.amazonaws.com

Предполагая, что postgres.example.us-east-1.rds.amazonaws.com преобразуется в частный IP-адрес.

Затем, чтобы подключиться к вашему серверу, все еще локально, подключитесь, как если бы сервер был локальным:

$ psql -p 5432 -h localhost -U postgres

При этом нет необходимости использовать подсказку на вашем бастионе.

Это сработало для меня. Убедитесь, что у вас есть клиент psql установлен локально.

psql --host=myAwsDbEndpointUrl.ciqykqusf0nv.us-west-1.rds.amazonaws.com --port=5432 --username=myUserName --password --dbname=myDbName

При создании экземпляра db на aws обязательно определите следующее:

  1. имя пользователя
  2. пароль
  3. имя базы данных
  4. номер порта

Мне также пришлось создать группу безопасности для VPC, в котором находилась база данных. После ее создания убедитесь, что ваш экземпляр db использует ее для своей группы безопасности. В группе безопасности действуют следующие правила:

inbound--> type:PostgreSQL, protocol:TCP port range:5432, source:0.0.0.0/0

outbound--> type:All Traffic, protocol:All, port range:all, destination:0.0.0.0/0