Jak mogę korzystać z tunelowania portów, aby połączyć się z prywatną instancją bazy danych za pośrednictwem bastionu sieciowego?

12

Mam bastion sieciowy, który jest publicznie dostępny example.compute-1.amazonaws.comi prywatną instancję bazy danych postgres wpostgres.example.us-east-1.rds.amazonaws.com:5432

Mogę użyć ssh do bastionu

$ ssh -i key.pem [email protected]

Potem, gdy jestem w bastionie, tworzę tunel ssh z:

$ ssh -i key.pem -L 5432:postgres.example.us-east-1.rds.amazonaws.com:5432 [email protected]

Następnie mogę sprawdzić, czy tunel działa, łącząc się z bazą danych z bastionu za pomocą localhost:

$ psql -p 5432 -h localhost -U postgres

Nie mogę jednak połączyć się z bazą danych zdalnie (bez bastionu).

$ 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?

Skonfigurowałem grupę zabezpieczeń bastionu, aby akceptowała ruch przychodzący na porcie 5432.

Czy używam ssh -Lpoprawnie? Czy powinienem używać go poza bastionem? Wszelkie porady będą mile widziane.

Snubber
źródło

Odpowiedzi:

20

Podczas tworzenia tunelu SSH nie ujawnia on otwartego portu zewnętrznemu światu. Otwarty port jest dostępny tylko jako localhost. Tak skutecznie zrobiliście, tworząc tunel z bastionu, do bastionu.

Zamiast tego chcesz utworzyć tunel z komputera lokalnego przez bastion.

Tak więc tunel tworzysz jako część połączenia z komputera lokalnego do bastionu . Nie musisz tworzyć kolejnego połączenia SSH.

Więc lokalnie wykonałeś:

$ ssh -i key.pem -L 5432:postgres.example.us-east-1.rds.amazonaws.com:5432 [email protected]

Zakładając, że postgres.example.us-east-1.rds.amazonaws.com rozwiązuje problem z prywatnym adresem IP.

Następnie, aby połączyć się z serwerem, nadal lokalnie, połącz się tak, jakby serwer był lokalny:

$ psql -p 5432 -h localhost -U postgres

Robiąc to, nie musisz używać monitu na bastionie.

Matt Houser
źródło
To zadziałało dla mnie, dzięki! Jedyną rzeczą, o której zapomniałem dla każdego, kto używa komendy psql, po prostu tam się zawiesza: Upewnij się, że twoja grupa db db pozwala na dostęp z bastionu.
Goran
-1

To zadziałało dla mnie. Upewnij się, że masz klienta psql zainstalowanego lokalnie.

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

Tworząc instancję db w aws, pamiętaj, aby zdefiniować następujące elementy:

  1. Nazwa Użytkownika
  2. hasło
  3. nazwa bazy danych
  4. numer portu

Musiałem także utworzyć grupę zabezpieczeń dla VPC, w której znajdowała się baza danych. Po utworzeniu upewnij się, że instancja db używa tego dla swojej grupy zabezpieczeń. Grupa bezpieczeństwa ma następujące zasady:

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
źródło
Ale to nie przechodzi przez bastion, prawda? Po prostu
łączysz się
Przechodzi przez vpc, przez które jest wystawiona instancja rds. Dołączasz vpc do instancji rds podczas tworzenia.
timxor
Tak, myślę, że pierwotne pytanie dotyczyło przejścia przez serwer bastionu w VPC, więc instancja RDS nie jest publicznie ujawniona (tak to czytam)
RhysC
To nie było pytanie, a twoja odpowiedź wcale nie pomaga w rozwiązaniu problemu.
Radko Dinev,