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

12

У меня есть сетевой бастион, который общедоступен в 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правильно использую ? Должен ли я использовать его за пределами бастиона? Любые советы будут высоко ценится.

снеббер
источник

Ответы:

20

Когда вы создаете туннель 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: убедитесь, что ваша группа безопасности db разрешает доступ из бастиона.
Горан
-1

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

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

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

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

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

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
timxor
источник
Это не проходит через бастион, правда? Вы просто подключаетесь напрямую к RDS
RhysC
Он проходит через vpc, через который открывается экземпляр rds. Вы присоединяете vpc к экземпляру rds при создании.
Тимксор
Да, я думаю, что первоначальный вопрос касался прохождения через бастионный сервер в VPC, поэтому экземпляр RDS не был открыт для общественности (ну, вот как я его прочитал)
RhysC
Это был не вопрос, и ваш ответ не помогает решить проблему вообще.
Радько Динев